Post

[Spring] 2. Spring Bean

스프링 빈(Spring Bean)이란?


  • 스프링 컨테이너(Spring Container) 가 직접 생성하고 관리하는 자바 객체.
  • 객체를 new 키워드를 통해 직접 생성하지 않고, 애너테이션(Annotation)을 통해 자동으로 생성한다.


객체를 빈으로 만드는 방법


스프링 컨테이너에 빈을 등록하는 방법에는 크게 두 가지가 있다.

  1. 컴포넌트 스캔 (Component Scan)

    특정 애너테이션(@)을 클래스에 붙여주면, 스프링이 시작될 때 해당 클래스를 자동으로 찾아서 빈으로 등록해준다.

    1
    2
    3
    4
    5
    
     // 이 애너테이션 하나로, MemberService 객체는 스프링 컨테이너가 관리하는 '빈'이 된다.
     @Service 
     public class MemberService {
         // ...
     }
    

    스프링은 Component Scanner 를 이용해 지정된 패키지 이하를 모두 탐색하며 @Component 가 붙은 모든 클래스를 찾아낸다.
    그리고 찾아낸 클래스들을 전부 객체로 만들어 스프링 컨테이너에 빈으로 등록한다.


    @Component 애너테이션 종류

    @Component
    └── @Controller (└── @RestController)
    └── @Service
    └── @Repository
    └── @Configuration


    • @Component: 가장 기본이 되는 범용 애너테이션. 특정 계층으로 분류하기 애매한 클래스를 빈으로 등록할 때 사용한다.
    • @Controller & @RestController: 표현 계층(Presentation Layer)을 담당한다. HTTP 요청을 받아 처리하고 응답하는 역할을 수행한다. @RestController@Controller에 데이터(JSON 등)를 직접 반환하는 기능이 추가된 것이다.
    • @Service: 서비스 계층(Service Layer)을 담당한다. 애플리케이션의 핵심 비즈니스 로직을 처리하며, 보통 트랜잭션 관리도 이 계층에서 이루어진다.
    • @Repository: 데이터 접근 계층(Data Access Layer)을 담당한다. 데이터베이스에 접근하는 코드를 처리하며, DB 관련 예외를 스프링의 일관된 예외로 변환해주는 기능이 포함되어 있다.
    • @Configuration: 자바 기반의 설정 파일임을 명시할 때 사용한다. @Bean과 함께 쓰여 수동으로 빈을 등록하는 역할을 한다.


    각 역할에 맞는 애너테이션을 사용하면 코드의 의도가 명확해지고, 스프링이 제공하는 추가적인 혜택까지 누릴 수 있다.

  2. 자바 설정 파일에 직접 등록하기

    컴포넌트 스캔으로는 등록할 수 없는 외부 라이브러리의 클래스나, 좀 더 세밀한 설정이 필요할 때 사용하는 방법이다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     // 이 클래스는 '설정 정보'를 담고 있음을 알린다.
     @Configuration
     public class AppConfig {
    
         // 이 메서드가 반환하는 객체를 스프링 빈으로 등록해달라는 의미
         @Bean
         public MyCustomObject myCustomObject() {
             return new MyCustomObject();
         }
     }
    


    설정 정보를 담을 클래스에 @Configuration 애너테이션을 붙인다.

    해당 클래스 내부에, 빈으로 등록하고 싶은 객체를 반환하는 메서드를 만들고 그 위에 @Bean 애너테이션을 붙인다.



Bean 생명주기


스프링 컨테이너에 등록된 빈은 우리 눈에 보이지 않는 곳에서 자신만의 생명주기를 가진다.

  1. 생성 : 스프링 컨테이너가 시작될 때, 설정 정보를 바탕으로 빈 객체를 생성한다.

  2. 의존성 주입 : 생성된 빈 중에서 서로 의존 관계가 있는 것들을 찾아 연결(주입)해준다. (@Autowired 등이 이 단계에서 동작)

  3. 초기화 : 모든 의존성 주입이 끝나면, 빈을 사용하기 전에 필요한 초기화 작업을 수행할 수 있다.

  4. 사용 : 애플리케이션이 동작하는 동안, 개발자는 컨테이너에 있는 빈을 가져다가 사용한다.

  5. 소멸 : 스프링 컨테이너가 종료될 때, 컨테이너가 관리하던 모든 빈도 함께 소멸된다.

이 모든 과정을 스프링 컨테이너가 관리해주기 때문에, 개발자는 객체의 생성이나 소멸 시점에 대해 크게 신경 쓰지 않고 비즈니스 로직에만 집중할 수 있다.



공부자료
그림으로 배우는 스프링 6
인프런 - 김영한 스프링 로드맵

This post is licensed under CC BY 4.0 by the author.