728x90

1. 어노테이션이란?

먼저 어노테이션을 설명하기 전에 메타데이터에 대해 조금 알고 가야할 것 같다.

 

  • 메타데이터(Metatdata)란?
    • 데이터의 대한 속성 정보이다. '데이터에 관한 구조화 된 데이터', '다른 데이터를 설명해 주는 데이터'라고도한다.
    • 대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대하여 부여 되는 데이터라고 한다.
  • 어노테이션이란? 
    • 메타데이터의 일종이다.
    • 프로그램을 처리할 때 실행 과정에서 어떻게 데이터를 처리할지 알려주는 서브 데이터라고 한다.
    • 코드에서 @를 붙여 사용하는 코드
    • JDK 1.5버전 이상부터 사용가능

 

2. 어노테이션을 사용하는 이유 (효과) 는 무엇일까?

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공해준다.
  • 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공해준다.
  • 런타임 시 특정 기능을 실행하도록 정보를 제공해준다.

위와 같은 이유에서 사용한다. 그럼 어노테이션의 종류는 무엇이 있을까?

@Override

컴파일러에게 오버라이딩 하라는 메소드라고 알려준다.

 

@Service

스프링프레임 워크에서 자주 쓰이는 어노테이션으로 핵심 비즈니스 로직을 담은 서비스를 클래스 빈에 등록하기 위해 사용한다.

 

@SpringBootApplication

스프링 실행 시 필요한 다양한 설정을 알아서 자동으로 해준다. 

 

@GetMapping

스프링 프레임워크에서 자주 쓰이는 어노테이션으로 Http get요청이 오면 @GetMapping이 붙은 메소드가 실행된다.

 

위와 같이 많은 어노테이션이 있고 상황에 따라 알맞은 어노테이션을 사용하면 된다.

 

3. 나만의 어노테이션은 어떻게 만들 수 있을까?

1. 어노테이션 생성

어노테이션은 인터페이스 앞에 @를 붙여 만들 수 있다.

public @interface MakeAnnotaion {
    
}

 

2. 메타 어노테이션

메타 어노테이션에는 아래와 같은 종류가 있다.

 

@Target : 사용할 어노테이션에 적용할 대상을 지정하는데 사용한다.

ElementType.ANNOTATION_TYPE 어노테이션
ElementType.CONSTRUCTOR 생성자
ElementType.FIELD 멤버변수, Enum 상수
ElementType.LOCALVARIABLE 지역변수
ElementType.METHOD 메서드
ElementType.PACKAGE  패키지
ElementType.PARAMETER 매개변수
ElementType.TYPE 타입(클래스, 인터페이스, Enum)
ElementType.TYPE_PARAMETER 타입 매개변수(제네릭과 같은 매개변수)
ElementType.TYPE_USE 타입이 사용되는 모든 대상

 

@Documented : 어노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 하는 어노테이션이다.

자바에서 제공하는 표준 어노테이션과 메타 어노테이션 중에 @Override와 @SuppressWarnings 어노테이션을 제외하고 모든 어노테이션에 @Documented 어노테이션이 적용되어 있다.

 

@Inherited : 하위 클래스가 어노테이션을 상속받도록 한다.

상위 클래스에 @Inherited를 붙이면 하위 클래스에서도 동일하게 사용된다.

 

@Retention : 어노테이션의 지속 시간을 결정하는 데 사용한다.

RetentionPolicy.SOURCE 컴파일 전까지 지속됨, 컴파일 이후엔 사라진다.
RetentionPolicy.CLASS 런타임이 실행되기 전까지만 존재한다.
RetentionPolicy.RUNTIME
런타임 시 사용되된다. (즉, 클래스 파일까지 존재하며 실행시 사용된다.)

 

@Repeatable : 어노테이션을 반복하여 사용할 수 있도록 허용하는 어노테이션이다.

@Retention(RetentionPolicy.RUNTIME) // 어노테이션은 특정 어노테이션의 지속 시간을 결정하는 데 사용
@Inherited // 하위 클래스가 어노테이션을 상속받도록 함
@Documented // 어노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함
@Target(ElementType.METHOD)// 사용할 어노테이션을 적용할 대상을 지정
public @interface MakeAnnotaion {
    
}

 

 

위의 코드는 컴파일 이후에도 사용할 수 있는 @Retention(RetentionPolicy.RUNTIME) 사용하였고, 하위 클래스에서 어노테이션을 상송 받을 수 있도록 하였다. 또, @Documented를 사용하여 해당 어노테이션에 대한 정보가 문서로 저장될 수 있도록 하였고, 메서드 선언 시 적용할 수 있도록 @Target(ElementType.METHOD)를 사용하였다.

위와 같이 필요한 어노테이션을 상황에 맞게 적용하여 만들면 된다.

 

출처 - https://ittrue.tistory.com/160

 

3. 만든 어노테이션 사용하기

@MakeAnnotation(name = "HelloController")
@RequestMapping("/hello")
public class HelloController {

}

public class HelloController2 {
	@MakeAnnotation
	String str = null;
    
    @MakeAnnotation
    public void test(){
    
    }
}

 

위와 같이 만든 어노테이션을 적용할 수 있다.

 

[느낀점]

어노테이션에 대해 궁금해 하지 않았는데 이번 기회로 어노테이션이 어떤건지 알 수 있게 되었다.

커스텀 어노테이션도 구현하는 것이 마냥 어렵다고 느꼈는데 각각 어떤 기능을 하는지 어디에 필요한지 정리하면 생각보다 쉽게 커스텀 어노테이션 구현이 가능하다는 것을 알게 되었다.

조금 더 공부해서 직접 어노테이션을 만들어 프로젝트에도 한번 적용해보아야겠다.😁

 

강의 링크 👉 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

728x90

+ Recent posts