스프링 컨테이너와 빈

이영섭·2024년 11월 12일

스프링 컨테이너

Spring 어플리케이션의 핵심으로, Bean의 생명주기를 관리하고 의존성 주입을 처리한다.

[ 주요 유형 ]

  1. BeanFactory (기본 컨테이너)
  2. ApplicationContext (BeanFactory의 확장판, 더 많이 사용됨)

[ 주요 기능 ]

  1. Bean 생성 및 관리
  2. 의존성 주입
  3. Bean 스코프 관리
  4. 생명주기 관리

[ 컨테이너의 기본 동작 ]

설정 클래스 로딩 → Bean 정의 스캔 → Bean 객체 생성 → 의존성 주입 → 초기화 콜백 → 애플리케이션 실행 → 소멸 전 콜백 → 컨테이너 종료

[ 주의사항 ]

DI(Dependency Injection)은 IoC(Inversion of Control)를 구현하는 방법 중 하나이다. (둘이 같은 개념은 아니다.)
Spring은 IoC를 DI를 통해 구현하는 대표적인 프레임워크

@Configuration

Spring의 설정 클래스임을 나타내는 어노테이션
이 어노테이션이 붙은 클래스 안에서 @Bean을 통해 빈을 등록할 수 있다.

@Configuration
public class AppConfig {
    
    @Bean
    public UserService userService() {
        return new UserService(userRepository());
    }
    
    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }
}

[ 주요 특징 ]

  1. 싱글톤 보장
  2. 프로파일 설정
    • @Profile 어노테이션과 함께 사용하여 환경별 다른 설정 가능
  3. 조건부 설정
    • @Conditional 계열의 어노테이션과 함께 사용
    • 특정 조건에 따라 빈을 생성할지 말지 결정 가능

[ 주의 사항 ]

  1. @Configuration 클래스는 반드시 public 이어야 함
  2. 기본 생성자가 필요
  3. @Bean 메서드는 private이면 안 됨
  4. @Configuration 없이 @Bean만 사용하면 싱글톤 보장이 안 됨

싱글톤 패턴

스프링 컨테이너가 생성한 빈 객체는 싱글톤 객체이다.
@Bean 이 붙은 메서드에 대해 한 개의 객체만 생성

getBean()

해당 메서드를 통해서 스프링 컨테이너가 관리하는 빈 객체를 알 수 있다.
인자로는 2개가 들어가며,
첫번째 파라미터로는 빈의 이름(메서드명), 두번째 파라미터로는 빈의 리턴 타입.

파라미터를 잘못 입력했을 때 발생하는 Exception 들 :

  1. 존재하지 않은 빈 이름을 사용했을 시 - NoSuchBeanDefinitionException
  2. 빈의 이름과 빈의 리턴타입이 안맞는 경우 - BeanNotOfRequiredTypeException
  3. 오버로딩된 getBean()메서드는 하나의 인자만 받을 수 도 있다. 이 때 같은 타입의 빈 객체가 두 개 이상 존재하면 - NoUniqueBeanDefinitionException

모든 객체를 빈 객체로 등록하게 된다면?

  • 모든 객체를 빈으로 등록하면 메모리 사용량 증가
  • 애플리케이션 시작 시간 지연
  • 불필요한 의존성 관리로 인한 복잡도 증가

결론 : 의존 주입 대상만 스프링 빈으로 등록하자!!!!

참고

책 - 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문
Claude.ai

profile
성장과 발전에는 열려있고, 안주와 정체에는 닫혀있는 개발자 이영섭입니다.

0개의 댓글