SPARTA 과제/SPRING

유저 입력 검증

kjw81024 2026. 2. 4. 16:41

유저 입력 검증 수행

Schedule 을 POST 하는 과정에서 찾은 문제들을 적어봤습니다. 순서대로 한 번 확인해보겠습니다.

 

1. name 과 writer 가 공백으로 주어져도 스케줄이 생성됨

2. 무슨 필드에서 문제가 있는지 확인할 수 없음

3. 제목을 사용자가 지키지 않았음에도 500 오류로 발생

 

예시사진

더보기
1
2
3

아래에 어노테이션을 다 가져와서 쓰는걸 했더니 길중님이 그렇게 하면 안 된대요 (방법 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차 결과 확인

name 이 공백
name 이 null

 

정상적으로 작동함을 확인할 수 있습니다. 

 

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