티스토리 뷰

스프링 어노테이션은 리플렉션과 스프링 컨테이너를 기반으로 동작합니다. 어노테이션은 런타임에 메타데이터를 제공하며, 스프링은 이를 통해 객체 생성, 의존성 주입, AOP 등을 처리합니다. 주요 동작 원리를 단계별로 살펴보겠습니다.

 

1. 스프링 컨테이너의 역할

스프링 컨테이너는 어노테이션 정보를 분석하고, Bean 을 생성 및 관리합니다. 스프링의 주요 컨테이너는 ApplicationContext 이며, 이를 통해 어노테이션이 처리됩니다.

 

2. 스캔 및 어노테이션 인식

스프링은 클래스패스 스캔을 통해 어노테이션을 가진 클래스를 탐색합니다.

  • 컴포넌트 스캔 
    • @ComponentScan 어노테이션을 통해 특정 패키지를 스캔합니다.
    • 해당 패키지에서 @Component, @Service, @Repository 등이 붙은 클래스를 탐지합니다.
  • 리플렉션을 이용한 어노테이션 분석
    • 스프링은 리플렉션 API를 사용해 클래스와 메서드에 붙은 어노테이션 정보를 읽습니다.

 

3. Bean 등록과 관리

스프링은 탐지된 클래스를 빈으로 등록하며, 어노테이션 정보를 활용해 객체를 생성하고 관리합니다.

  • 클래스에 @Component 가 붙어 있으면, 해당 클래스는 스프링 컨테이너에 빈으로 등록됩니다.
  • 등록된 빈은 싱글톤으로 관리됩니다.

 

4. 의존성 주입

@Autowired 는 빈 간의 의존성을 자동으로 연결합니다.

  • 타입 매칭
    • 스프링은 @Autowired 필드나 생성자의 타입과 동일한 빈을 컨테이너에서 찾습니다.
  • 리플렉션을 사용해 주입
    • Field 또는 Constructor 에 접근 권한을 변경하고, 값을 할당합니다.

 

5. AOP 와 어노테이션

AOP 는 어노테이션을 기반으로 특정 로직을 런타임에 추가할 수 있습니다.

예: @Transactional

  • @Transactional 은 메서드 실행 전후로 트랜잭션 관리를 추가합니다.
  • 스프링은 프록시 객체를 생성하여, 메서드 호출을 가로챕니다.
  • 실행흐름
    • 1. 클라이언트가 메서드를 호출
    • 2. 프록시 객체가 호출을 가로채 트랜잭션 시작
    • 3. 실제 메서드 실행
    • 4. 메서드 완료 후 트랜잭션 커밋 또는 롤백

 

6. 어노테이션 기반 설정의 장점

  • 선언적 프로그래밍 : 어노테이션만으로 동작을 설정할 수 있습니다.
  • 자동화 : 빈 등록, 의존성 주입, AOP 처리가 자동으로 이루어집니다.
  • 가독성 향상 : XML 기반 설정보다 간결하며 유지보수가 쉽습니다.

 

7. 정리

스프링 어노테이션은 리플렉션과 스프링 컨테이너의 동작을 기반으로 작동합니다.

  • 어노테이션은 런타임에 메타데이터를 제공
  • 스프링 컨테이너가 어노테이션을 분석하고 적절한 동작(빈 등록, 의존성 주입, AOP 적용 등)을 수행

 

감사합니다.

최근에 올라온 글
Total
Today
Yesterday