<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>입력 검증 on 얼쑤 · Team Edo</title><link>https://team-edo.github.io/tags/%EC%9E%85%EB%A0%A5-%EA%B2%80%EC%A6%9D/</link><description>Recent content in 입력 검증 on 얼쑤 · Team Edo</description><generator>Hugo</generator><language>ko-kr</language><lastBuildDate>Wed, 28 Oct 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://team-edo.github.io/tags/%EC%9E%85%EB%A0%A5-%EA%B2%80%EC%A6%9D/index.xml" rel="self" type="application/rss+xml"/><item><title>96.7 BPM이 96으로 바뀐 이유</title><link>https://team-edo.github.io/posts/2026/10/strict-json-input-types/</link><pubDate>Wed, 28 Oct 2026 00:00:00 +0900</pubDate><guid>https://team-edo.github.io/posts/2026/10/strict-json-input-types/</guid><description>&lt;p>연습 세션을 시작할 때 앱은 곡과 템포를 서버에 보냅니다. 템포는 JSON 정수만 받기로 했는데, 리뷰 중 &lt;code>&amp;quot;bpm&amp;quot;: 96.7&lt;/code>을 보냈더니 서버는 &lt;strong>96 BPM으로 처리하고 HTTP 201&lt;/strong>을 돌려줬습니다. 숫자가 허용 범위에 드는지는 검사했지만, 그 전에 소수점이 사라졌습니다.&lt;/p>
&lt;h2 id="검증기에-도착한-값은-이미-정수였다">검증 전에 정수로 바뀐 BPM&lt;/h2>
&lt;p>당시 프로젝트의 Jackson 3.1.5 설정으로 입력 모양을 바꿔 봤습니다. 정수 칸에 보낸 문자열 &lt;code>&amp;quot;96&amp;quot;&lt;/code>도 96이 됐고, 문자열이어야 하는 곡 ID에는 숫자 7을 보내도 &lt;code>&amp;quot;7&amp;quot;&lt;/code>이 됐습니다. 불리언 칸에 보낸 1은 &lt;code>true&lt;/code>가 됐습니다.&lt;/p></description></item><item><title>악보 이벤트 오타가 음표 번호를 밀면</title><link>https://team-edo.github.io/posts/2026/10/reject-unknown-score-event-kind/</link><pubDate>Wed, 28 Oct 2026 00:00:00 +0900</pubDate><guid>https://team-edo.github.io/posts/2026/10/reject-unknown-score-event-kind/</guid><description>&lt;p>얼쑤는 악보에서 음표를 골라 번호를 매기고, 앱이 지정한 시작 번호와 끝 번호로 연습 구간을 자릅니다. 쉼표는 악보의 시간에는 영향을 주지만 번호를 매기는 음표 목록에는 들어가지 않습니다. 저장된 이벤트를 읽을 때는 그래서 &lt;code>kind&lt;/code>가 &lt;code>NOTE&lt;/code>인 항목만 골랐습니다.&lt;/p>
&lt;p>이 필터에는 한 가지 가정이 있었습니다. &lt;code>NOTE&lt;/code>가 아닌 항목은 모두 알고 있는 다른 이벤트라는 가정입니다. 실제로는 &lt;code>Note&lt;/code>라는 오타도 같은 방식으로 빠집니다. 중간 음표 하나가 빠진 뒤에도 요청 범위가 남은 음표 수 안에 있다면, 뒤의 번호는 하나씩 밀리고 서버는 다른 음을 골라 응답할 수 있습니다.&lt;/p></description></item><item><title>형식이 맞는 날짜가 500을 낸 이유</title><link>https://team-edo.github.io/posts/2026/10/reject-out-of-range-calendar-dates/</link><pubDate>Wed, 28 Oct 2026 00:00:00 +0900</pubDate><guid>https://team-edo.github.io/posts/2026/10/reject-out-of-range-calendar-dates/</guid><description>&lt;p>얼쑤의 연습 통계 API는 시작일과 종료일을 받아 해당 기간의 연습 시간과 횟수를 돌려줍니다. 요약 API는 바로 앞 기간의 통계도 함께 제공합니다. 두 날짜를 Spring의 &lt;code>@DateTimeFormat(iso = ISO.DATE)&lt;/code>로 받아 &lt;code>LocalDate&lt;/code>로 변환했습니다. 그러면 &lt;code>2026/10/01&lt;/code>처럼 형식이 어긋난 날짜는 컨트롤러가 실행되기 전에 400으로 거절됩니다.&lt;/p>
&lt;p>리뷰에서 날짜 형식 검사를 통과하는 값이 500을 냈습니다. 요약 API에 시작일과 종료일을 모두 **&lt;code>-999999999-01-01&lt;/code>**로 보내면 두 값은 &lt;code>LocalDate&lt;/code>로 변환됐습니다. 길이도 하루여서 기존 기간 제한을 통과했습니다. 직전 기간을 구하려고 시작일에서 하루를 빼는 순간 &lt;code>LocalDate&lt;/code>의 범위를 벗어났고, &lt;code>DateTimeException&lt;/code>이 500으로 이어졌습니다.&lt;/p></description></item></channel></rss>