Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- react-slick
- JSON.parse
- javacript
- 중첩 구조 분해
- nestjs
- 구조 분해 할당
- 카카오로그인
- nodemailer
- nextjs
- context switch
- 위크맵
- JavaScript
- DB
- 로그스태시
- logstash
- nest
- 자바스크립트
- 이메일 전송
- 참조에 의한 객체 복사
- Mongoose
- TypeScript
- 화살표 함수
- 캐러셀
- JSON.stringify
- Map
- AGGREGATE
- MongoDB
- 객체
- 카카오 소셜로그인
- 위크셋
Archives
- Today
- Total
뚜sh뚜sh
Custom Validation Annotation 만들기 본문
package qt.qr_backend.annotation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = EnumValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidEnum {
String message() default "Invalid value. This.is not permitted";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends java.lang.Enum<?>> enumClass();
}
message 메서드
- 어노테이션이 유효하지 않을 때 출력할 오류 메시지를 반환하는 역할
- 주로 사용자에게 오류에 대한 설명을 제공하기 위해 활용됨
- 이 메서드를 정의하지 않으면 기본 오류 메시지가 사용됨
group 메서드
- 어노테이션을 어떤 검증 그룹에 속하게 할 지를 지정하는 데 사용됨
- Bean Validation에서는 검증 그룹을 정의하여 특정 상황에만 어노테이션을 검사할 수 있도록 할 수 있음
- 만약 특정 검증 그룹에 어노테이션을 속하게 하려면 이 메서드를 정의하고 해당 그룹을 반환해야 함
- 그룹을 사용하지 않는 경우 빈 배열({})을 반환하면 됨
payload 메서드
- 어노테이션과 관련된 메타데이터 정보를 제공하는 데 사용됨
- 주로 사용자 정보의 어노테이션의 특별한 용도에 맞게 활용됨
- 일반적으로 사용하지 않는 경우 빈 배열({})을 반환하면 됨
enumClass 메서드
- 어노테이션을 사용할 때 사용자가 지정해야 하는 값으로, 어떤 Enum 클래스를 유효성 검사의 대상으로 할 것인지를 나타냄
- Class 타입의 반환값을 가지며, 이 반환값은 어떤 Enum 클래스를 지정하는 데 사용됨
- <? extends java.lang.Enum<?>>는 모든 Enum 클래스를 다룰 수 있도록 하는 와일드카드(wildcard) 형태로 표현되어 있으며, 어떤 Enum 타입도 받을 수 있음을 의미함
@Constraint
- 자바 표준 검증인 Bean Validation에서 사용되는 애노테이션 중 하나
- 커스텀 유효성 검사 애노테이션을 정의할 때 사용
- 속성
- 'validatedBy' : 해당 유효성 검사 애노테이션이 어떤 검증기(validator) 클래스에 의해 처리되는 지를 지정함, 이 클래스는 'ConstraintValidator' 인터페이스를 구현해야 함
@Target
- 자바 어노테이션을 어떤 요소에 적용할 수 있는 지를 지정하는 데 사용됨
- 'ElementType' 열거형을 인수로 받음
- ElementType 예시
- ElementType.TYPE: 클래스, 인터페이스, 열거형 등의 선언에 적용 가능
- ElementType.FIELD: 필드(멤버 변수)에 적용 가능
- ElementType.METHOD: 메서드에 적용 가능
- ElementType.PARAMETER: 매개 변수에 적용 가능
- ElementType.CONSTRUCTOR: 생성자에 적용 가능
- ElementType.LOCAL_VARIABLE: 지역 변수에 적용 가능
- ElementType.ANNOTATION_TYPE: 어노테이션 타입(다른 어노테이션에 대한 어노테이션)에 적용 가능
- ElementType.PACKAGE: 패키지 선언에 적용 가능
@Retention
- 자바 어노테이션이 어느 시점까지 유지되어야 하는 지를 지정하는 데 사용됨
- 'RetentionPolicy' 열거형을 인수로 받음
- RetentionPolicy 예시
- RetentionPolicy.SOURCE: 어노테이션은 컴파일 시간에만 유효하며 클래스 파일에는 포함되지 않음, 따라서 런타임 시에는 어노테이션 정보를 사용할 수 없음
- RetentionPolicy.CLASS: 어노테이션은 클래스 파일에는 포함되지만, 런타임 시에는 유효하지 않음, 즉, 어노테이션 정보는 런타임 시에는 제공되지 않음
- RetentionPolicy.RUNTIME: 어노테이션은 컴파일된 클래스 파일에 포함되며, 런타임 시에도 유효함, 이 옵션을 선택하면 어노테이션 정보를 런타임 시에 반영할 수 있음
package qt.qr_backend.annotation;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class EnumValidator implements ConstraintValidator<ValidEnum, Enum> {
// 'ValidEnum' 어노테이션의 정보를 저장하기 위한 멤버 변수
private ValidEnum annotation;
// 유효성 검사 클래스가 초기화될 때 호출됨
@Override
public void initialize(ValidEnum constraintAnnotation) {
this.annotation = constraintAnnotation;
}
// 실제 유효성 검사를 수행하는 메서드
// value는 검사 대상 값
@Override
public boolean isValid(Enum value, ConstraintValidatorContext context) {
boolean result = false;
Object[] enumValues = this.annotation.enumClass().getEnumConstants();
if (enumValues != null) {
for (Object enumValue : enumValues) {
if (value.equals(enumValue)) {
result = true;
break;
}
}
}
return result;
}
}
- 커스텀 어노테이션 '@ValidEnum'을 지원하기 위한 유효성 검사 클래스임
- 'ConstraintValidator<어노테이션 타입, 검사 대상 필드의 타입>' 인터페이스를 구현하여 실제 유효성 검사 로직 구현
'Framework > Spring' 카테고리의 다른 글
Spring 예외 처리 구현 (2) | 2024.01.31 |
---|---|
Spring Security로 비밀번호 암호화 하기 (0) | 2024.01.27 |
[ERROR] 컨트롤러에서 JSON으로 데이터 반환할 때 406 에러 발생 (0) | 2024.01.26 |
@NotNull과 @NotEmpty, @NotBlank의 차이점 (0) | 2024.01.17 |
로그에 color 적용하기 (0) | 2023.12.09 |
Comments