Java Annotation 뿌시기 - Annotation 생성하기

Martin the dog·2023년 9월 24일

Annotation?

어노테이션이란 무엇인가? Lombok을 이용해본 사람들은 @Setter, @Getter를 많이 보았을 것이다. 이런 것을 어노테이션이라 하며 한국어로 직역하면 주석이라고 한다. 주석이 특정 대상에 대한 추가 정보를 제공하는 것 처럼 Annotation도 java에서 정보를 보여주는 역할을 하기도 하며 이뿐만 아니라 특정 기능을 제공해주는 역할도 한다.

Custom Annotation 만들기

자바는 사용자가 다양한 Annotation을 작성할 수 있도록 한다. 커스텀 Annotation의 형식을 정의하면 다음과 같다.

@Target({ElementType.적용대상})
@Retention(RetentionPolicy.정보유지대상)
public @interface 어노테이션 이름 {
	내용들
}

그럼 lombok에 정의된 @Setter를 직접 만들어 보며 설명해보겠다!

  1. Annotation에 사용될 이름으로 앞에 @interface가 붙어야 한다.
@Target({ElementType.적용대상})
@Retention(RetentionPolicy.정보유지대상)
public @interface MySetter {
	//WIP//
}
  1. Target: 어노테이션이 적용될 위치로 어느곳에 해당 Annotation이 사용 될지 정의한다.
    |이름|적용 위치|
    |-|-|
    |Type|class, interface, enum에 적용된다.|
    |FIELD|클래스 필드 변수|
    |METHOD|함수|
    |PARAMETER|메서드 인자|
    |CONSTRUCTOR|생성자|
    |LOCAL_VARIABLE|로컬 변수|
    |ANNOTATION_TYPE|어노테이션 타입에만 적용된다.|
    |PACKAGE|패키지|
    |TYPE_PARAMETER|제너릭 타입 변수에 적용된다.|
    |TYPE_USE|그냥 싹다 어디든 가능!|
    |MODULE|MODULE에 적용된다.|
    우리는 각 필드에만 적용되는 @Setter를 만들 것이기 때문에 FIELD를 사용하는 것이 맞다.
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.정보유지대상)
public @interface MySetter {
	//WIP//
}
  1. Retention: 어노테이션이 언제까지 유지되는지를 정의한다.
    참고로 자바는 .java -Compile-> .class -Load-> 원시코드 로 진행된다.
    |이름|적용 위치|
    |-|-|
    |SOURCE|컴파일 이전까지만 적용된다. 컴파일이 시작되면 없어진다.|
    |CLASS|기본값으로 .Class까지는 남아있지만 JVM으로 넘어갈 때 없어진다.|
    |RUNTIME|런타임까지 남아있는놈|
    우리가 만들 @MyGetter는 compile 되기전에 Setter를 만들어 주고 사라질 놈이니 SOURCE가 적당해 보인다.
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface MySetter {
	//WIP//
}

만약 Annotation이 필드 값을 가지게 하고 싶다면 //WIP//가 들어간 곳에 다음과 같이 선언하면 된다.

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface mySetter {
	String madeBy() default "HYUNKYUCHANG";//
}

이렇게 mySetter에 사용될 변수 madeBy를 정의하였다. Annotation에 정의 될 수 있는 변수는
Enumeration, String, Class, Primitive Value만 정의될 수 있다.

고럼 이제 해당 Annotation이 붙은 Field값에 Setter 함수를 추가해주는 로직을 추가해주면 된다.
다음에 올릴 글에는 해당 Annotation에 어떻게 로직을 붙이는지 알아보겠다.

profile
Happy Developer

0개의 댓글