1.3 스프링 컨테이너와 빈 (Spring Container & Bean)
스프링이 객체를 어떻게 관리하고 조립하는지, 그 핵심 주체인 스프링 컨테이너 와 관리 대상인 빈(Bean) 에 대해 알아봅니다.
1. 스프링 컨테이너 (Spring Container)
스프링 컨테이너는 자바 객체의 생성, 의존성 주입, 생명주기 관리 를 담당하는 거대한 창고와 같습니다. 개발자가 new 연산자로 직접 객체를 생성하는 대신, 컨테이너에게 객체 관리를 맡깁니다.
- 핵심 인터페이스:
BeanFactory(최상위 인터페이스),ApplicationContext(가장 널리 쓰이는 부가기능 포함 컨테이너) - 역할: 설정 정보(Java Config, 애너테이션 등)를 바탕으로 객체를 생성하고 서로 연결합니다.
2. 스프링 빈 (Spring Bean)
스프링 컨테이너에 의해 관리되는 자바 객체 를 '빈(Bean)'이라고 부릅니다. 모든 객체가 빈은 아니며, 스프링에게 관리해달라고 명시적으로 등록한 객체들만 빈이 됩니다.
빈 등록 방법
- 애너테이션 기반 (Component Scan): 클래스 위에
@Component를 붙여두면 스프링이 자동으로 찾아서 빈으로 등록합니다.@Controller,@Service,@Repository등은 모두@Component를 포함한 특수 목적용 애너테이션입니다.
- 직접 등록 (Java Config):
@Configuration클래스 내에서 메서드에@Bean을 붙여 직접 리턴 값을 빈으로 등록합니다.
3. 빈의 생명주기 (Lifecycle)
빈은 스프링 컨테이너가 시작될 때 생성되어 컨테이너가 종료될 때까지 관리됩니다.
- 스프링 컨테이너 생성
- 스프링 빈 생성
- 의존관계 주입
- 초기화 콜백: 빈이 사용 준비가 완료됨
- 사용: 애플리케이션 로직 수행
- 소멸 전 콜백: 자원 해제 등 마무리
- 스프링 종료
4. 빈 스코프 (Bean Scope)
스프링 빈은 기본적으로 싱글톤(Singleton) 으로 관리됩니다. 즉, 컨테이너에 딱 하나만 생성되어 어디서든 공유하여 사용합니다.
- 싱글톤 (Default): 스프링 컨테이너당 하나의 인스턴스만 생성
- 프로토타입 (Prototype): 빈을 요청할 때마다 새로운 인스턴스 생성
팁
실무에서는 대부분 싱글톤 방식 을 사용하여 메모리 사용을 최적화하며, 스프링이 객체의 상태를 안전하게 관리할 수 있도록 설계합니다.