ETC/1. Today I Learned

[Spring] Validation

montmer27 2026. 1. 7. 22:19

Validation 의 의미

특정 데이터의 값이 유효한지 확인하는 단계

유효하다 : 시스템이 미리 정의한 사양에 부합한다.

→ HTTP 요청이 정상인지 검증하는 것이 컨트롤러의 주 역할

 

구체적 역할

  • 검증을 통해 적절한 메시지를 유저에게 보여주어야 함
  • 검증 오류로 인해 정상적인 동작이 끊기면 안 됨
  • 사용자가 입력한 데이터는 항상 유지되어야 함

 검증의 종류

프론트엔드 검증

  • 보안에 취약하지만 필수
  • 유저 사용성 증가

서버 검증

  • 프론트없이 사용할 경우 유저 사용성 저하
  • API 스펙 정의 → Validation 오류를 Response 예시에 남겨주어야 함
    • API 명세서 작성 중요

데이터베이스 검증

  • Not Null, Default와 같은 제약 조건 설정
  • 최종 방어선의 역할 수행

Bean Validation

의미 : 검증 로직을 어노테이션으로 표현하는 기술. 

효과 : 모든 필드를 일일이 if문으로 검사하지 않고도 편하고 직관적으로 데이터를 검증할 수 있다.

 

의존성
implementation 'org.springframework.boot:spring-boot-starter-validation'

 

Bean Validation 코드 예시
public class SaveMemberRequestDto {
    
    @NotBlank  // 1. "값이 꼭 있어야 해요!" (null, "", " " 모두 거부)
    private String name;
    
    @Email     // 2. "이메일 형식이어야 해요!" (xxx@xxx.xxx)
    private String email;
    
    @Size(min = 8, max = 20)  // 3. "8~20자 사이여야 해요!"
    private String password;
    
    @Min(19)   // 4. "최소 19 이상이어야 해요!"
    private Integer age;
    
    @Pattern(regexp = "^010-\\d{4}-\\d{4}$")  // 5. "이 패턴과 일치해야 해요!"
    private String phone;
}

 

자주 사용되는 Validation 어노테이션
@NotBlank`: 공백이 아닌 문자가 1개 이상 (null, "", " " 모두 거부)
@Email`: @가 포함된 이메일 형식
@Size`: 문자열 길이나 컬렉션 크기 제한
@Min/@Max`: 숫자의 최소/최대값
@Pattern`: 정규표현식 패턴 (전화번호, 주민번호 형식 등)

 

에러 메시지 커스터마이징 - message 사용
// 직접 작성
@NotBlank(message = "이름을 입력해주세요!")
private String name;

// 다른 옵션값 포함 가능
@Size(min = 8, message = "비밀번호는 {min}자 이상이어야 합니다")
private String password;

 

컨트롤러에서 검증 실행
@RestController
public class MemberController {
    
    // @Valid만 붙이면 자동으로 검증 실행!
    @PostMapping("/signup")
    public String signup(@Valid @RequestBody SaveMemberRequestDto request) {
        // ...
        return "가입이 완료되었습니다.";
    }
}
@Getter
public class SaveMemberRequestDto {

    @NotBlank  // 1. "값이 꼭 있어야 해요!" (null, "", " " 모두 거부)
    private String name;

    @Email(message = "올바른 이메일 형식이 아닙니다.")     // 2. "이메일 형식이어야 해요!" (xxx@xxx.xxx)
    private String email;

    @Size(min = 8, max = 20)  // 3. "8~20자 사이여야 해요!"
    private String password;

    @Min(19)   // 4. "최소 19 이상이어야 해요!"
    private Integer age;

    @Pattern(regexp = "^010-\\d{4}-\\d{4}$")  // 5. "이 패턴과 일치해야 해요!"
    private String phone;
}