유저 입력 검증 수행
Schedule 을 POST 하는 과정에서 찾은 문제들을 적어봤습니다. 순서대로 한 번 확인해보겠습니다.
1. name 과 writer 가 공백으로 주어져도 스케줄이 생성됨
2. 무슨 필드에서 문제가 있는지 확인할 수 없음
3. 제목을 사용자가 지키지 않았음에도 500 오류로 발생
예시사진



아래에 어노테이션을 다 가져와서 쓰는걸 했더니 길중님이 그렇게 하면 안 된대요 (방법 2)
방법 1
1. Validation 검사를 하는 class 를 분리하고 Controller 에 가져오기
길이 제한도 있는 경우를 위해 함수를 2개 만들었어요
import com.example.schedule.Exception.BlankFieldException;
import com.example.schedule.Exception.OverLengthException;
import org.springframework.stereotype.Component;
@Component
public class ValidateString {
void validateNullableAndLength(String str, int length) {
if (str == null || str.isBlank()) {
throw new BlankFieldException();
}
if (str.length() > length) {
throw new OverLengthException();
}
}
void validateNullable(String str){
if (str == null || str.isBlank()) {
throw new BlankFieldException();
}
}
}
2. Controller 에 ValidateString 을 가져와주고 알맞게 사용해줍니다.
private final ValidateString v;
@PostMapping("/schedules")
ResponseEntity<CreateScheduleResponse> createSchedule (@RequestBody CreateScheduleRequest request){
v.validateNullableAndLength(request.getName(), 30);
v.validateNullableAndLength(request.getContents(), 200);
v.validateNullable(request.getWriter());
v.validateNullable(request.getPw());
CreateScheduleResponse response = scheduleService.save(request);
return ResponseEntity.status(HttpStatus.CREATED).body(response);
}
방법 2
어노테이션으로 제한이 가능한듯 하다.
https://dreamcoding.tistory.com/145
@NotNull, @NotEmpty, @NotBlank의 차이점과 사용법
Spring Boot 애플리케이션을 개발할 때 입력 값의 유효성을 검증하는 것은 중요한 과정입니다. 이를 위해 자주 사용하는 어노테이션 중 하나가 Bean Validation에서 제공하는 @NotNull, @NotEmpty, @NotBlank입
dreamcoding.tistory.com

에러를 검색해봤더니 SpringBoot 버전에 따라 validation 패키지를 다르게 사용해야한다고 합니다.
현재 사용하고 있는 Spring Boot 의 버전이 4.0.2 이므로 3.x 버전 이후 package 인 jakarta package 로 사용해야합니다.

여전히 오류가 발생해서 더 찾아보니 검증기능을 사용하려면 의존성을 더해줘야한다고 합니다. ...

의존성을 추가해줬는데 해당 의존성을 찾을 수 없다고 뜨네요....... 찬찬히 읽어봤더니 그냥 오타였습니다.
implementation 'org.springframework.boot:spring-boot-starter-validation'
https://hyeri0903.tistory.com/275
[Spring] Springboot 버전에 따른 validation 패키지 (org.hibernate.validator.constraints does not exist)
목차 1. javax와 jakarta package 의 Validation이슈 내용Springboot 2.x 버전에서 Springboot 3.x 버전으로 업데이트한 뒤 Validation 관련 어노테이션을 적용할 때 에러가 발생하였습니다.에러 메시지package org.hi
hyeri0903.tistory.com
여기까지 적다가 너무 많이 건드리면 다시 돌이킬 수 없다는걸 알기에... branch 를 분리했어요

validation 바꾼다고 branch 도 validation 해줬어요... 우리 친해지자
다시 해보겠습니당
1. build.gradle 에 의존성 추가해주기
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. DTO에 validation validation 해주기
DTO 에 추가해주는 이유는... column 은 DB를 만드는 역할이니까 박스 만들면서 null, 빈칸인지 확인해주고싶었어요
import jakarta.validation.constraints.NotBlank;
3. validation 이 필요한 컬럼 위에 annotation 추가
@Column(length = 30, nullable = false)
@NotBlank(message = "스케줄 제목이 꼭 필요해요.")
private String name;
#이후 다른 DTO 에도 작성자, pw 등 필요한 컬럼 위에 NotBlank annotation 붙이기
4. 해당 validation 을 수행하라고 Controller 에게 시키기
@PostMapping("/schedules")
ResponseEntity<CreateScheduleResponse> createSchedule (@Valid @RequestBody CreateScheduleRequest request){
CreateScheduleResponse response = scheduleService.save(request);
return ResponseEntity.status(HttpStatus.CREATED).body(response);
}
5. 1차 결과 확인


정상적으로 작동함을 확인할 수 있습니다.
3번 오류도 validation 으로 간단하게 400오류를 뱉을 수 있기때문에 이어서 해주겠습니다.
6. validation 으로 최대 길이를 지정해줍니다.
@Max annotation 도 아래처럼 jakarta.validation.constraints 에 존재합니다.
import jakarta.validation.constraints.Max;
@Size(max = 100)
@NotBlank(message = "댓글 내용이 꼭 필요해요..")
private String contents;
7. 2차 결과 확인

트러블슈팅
<1> String 길이 제한 어노테이션
처음에 길이제한을 @Max(200) 형태로 사용했더니 크기가 맞는데도 오류가 발생

아래 접은글은 오류코드
2026-02-04T16:24:36.559+09:00 WARN 12596 --- [schedule] [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in org.springframework.http.ResponseEntityhttp://m.example.schedule.dto.scheduleDto.CreateScheduleResponse> com.example.schedule.controller.ScheduleController.createSchedule(cohttp://m.example.schedule.dto.scheduleDto.CreateScheduleRequest) with 2 errors: [Field error in object 'createScheduleRequest' on field 'contents': rejected value [타코 츄르 챙겨주기]; codes [Max.createScheduleRequest.contents,Max.contents,Max.java.lang.String,Max]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [createScheduleRequest.contents,contents]; arguments []; default message [contents],200]; default message [너무 길어요..]] [Field error in object 'createScheduleRequest' on field 'name': rejected value [냐냐냥]; codes [Max.createScheduleRequest.name,Max.name,Max.java.lang.String,Max]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [createScheduleRequest.name,name]; arguments []; default message [name],30]; default message [너무 길어요..]] ]
해석해보니 Max 는 숫자를 대상으로 해당 숫자가 넘는지를 확인함
예를들어 age를 입력할때 @Max(100) 하면 100살보다 큰 값이 age 로 들어오면 오류를 출력하는 형식
String 의 길이를 확인하는 어노테이션은 @Size(max = 200) 형태
다시 정상적으로 출력된다.

<2> Postman 에 어느 필드가 잘못되었는지 메시지 출력
아무리... message 를 보내도 postman 에는 출력이 안 되네요
https://dev-gorany.tistory.com/369
[Spring Boot] API Error message가 나오지 않을 때
specification] spring boot - 2.6.3 서론 API를 만들면 종종 Exception이 발생하기 마련이다. Client에서 요청을 했는데, 예외가 발생했을 때 구체적이고 명시적으로 어떤 에러, 무엇 때문에 발생했는지를 "messa
dev-gorany.tistory.com
위를 참고하여 application.properties 에 한 줄만 추가하니까 정상적으로 message 가 출력됩니다. ...
SpringBoot 버전이 올라가면서 정보 보호 때문에 막아뒀다고 해서 해당 부분을 풀어줬습니다.
spring.web.error.include-message=always
갑자기 귀찮아져서,,, 그냥 빈칸이라 오류난건지, 길이 초과로 오류났는지만 출력했어요

다만 throw 로 반환되는 Exception message 다 보니까 name 에서 문자열 길이 초과 오류가 발생하면, 아래에 writer 가 공백이어도 해당 부분은 알 수 없습니다...
숙련주차가서 더 배운다고 하셨으니 여기까지...
튜터님께 여쭤봤더니 Handler 를 만들어서 처리해주면 어떤 객체 형태로 반환할건지 설정할 수 있다고 알려주셨습니다..
,,,, 핑계지만 시간이 너무 없기도 하고 아직 너무 안 배운거를 쓰는게 무섭기도 해서 이후에 구현해보는걸로
<3> ValidateString
Validate 객체가 null 일수도 있다는 이유로 NullPointerException 이 발생
private ValidateString v;

객체를 만든게 아니라서 오류가 발생
객체 만드는 방법1: 내가 만들기
private ValidateString v = new ValidateString();
객체 만드는 방법2: Spring 한테 만들어달라고 하기
@Component
public class ValidateString
'SPARTA 과제 > SPRING' 카테고리의 다른 글
| 숙련) 일정관리앱 트러블슈팅 (1) (0) | 2026.02.11 |
|---|---|
| 숙련) 일정관리앱 업그레이드 초기설정 (1) | 2026.02.10 |
| Schedule README (0) | 2026.02.05 |
| 댓글 기능 구현, 정렬 (0) | 2026.02.04 |
| 기본 DTO 작성 (0) | 2026.02.03 |