Spring MVC 커스텀 애노테이션
Spring Web MVC
백기선님의 강의인 Spring Web MVC 강의를 듣고 공부한 내용을 정리한 글
커스텀 애노테이션
이번 시간에는 커스텀 애노테이션을 비롯하여 애노테이션들의 정의에 대해서 알아보는 시간을 갖도록 하자.
우리도 스프링에서 제공하는 @GetMapping 처럼 커스텀한 애노테이션을 만들 수 있다.
우리도 그러면 지금부터 커스텀 애노테이션을 한번 만들어보자!
처음부터 만들기 보다는 메타 애노테이션을 사용하면 조금 더 편리하다.
메타 애노테이션이란 애노테이션에 사용할 수 있는 애노테이션을 의미한다.
그렇다면 지금부터 한번 커스텀 애노테이션을 만들어보자.
@RequestMapping(method = RequestMethod.GET, value = "/hello")
public @interface GetHelloMapping{}
그러면 이제 핸들러에 @GetHelloMapping을 사용하면 제대로 응답을 받을 수 없는 것을 확인할 수 있다.
어째서 안될까?
메타 애노테이션을 사용했는데도 말이다.
그 이유는 런타임시에 사라지기 때문이다.
애노테이션의 속성 중 가장 중요한 속성이 바로 @Retension이다.
@Retension은 해당 애노테이션 정보를 언제까지 유지할 것인가에 관한 애노테이션이다.
옵션은 총 세 가지가 존재한다.
Source
Class
Runtime
Source는 소스 코드까지만 유지함을 의미한다. 즉 컴파일하면 해당 애노테이션 정보는 사라지게 된다.
Class는 컴파일한 .class 파일에도 유지시킨다. 즉 런타임 시, 클래스를 메모리로 읽어오면 해당 정보는 사라진다.
Runtime 클래스를 메모리에 읽어왔을 때 까지 유지한다. 코드에서 이 정보를 바탕으로 특정 로직을 실행할 수 있게 된다.
즉 우리가 방금 만든 커스텀 애노테이션을 사용하기 위해서는 @Retension에 Runtime이라고 명시해야 실제 런타임에 우리가 만든 커스텀 애노테이션을 사용할 수 있는 것이다!
참고로 스프링의 기본 애노테이션 전략은 Class이다.
@Retension(RetensionPolicy.RUNTIME)
@RequestMapping(method = RequestMethod.GET, value = "/hello")
public @interface GetHelloMapping{}
다시 실행해보면 이제는 제대로 애노테이션이 적용되는 것을 알 수 있다.
또한 @Target 애노테이션을 사용해서 이 애노테이션이 어디에 사용될 수 있는지를 명시할 수 있다.
예를들어,
@Target(ElementType.METHOD)
@RequestMapping(method = RequestMethod.GET, value = "/hello")
public @interface GetHelloMapping{}
위와같이 @Target 애노테이션에 METHOD라고 지칭하면 메소드에만 애노테이션을 사용할 수 있게 된다. 즉, 변수나 클래스같은 곳에 사용할 수 없다는 의미이다.
@Document // 문서에 포함되어있는지 여부를 나타내는 애노테이션
@Target(ElementType.METHOD)
@RequestMapping(method = RequestMethod.GET, value = "/hello")
public @interface GetHelloMapping{}
그리고 @Documented라는 애노테이션도 스프링 애노테이션을 보면 심심치않게 볼 수 있는데, 해당 애노테이션을 사용한 코드의 문서에 그 애노테이션에 대한 정보를 표기할지 결정하는 애노테이션이다.
즉 스프링에서 이 애노테이션을 봤다면 스프링 공식 문서에 이 애노테이션에 대한 정보가 문서로 남아있다고 볼 수 있다.
하나 또는 그 이상의 메타 애노테이션을 조합해서 만든 애노테이션을 Composed 애노테이션이라고 부른다.
@GetMapping는 @RequestMapping을 메타 애노테이션으로 사용하여 만들어진 Composed 애노테이션이다.
Reference
인프런 백기선님의 스프링 Web MVC