# Annotation이란 무엇인가요?

* **애노테이션(`Annotation`)** 은 사전적 의미로는 **주석**을 뜻하며, 자바에서 애노테이션은 **소스 코드에 추가해서 사용할 수 있는 메타 데이터의 일종이다.**
* 애노테이션은 클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 한다.
* 애노테이션을 정의하고, 원하는 위치(클래스, 메서드, 파라미터 등)에 배치한 후, 코드가 실행되는 도중 [자바 리플렉션](https://github.com/genesis12345678/TIL/blob/main/interview/java/21_25/Reflection.md)을 이용해 추가 정보를 획득해 기능을 수행하는 방식으로 동작한다.
* 애노테이션이 나오기 전에는 XML이나 `Serializable` 같은 **마커 인터페이스**를 통해 추가적인 정보를 제공할 수 있었다.

**\[애노테이션 장점]**

* **가독성** : 클래스, 메서드 등 연관된 코드에 직접적으로 붙어있기 때문에 흐름을 따라가기 쉽다.
* **설정 간소화** : 별도의 설정 파일 없이 애노테이션 적용을 통해 설정을 간소화할 수 있다.
* **중복 코드 제거** : 설정을 재사용할 수 있기 때문에 코드의 중복을 줄일 수 있다.

**\[애노테이션 단점]**

* **런타임 오버헤드** : 런타임 시점에 리플렉션을 사용하여 처리하는 애노테이션의 경우 성능상 오버헤드가 발생할 수 있다.
* **남용으로 인한 복잡성** : 지나치게 많은 애노테이션을 적용하면 오히려 코드를 이해하기 어려워질 수 있다.

## 스프링이 애노테이션 기반으로 만든 이유

* XML을 통한 복잡한 설정은 코드의 복잡성을 올라가게 하고, 가독성을 떨어뜨리면서 유지보수를 어렵게 만드는 요인이 되었다.
* **반면 애노테이션을 기반 구성은 가독성, 유지보수, 간결함 등의 장점이 존재하기 때문에 스프링에서는 애노테이션 기반 구성을 지원한다.**
* XML도 여전히 지원은 하므로 프로젝트 요구사항에 맞게 선택하여 사용할 수 있다.

## 스프링 주요 애노테이션

* `@ComponentScan`
  * `@Component`, `@Controller`, `@Service`, `@Repository`, `@Configuration`이 붙은 클래스를 스프링 빈으로 등록한다.
* `@EnableAutoConfiguration`
  * 스프링 부트의 자동 구성을 활성화하는 기능을 제공하는 애노테이션
* `@Component` vs `@Bean`
  * 둘 다 스프링 빈으로 등록하기 위한 애노테이션인데, 차이가 있다.
  * `@Component` : 개발자가 직접 생성한 클래스를 스프링 빈으로 등록할 때 사용한다.
  * `@Bean` : 개발자가 직접 제어가 불가능한 외부 라이브러리를 스프링 빈으로 등록할 때 사용한다.
* 외에도 `@Autowired`, `@SpringBootApplication` `@Request...`, `@Response...` 등 개발자의 편의를 위한 다양한 애노테이션을 제공한다.

<br>

### 참고

* [참고 블로그](https://melonicedlatte.com/2021/07/18/182600.html)
* [참고 블로그](https://woo-chang.tistory.com/73)
* [참고 블로그](https://hoons-dev.tistory.com/97?category=1091955)
