Backend/Java

Annotation(@)

간지나제 2022. 8. 15. 16:36

java 개발을 하다보면 annotation을 많이 쓰게 된다.

사전적 의미로는 주석으로, 프로그램에 추가적인 정보를 제공해주는 메타데이터라고 할 수 있다.

(메타데이터: 데이터를 위한 데이터)

java가 기본적으로 제공하는 annotation이나 lombok library, 필요 시 개발하는 custom annotation 등이 있다.

 

문득, annotation을 제대로 알고 쓰는 건가 싶어 정보를 찾아보고 간략히 정리해본다.

 

용도

1. 보일러 플레이트 코드를 자동으로 생성할 수 있도록 정보를 제공

2. 컴파일 시 컴파일러가 에러 체크할 수 있도록 정보 제공

3. 런타임 시 특정 기능을 실행하도록 정보를 제공

 

@SpringBootApplication :  @Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 애노테이션으로 합친 것이다.

@Bean : 

@Configuration : Configuration을 클래스에 적용하고 @Bean을 해당 클래스의 메소드에 적용하면 @Autowired로 빈을 부를 수 있다.

@ComponentScan : @Component, @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 Annotation이다.
@Component Annotation이 있는 클래스에 대하여 bean 인스턴스를 생성

ApplicationContext.xml에 <bean id="jeongpro" class="jeongpro" /> 과 같이 xml에 bean을 직접등록하는 방법도 있고 위와 같이 Annotation을 붙여서 하는 방법도 있다.

base-package를 넣으면 해당 패키지 아래에 있는 컴포넌트들을 찾고 그 과정을 spring-context-버전(4.3.11.RELEASE).jar에서 처리한다.

Spring에서 @Component로 다 쓰지 않고 @Repository, @Service, @Controller등을 사용하는 이유는, 예를들어 @Repository는 DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문이다.

또한 가독성에서도 해당 애노테이션을 갖는 클래스가 무엇을 하는지 단 번에 알 수 있다.

자동으로 등록되는 Bean의 이름은 클래스의 첫문자가 소문자로 바뀐 이름이 자동적용된다.
HomeController -> homeController

@Component : component-scan 선언에 의해 특정 패키지 안의 클래스들을 스캔하고, @Component 클래스에 대하여 bean 인스터스를 생성한다.

@EnableDiscoveryClient : Eureka 서버에서 관리될 수 있는 클라이언트 임을 알려주기위한 Annotation이다.
@EnableCaching 
: Spring Boot에 캐시를 적용하고 싶을 때 사용하는 Annotation. 캐시 기능을 추상화 시켜놨기 때문에 라이브러리를 불러오기만 하면 아주 쉽게 사용이 가능하다. (jeong-pro.tistory.com/170)

@Controller : Spring MVC에서 Controller에 해당.

API와 view를 동시에 사용하는 경우에 사용

대신 API 서비스로 사용하는 경우는 @responseBody를 사용하여 객체를 반환한다.

view(화면) return이 주목적

@RestController : Spring에서 Controller 중 View로 응답하지 않는, 컨트롤러를 의미한다.

@Controller + @ResponseBody

view가 필요없는 API만 지원하는 서비스에 사용.

@RequestMapping 메서드가 기본적으로 @ResponseBody를 의미를 가정한다.

data(json, xml 등) return이 주목적

이 어노테이션이 적혀있는 컨트롤러의 메서드는 HttpResponse로 바로 응답이 가능하다. @ResponseBody 역할을 자동적으로 해주는 어노테션이다.

@EnableFeignClients 
@EnableAutoConfiguration :

@Service : Service Class 에서 쓰인다. 비즈니스 로직을 수행하는 클래스라는 것을 나타내는 용도이다.

@Repository : DAO class 에서 쓰인다. 데이터베이스에 접근하는 메서드를 가지고 있는 클래스에서 쓰인다고 볼 수 있다.

@RequiredArgsConstrucgtor :

보통 Dependency Injection 할 때 사용하는 것이 lombok을 활용한 어노테이션이다.

초기화되지 않은 final 필드, @NonNull로 되어있는 필드에 대해서 bean주입을 한다.

(참고로 @NonNull은 null check를 해주는 것으로 해당 필드가 null이 되는 경우 NullPointerException이 난다.)

@AllArgsConstructor : 클래스에 존재하는 모든 필드에 대해서 생성자에서 생성해준다.

 

 

 

https://jeong-pro.tistory.com/151

https://gmlwjd9405.github.io/2018/12/02/spring-annotation-types.html

https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC

'Backend > Java' 카테고리의 다른 글

final  (0) 2022.08.16
@Retention  (0) 2022.08.15
순수 함수란?  (0) 2022.08.12
람다식(Lambda Expression), 람다란(Lambda)?  (0) 2022.08.12
Reflection(리플렉션)  (0) 2022.08.08