[영상후기] 어노테이션 (Annotation) [ 스프링 부트 (Spring Boot) ]

박철현·2024년 6월 19일
0

영상후기

목록 보기
158/160

movie

어노테이션

  • Java 5부터 추가된 기능으로 소스코드에 추가적인 정보를 제공하는 메타데이터의 기능 수행
  • 클래스, 메서드, 변수, 인자 등에 추가할 수 있음
  • 메타데이터이기에 비즈니스 로직에 직접적으로 영향을 주진 않지만 메타데이터 정보에 따라 실행 흐름을 변경할 수 있음

종류

  • Built-in 어노테이션 : Java 코드에 적용되는 어노테이션
    • @Override, @Deprecated, @SuppressWarnings 등
  • Meta 어노테이션 : 다른 어노테이션에 적용되기 위한 어노테이션
    • 커스텀 어노테이션 만들때 사용해야 함
    • @Retention, @Documented, @Target, @Inherited, @Repeatable 등

Meta Annotation

@Retention

  • 해당 어노테이션의 정보를 어느 범위까지 유지할 것인지 설정
    • RetentionPolicy.SOURCE : 컴파일 전까지만 유효하며 컴파일 이후 사라짐
    • RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효(default)
    • RetentionPolicy.RUNTIME : Reflection을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조됨

@Target

  • 해당 어노테이션이 사용될 수 있는 위치를 선정
    • ElementType.PACKAGE : 패키지 선언시
    • ElementType.TYPE : 타입 선언시(class, interface, enum)
    • ElementType.CONSTRUCTOR : 생성자 선언시
    • ElementType.FIELD : 멤버 변수 선언시
    • ElementType.METHOD : 메소드 선언시
    • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언시
    • ElementType.LOCAL_VARIABLE : 지역 변수 선언시
    • ElementType.TYPE_PARAMETER : 매개 변수 타입 선언시(Generic)
      ...

@Documented

  • Java Doc 생성시 Document에 포함되도록 하는 설정

@Inherited

  • 해당 어노테이션을 하위 클래스에 적용

@Repeatable

  • Java 8 버전부터 지원하며 연속적으로 어노테이션을 선언하는 것을 허용

실습 코드

실습 1

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FieldAnnotation {
	String name();
    String value();
}
  • Annotation 선언하기 위해서 @interface 사용
  • 어디까지 적용, 어디에 적용할지는 Meta Annotation 설정
    • Retention, target
  • 주로 반복적인 작업들을 줄여주기 위해 커스터마이징 어노테이션 설정
    • 이런 경우 주로 Runtime 환경 -> Retention : Runtime으로 설정하는것이 태반

실습 2

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodAnnotation {
 String name();
 String value() default "I'm Method";
}
  • 변도 설정 안했을 때 default값 들어감

실습 3 - Type : 클래스, 인터페이스, enum 타입에서 사용되는 어노테이션

실습 4 - validation

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Constraint(validatedBy = ParameterValidator.class)
public @interface ValidationAnnotation {
  String message() default "Invalid Value. It should be 'hello'";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}
public class ParameterValidator implements 
// ValidationAnnotation에 적용할꺼야 !
// String : 어떤 값들을 체크할껀지 (제네릭)
ConstraintValidator<ValidationAnnotation, String> {
  // 초기화 필요없으면 오버라이드 안해도됨
  @Override
  public void initialize(ValidationAnnotation constraintAnnotation) {
    ConstraintValidator.super.initialize(constraintAnnotation);
  }

  @Override
  public boolean isValid(String value, ConstraintValidatorContext context) {
    return value != null && value.equals("hello");
  }
}
  • @Constraint : 설정하는 어노테이션이 어떤 Validator를 따르는지 설정
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글

관련 채용 정보