상세 컨텐츠

본문 제목

[JAVA] Custom Annotation 생성 및 활용

Spring/JAVA

by Chan.94 2023. 3. 5. 21:40

본문

반응형

Annotation 종류

Java의 어노테이션은 크게 Built-in Annotation과 Meta Annotation이 존재한다.

 

  • Built-in Annotation
    • Java 코드에 적용되는 어노테이션
    • @Overrie, @SuppressWarnings 등이 존재
  • Meta Annotation
    • 다른 어노테이션에 적용되기 위한 어노테이션
    • @Retention, @Documneted, @Target, @Inherited, @Repeatable 등이 존재

Built-in Annotation

  • @Override
    부모 클래스의 메소드를 오버라이드 할 때 사용
    오버라이드 할 때, 필수로 어노테이션을 사용해야 하는 것은 아니지만, 오버라이드 하고 있다는 것을 알려주기에 사용
  • @SuppressWarnings
    메소드에 사용하며, 사용한 메소드에 워닝을 컴파일러에서 표시하지 않도록 함.

Meta Annotation

  • @Retention: 해당 어노테이션의 정보를 어느 범위까지 유지할 것인지를 설정함
    • RetentionPolicy.SOURCE : 컴파일러에 의해 사라지는 어노테이션으로 CLASS파일에 저장되지 않고 source상에서만 확인이 가능하여 주석 같은 용도로 사용
    • RetentionPolicy.CLASS : 컴파일러에 의해 CLASS 파일에 저장은 되지만, 런타임에는 유효하지 않음(Default)
    • RetentionPolicy.RUNTIME : 런타임에도 유효
  • @Documented : JavaDoc 생성 시 Document에 포함되도록 함
  • @Target : 해당 어노테이션이 사용되는 위치를 결정함
    • ElementType.PACKAGE : 패키지 선언 시
    • ElementType.TYPE : 타입 선언 시
    • ElementType.CONSTRUCTOR : 생성자 선언 시
    • ElementType.FIELD : 멤버 변수 선언 시
    • ElementType.METHOD : 메서드 선언 시
    • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언 시
    • ElementType.LOCAL_VARIABLE : 지역 변수 선언 시
    • ElementType.TYPE_PARAMETER : 매개 변수 타입 선언 시
  • @Inherited : 해당 어노테이션을 하위 클래스에 적용함
  • @Repeatable : Java8부터 지원하며, 연속적으로 어노테이션을 선언하는 것을 허용함

Custom Annotation 만들기

회원과 비회원을 구분 지어 서비스를 제공해야 한다고 가정하자. 비회원에게도 제공되는 서비스가 존재할 것이다.

단순하게 회원전용 API와 비회원 전용 API를 구분 지어도 되지만 Custom Annotation을 생성한다면 더 간단히 해결할 수 있다.

※ Custom Annotation 주의 사항

어노테이션 추가가 당장의 작업 속도를 끌어올릴 순 있지만 어노테이션의 의도는 숨어있기 때문에 내부적으로 어떤 동작을 하게 되는지 명확하지 않다면 로직 플로우를 이해하기 어렵게 된다.


하지만 적재적소에 사용된다면 불필요한 반복코드가 줄고 개발자는 비즈니스 로직에 더 집중할 수 있도록 만들어준다.

무분별한 추가는 지양하고 추가하기 전에 구성원 간의 이해와 공감대가 선행되어야 한다.

 

Annotation 생성

public @interface PreviewAvailable {

}

어노테이션은 인터페이스 앞에 @를 붙여서 생성할 수 있다.

 

Meta Annotation 추가

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PreviewAvailable {

}

 

Custom Annotation 적용

@RestController
@RequestMapping("devlog")
public class TestController {
	
	@GetMapping("/member")
	public String member () {
		Method method = new Object(){}.getClass().getEnclosingMethod();
		String value = memberCheck(method);
		return value;
	}
	
	@PreviewAvailable
	@GetMapping("/visitor")
	public String visitor () {
		Method method = new Object(){}.getClass().getEnclosingMethod();
		String value = memberCheck(method);
		return value;
	}

	private String memberCheck(Method method) {
		String value = "";
		if(method.isAnnotationPresent(PreviewAvailable.class)) {
			value = "비회원";
		}else {
			value = "회원";
		}
		return value;
	}
}

devlog/visitor API에 Custom Annotation을 적용하였다. AOP를 활용하면 효과적으로 Custom Annotation을 사용할 수 있을 것이다.

@PreviewAvailable Annotation을 적용함으로써 비회원에게도 제공되는 API를 구분 지어 사용하지 않아도 된다.

비회원에게도 제공될 API에 @PreviewAvailable을 적용하기만 하면 된다.

(AOP를 사용하여 @PreviewAvailable 유뮤를 체크하도록 한다)

반응형

관련글 더보기

댓글 영역

>