요즘 자바에선, 스프링에선 annotation에 대해서 많이 사용이 되고 없이는 개발이 많이 불편한 시대가 되어버렸다.
이전 포스팅에서 annotation에 대해서 많이 다뤘으니 참고를 하는것도 도움이 될것이다.
이번 포스팅에서는 aop를 사용할때 필자가 사용했던 custom annotation을 설명하려고 한다.
aop 에 대한 내용 역시 아래 참고 포스팅을 참고하길 바란다.(pointcut에 annotation 설정하는 경우)
annotation은 일단 interface 로 작동을 하게 된다. interface로 선언을 하니 당연한 내용이다.
그리고 annotation을 만들 interface를 만들어준다.
@Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.FIELD, ElementType.PARAMETER}) @Documented @Inherited @Constraint(validatedBy = ValidTest.class) public @interface Testanno { String value() default ""; String message() default ""; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; } |
해당 인터페이스의 인자를 하나하나 설명하면 일단 annotation 이름은 Testanno이다.
Retention
파일러가 어노테이션을 다루는 방법을 기술, 어느 시점까지 영향을 미치는지를 결정
RetentionPolicy.SOURCE : 컴파일 전까지만 유효
RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
RetentionPolicy.RUNTIME : 컴파일 이후 런타임 시기에도 JVM에 의해 참조가 가능(리플렉션)
Target
어노테이션 적용할 위치 선택
ElementType.PACKAGE : 패키지 선언
ElementType.TYPE : 타입 선언
ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElementType.CONSTRUCTOR : 생성자 선언
ElementType.FIELD : 멤버 변수 선언
ElementType.LOCAL_VARIABLE : 지역 변수 선언
ElementType.METHOD : 메서드 선언
ElementType.PARAMETER : 전달인자 선언
ElementType.TYPE_PARAMETER : 전달인자 타입 선언
ElementType.TYPE_USE : 타입 선언
Documented
@Documented : 해당 어노테이션을 Javadoc에 포함시킴
@Inherited : 어노테이션의 상속을 가능하게 함
@Repeatable : Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 함
Inherited
부모 클래스에 해당 Annotation이 선언됐다면 자식클래스에게도 상속시킨다.
Constraint
여기서 지정하는 설정은 어떤 검증 클래스를 사용해서 필드의 값을 검증할 건지 지정해준다.
현재는 ValidTest로 되어있는 class의 규칙을 지킨다는 의미이다.
클래스는 아래와 같다.
public class ValidTest implements ConstraintValidator<Testanno, Object> { @Override public void initialize(ProductConstraint annotation) { // annotation에 있는 정보를 멤버변수로 저장해서 isValid()에서 사용할 수 있습니다. } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { return (value !=null); } } |
isValid는 boolean 값을 리턴하며 검증을 할수가 있다.
그리고 마지막으로
Custom Constraint Annotation을 만들 때는 message, groups 그리고 payload 3개는 꼭 정의해야 한다.
message는 메세지 관리,
groups 는 상황별 validation 제어를 위해 사용,
payload는 심각도를 구분하기 위해 사용한다고 한다.
그럼 예를들어 DTO에 하나의 변수에 @Testanno annotation을 붙여주고
@Valid를 사용하여 검증을 할수가 있다.
Valid annotation은 아래 참고 포스팅을 참고하도록 하자.
참고 포스팅
https://thenicesj.tistory.com/91
https://thenicesj.tistory.com/52
https://thenicesj.tistory.com/565
https://thenicesj.tistory.com/305
'IT > Java' 카테고리의 다른 글
[Jackson] JsonNode, ObjectNode, ArrayNode (35) | 2023.06.06 |
---|---|
kafka 실습 (springboot에서 활용) (31) | 2023.06.05 |
SPRINGBOOT 에서 등록된 Bean 추출 (54) | 2023.06.01 |
mybatis 에서 dto camel case 적용 (59) | 2023.05.29 |
@Data annotation 과 getter 의 관계(23.05.24) (30) | 2023.05.25 |
댓글