Annotation이란 무엇이고 구체적으로 어떤 것이 있는지 예시를 들어 설명해주실 수 있을까요?
Annotation은 자바 5.0(Java 5)에서 처음 도입되었습니다. 어노테이션은 소스 코드에 메타데이터를 추가하는 데 사용되었고, 주로 컴파일러나 프레임워크에 정보를 전달하는 데 활용되고 있습니다. 단순한 주석이 아니라 컴파일러가 코드에 특별한 의미, 기능을 수행하도록 하는 기술입니다.
Annotation을 활용하면 코드가 깔끔해지고 재사용에 용이합니다. Java에서 사용되는 어노테이션은 자바에서 기본적으로 제공되는 표준(내장) 어노테이션, 어노테이션을 위한 어노테이션인 메타 어노테이션, 그 외 사용자 정의 어노테이션이 있습니다. 표준 어노테이션이 많이 사용되고 있으며 대표적으로 @Override는 어노테이션 입니다. 오버라이딩을 올바르게 했는지 컴파일러가 체크하는 기능을 해줍니다. 그 외 상위 호환 메소드가 있는 경우에 표시해주는 @Deprecated 어노테이션, 경고 메시지를 무시하는 @SuppressWarnings 등이 있습니다.
메타 어노테이션은 사용자 정의 어노테이션이나 기존 어노테이션을 커스터마이즈 할 때 사용되는 경우가 많습니다. 대표적으로 @Target은 해당 어노테이션의 적용 대상을 지정할 때 사용됩니다. @Retention은 어노테이션이 유지되는 기간을 설정하게 됩니다. @Documented는 Javadoc으로 작성되는 문서에 포함시키고자 할 때 작성합니다.
추가질문
그 외 라이브러리 및 프레임 워크의 주요 어노테이션은 어떤것들이 있을까요?
Spring framework에서는 다양한 어노테이션을 제공합니다. 거의 어노테이션으로 개발이 되는 것으로 보여질 정도로 아주 많은 어노테이션들이 제공됩니다. 가장 대표적인 어노테이션은 메인 어플리케이션 클래스에 작성되는@SpringBootApplication 어노테이션은 해당 어플리케이션이 스프링부트환경에 있음을 정의하며, 그 하위 폴더의 모든 소스코드들이 스프링부트 환경에 있음을 알립니다. 그 중 핵심은 @SpringBootApplication 내에 포함되어 있는 어노테이션인 @ComponentScan이라고 생각합니다. 이를 통해 해당 스프링 부트 프로젝트 구조 내에 있는 모든 클래스를 스캔하여 IoC컨테이너에 빈을 등록하고 @Component 어노테이션이 작성된 클래스를 찾아 의존성 주입에 활용되는 빈으로 등록합니다. 서버의 주요 3계층에서 사용되는 @Controller, @Service, @Repository 어노테이션 또한 하위에 @Component 어노테이션을 포함하고 있어서 스캐닝되어 Bean으로 등록됩니다. 더하여 빈을 주입하는 실제 코드는 @Autowired라는 어노테이션이 사용됩니다. IoC컨테이너에 등록 된 Bean을 찾아 의존성을 주입하게 됩니다. 이 부분은 보통 생략되어 작성안되는 경우도 있습니다.
그 외에도 Lombok 라이브러리에서 제공하는 Annotaion @Setter, @Getter 등은 코드를 줄여 가독성을 높여주는 역할을 합니다. JPA의 영속성 라이브러리에서도 @Entity, @Id, @Column 등 을 제공하여 DB와 관련된 기능들을 손쉽게 맵핑 해주는 역할을 합니다. 그 외 테스트 코드에 사용되는 @Test, @Mock, @Before등도 개발자가 원하는 테스트 환경을 구축하는데 편리한 기능을 제공합니다.