🌱 [ 문제 상황 ]

- 회원가입을 할 때, 성별(Gender)을 입력 해야 합니다.
- 성별의 타입은 Enum 타입 입니다. ( "FEMALE", "MALE" )
- 성별에 바인딩 되지 않는 값( "test")은 Json parse 실패 합니다.
- 잘못된 성별을 입력 했을때 성별을 잘못 입력 했다고 알려줄 수 없을까요?
🌱 [ 해결 방안 ]
- 잘못된 Json 값을 null로 바인딩 하자.
- 검증을 도입 하여 null 혹은 잘못된 값일 경우, 예외 메시지를 전달 하자.
🌱 [ 잘못된 값은 null로 바인딩 하자 ]
- 잘못된 값이 생겼을 경우 바인딩에 실패 하며 Json parse 실패 문구를 보게 됩니다.
- 잘못된 값은 null로 바인딩 해보겠습니다.
📝 [ @JsonCreator ]
- Json 데이터를 String to Enum 으로 바꾸어주는 어노테이션 입니다.
- Jackson이 객체를 생성하고 필드를 채워 줍니다.

[ 불편한 점 ]
- Enum 타입 마다 어노테이션을 통해 반복 잡업이 필요 합니다.
- 현재 검증 Enum 타입이 2개 이기 때문에 사용 하지만 많다면 다른 방법을 찾아 보아야 합니다.
🌱 [ 빈 검증 ]

- 스프링은 Bean Validation을 통해 간단한 값을 검증할 수 있습니다.
- Enum 타입은 빈 검증이 제공 되지 않습니다. 따라서 Custom Validator를 만들어 검증 해야 합니다.
- 빈 검증이 어떻게 이루어 지는지 알아보고 Validator를 만들어 보겠습니다.
📝 @NotBlank

Constraint( ValidatedBy = {} ) 검증기를 사용해 해당 필드를 검증 합니다.
현재 검증기는 없지만 실제 동작 시 Hibernate Validator 사용 됩니다.
📝 NotBlankValidator

Hibernate Validator 등록된 NotBlankValidator 입니다.
값이 null 아니고, 공백을 제거한 길이가 0 보다 크다면 검증에 성공 합니다.
🌱 [ Enum 어노테이션 ]

커스텀 어노테이션을 작성 합니다.
- @Constraint = 실제 검증 클래스
- @Target = 어노테이션 적용 대상 ( 현재는 필드에만 사용 하므로 필드만 )
- @Retention = 어노테이션 생명 주기 ( 실행 환경에서도 동작 해야 하므로 Runtime )
Constraint 어노테이션은 추가로 작성 해야 하는 부분이 있습니다.
- message = 검증에 실패 하였을때 메시지를 나타냅니다.
- groups = 검증 그룹을 지정 합니다. 만약 경우에 따라 검증을 다르게 하고 싶을때 사용 합니다.
- payload = 추가 정보를 위해 지정하며 로그나 심각도를 나타냅니다.
🌱 [ EnumValidator ]

- Enum 어노테이션이 붙은 필드는 EnumValidator 동작
- 어떤 Enum 타입이 들어 올지 모르므로 Enum 타입으로 검증
검증 과정에는 리플랙션을 사용 합니다.
리플랙션( Reflection )이란?
실행 환경에서 객체 내부를 들여다 보고 클래스, 메서드, 필드의 메타 데이터를 얻거나 조작 하여
동적으로 분석하고 사용하는 기능 입니다.
- 검증 하고자 하는 Enum 값을 value로 받습니다.
- value로 부터 메타 데이터를 얻습니다. getDeclaringClass는 클래스에 대한 메타 데이터 입니다.
- getEnumConstants를 통해 Enum 클래스의 모든 열거형 상수를 배열로 반환 합니다.
- contains를 통해 입력 받은 값이 열거형 상수에 포함 되는지 확인 합니다.
🌱 [ 테스트 ]


검증에 실패할 경우 MethodArgumentNotValidException 예외가 발생 합니다.
해당 예외는 검증에 실패한 필드, 메시지를 BindingResult에 포함하여 예외를 반환 합니다.
Enum Json parse를 null로 바꾸고 검증기를 만들어 잘못된 값을 표기 할수 있도록 하였습니다.
'Spring' 카테고리의 다른 글
| @Async 메일 전송 개선하기 (0) | 2025.09.06 |
|---|---|
| [ Spring ] Swagger 415 Unsupported Media Type (0) | 2025.08.04 |
| [Spring] @ExceptionHandler API 에러 핸들링 (3) | 2024.09.06 |
| [Spring] 필터, 인터셉터 (Interceptor) (0) | 2024.09.05 |
| [Spring] 쿠키, 세션 (Cookie, Session) (0) | 2024.09.04 |