Spring Annotation이 궁금했단 말이죠

힐링코더·2023년 9월 2일

1. Spring Annotation이란?

@에 대해서는 전에 설명한 바가 있습니다.
따라서 @이 무엇인지에 대해서는 설명하지 않겠습니다.
그렇다면 스프링 @는 무엇일까요?

스프링 프레임워크에서는 다양한 애노테이션을 통해 애플리케이션의 구성 및 동작을 정의하고 구현합니다.
스프링의 기능을 활용하고 제어하기 위해 사용되는 이러한 애노테이션들은 일반적으로 클래스, 메서드, 필드 등에 @ 기호가 붙여져 사용됩니다.
이렇게 하면 XML 구성 파일을 사용하지 않고도 스프링 애플리케이션을 설정하고 관리할 수 있습니다.


2. Spring에서 자주 사용하는 Annotation 종류를 알려 드릴게요!

상세하게 알려 드립니다.

우선 주요 스프링 애노테이션은 다음과 같습니다.

  1. @Component: 클래스를 스프링 컨테이너의 구성 요소(빈)로 등록합니다. 이렇게 하면 스프링이 해당 클래스의 인스턴스(빈)를 생성하고 관리할 수 있습니다.
  2. @Controller: 스프링 MVC 웹 애플리케이션에서 컨트롤러 클래스에 이게 붙습니다.
  3. @Service: 비즈니스 로직을 처리하는 서비스 클래스를 정의할 때 사용합니다.
  4. @Repository: 데이터 액세스 작업(DB 관련)을 수행하는 데 사용되며, 주로 DAO(Data Access Object) 클래스에 적용됩니다.
  5. @Autowired: DI를 할 대상을 표시합니다. 이게 붙은 곳에 스프링이 필요한 의존성을 자동으로 주입합니다.
  6. @Qualifier: @Autowired와 함께 사용되어 여러 개의 빈 중에서 어떤 빈을 주입할지 지정합니다.
  7. @RequestMapping: 스프링 MVC 컨트롤러에서 HTTP 요청과 매핑되는 핸들러 메서드를 정의합니다.
  8. @Configuration: 자바 기반의 스프링 설정 클래스를 표시하며, 이 클래스에서 빈을 정의하고 구성합니다.
  9. @Value: 프로퍼티 값을 주입받기 위해 사용하며, 외부 프로퍼티 파일이나 환경 변수의 값을 읽어와서 필드에 할당합니다.
  10. @Scope: 빈의 스코프를 지정합니다. 예를 들어, 싱글톤 빈인지 프로토타입 빈인지 설정할 수 있습니다.
  11. @PostConstruct와 @PreDestroy: 초기화와 소멸 메서드를 지정하기 위해 사용됩니다.
  12. @Transactional: 메서드 레벨에서 트랜잭션을 설정하기 위해 사용합니다.

...
끝일까요?
아니에요!
더 많은 애너테이션들이 있답니다.

  1. @ResponseBody: 스프링 MVC 컨트롤러에서 사용되며, 메서드가 HTTP 응답의 본문으로 반환될 데이터임을 나타냅니다. 주로 RESTful 웹 서비스에서 JSON 또는 XML 응답을 생성하는 데 사용됩니다.
  2. @RequestBody: 스프링 MVC 컨트롤러에서 사용되며, HTTP 요청의 본문으로부터 데이터를 읽어와서 메서드의 매개변수로 주입함을 나타냅니다.
  3. @PathVariable: 스프링 MVC 컨트롤러에서 사용되며, URI 경로의 일부를 메서드 매개변수로 바인딩합니다. 예를 들어, RESTful 엔드포인트에서 경로 변수를 가져올 때 사용됩니다.
  4. @RequestParam: 스프링 MVC 컨트롤러에서 사용되며, HTTP 요청의 쿼리 매개변수를 메서드 매개변수로 바인딩합니다.
  5. @SessionAttribute: 세션의 속성을 컨트롤러에서 사용할 수 있도록 지정합니다.
  6. @ModelAttribute: 컨트롤러 메서드에서 폼 데이터를 객체로 바인딩할 때 사용됩니다.
  7. @Valid 및 @Validated: Bean 유효성 검사를 수행하도록 지정합니다. 주로 폼 입력 유효성 검사와 관련이 있습니다.
  8. @Async: 비동기 메서드를 선언할 때 사용됩니다. 이를 통해 메서드가 비동기적으로 실행되고 결과를 처리할 수 있습니다.
  9. @Enable* 시리즈: 스프링의 여러 기능을 활성화하기 위한 애노테이션입니다. 예를 들어, @EnableTransactionManagement은 트랜잭션 관리를 활성화하고, @EnableCaching은 캐싱을 활성화합니다.
  10. @Profile: 특정 프로파일 환경에서 빈을 등록하도록 지정합니다. 프로파일 기반의 설정을 사용하여 다양한 환경에서 애플리케이션을 구성할 수 있습니다.
  11. @EventListener: Spring의 이벤트 처리를 위해 사용되며, 특정 이벤트를 처리하는 메서드를 정의합니다.
  12. @ConfigurationProperties: 외부 설정 파일에서 설정 값을 읽어와서 빈에 주입하기 위해 사용됩니다.

여기서 끝일까요?
스프링에는 다양한 모듈과 기능이 있는데요, 각각의 모듈에 따라 특화된 애노테이션이 또 있습니다.
스프링 Security, 스프링 Data JPA, 스프링 부트 등과 같은 스프링의 하위 프로젝트와 모듈을 자체적인 애노테이션을 가지고 있어요.


3. Annotation의 동작 원리

그래서.. 이것들이 어떻게 도는데요?

애너테이션의 동작 원리는 자바 언어의 리플렉션 메커니즘과 밀접하게 관련이 있습니다.
리플렉션은 프로그램이 실행 중에 자신의 구조를 조사하고 수정할 수 있게 해 주는 자바의 기능입니다(생활 중에 거울을 보고 옷매무새를 고치는 것과 같아요).
애너테이션은 이 리플렉션 메커니즘을 활용하여 동작하는데, 아래 단계에 따라 동작합니다.

1. 애너테이션의 정의
개발자가 @interface 키워드를 가지고 자신만의 애너테이션을 정의합니다.

@interface MyAnnotation {
    String value();
}

2. 애너테이션 적용
정의한 애너테이션을 사용하려는 코드에 적용합니다.
애너테이션은 주로 클래스, 메서드, 필드 등에 적용됩니다.

@MyAnnotation("Hello, Annotation!")
public class MyClass {
    // ...
}

3. 리플렉션을 통한 애너테이션 처리
프로그램이 실행될 때, 자바의 리플렉션 기능을 사용하여 클래스 및 객체의 구조를 분석하고 애너테이션 정보를 추출합니다.

Class<?> clazz = MyClass.class;
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
String value = annotation.value();

이 코드에서는 MyClass 클래스에서 MyAnnotation 애너테이션을 추출하고, 해당 애너테이션의 값을 가져옵니다.

4. 애너테이션 정보 활용
추출한 애너테이션 정보를 활용하여 프로그램의 동작을 변경하거나 보조적인 작업을 수행합니다. 예를 들어, 프레임워크나 라이브러리는 애너테이션을 사용하여 설정 정보를 읽고 기능을 활성화합니다.

※ 애노테이션, 애너테이션 혼용이 됐는데 앞으로는 애너테이션으로 통일할 예정.

profile
여기는 일상 블로그, 기술 블로그는 https://yourhealingcoder.tistory.com/

0개의 댓글