안녕하세요. 오늘은 스프링 IoC 컨테이너와 빈 싱글톤에 대해 알아보겠습니다.
1. IoC(Inversion of Control Container)란?
제어의 역전이라는 개념으로, 전통적인 프로그래밍에서 객체의 생성과 관리 및 책임을 개발자가 직접 담당하는 방식에서 벗어나, 제어의 흐름을 프레임워크나 외부 시스템에 맡기는 방식입니다.
IoC 사용하지 않은 경우
public class Car {
private Engine engine;
public Car() {
this.engine = new Engine(); // 직접 주입
}
public void drive() {
entine.run();
}
}
public class Engine {
public void run() {
System.out.println("Engine running...");
}
}
IoC를 사용한 경우
@Component
public class Car {
private Engine engine;
@Autowired
public Car(Engine engine) { // 의존성 주입
this.engine = engine
}
public void drive() {
entine.run();
}
}
@Component
public class Engine {
public void run() {
System.out.println("Engine running...");
}
}
2. IoC 컨테이너란?
스프링에서 객체(빈)를 관리하고 생성, 초기화, 의존성 주입, 소멸 등을 담당하는 핵심 역할을 합니다.
- 객체 생성 : 스프링 애플리케이션에 필요한 객체(스프링 빈)을 생성
- 의존성 주입 (DI) : @Autowired, XML, Java Config 등으로 의존성 주입
- 빈의 생명주기 관리 : 초기화, 소멸 등 라이프사이클 관리
- 빈 검색 : ApplicationContext 또는 BeanFactory를 통해 빈 조회
IoC 컨테이너 주요 구현체
BeanFactory
가장 기본적인 IoC 컨테이너로 지연 초기화를 지원하여 경량 애플리케이션에 적합합니다.
※지원 초기화 : BeanFactory는 빈이 요청될 때만 빈을 초기화
ApplicationContext
BeanFactory를 확장한 IoC 컨테이너로 국제화, 이벤트, AOP, 애플리케이션 라이프사이클 관리 등 추가 기능을 제공하며 실제 개발에서 주로 사용됩니다.
※ 즉시 초기화 : 컨테이너가 초기화될 때 모든 싱글톤 빈을 생성하여 초기 오류를 조기에 발견 가능
3. 스프링 빈(Spring Bean)이란?
IoC 컨테이너에 의해 관리되는 객체로 @Component, @Service, @Repository, @Controller와 같은 어노테이션을 사용하거나, @Bean 메서드로 정의 가능합니다.
스프링 빈은 기본적으로 싱글톤 스코프를 가집니다.
※ 싱글톤 스코프 : 하나의 컨테이너 내의 동일한 빈 인스턴스를 공유
빈 생명주기 (Lifecycle)
생성 : 빈은 애플리케이션 시작 시 IoC 컨테이너에 의해 생성됩니다.
초기화 : 빈이 생성된 후, 필요한 의존성을 주입받고, @PostConstruct 또는 init-method로 초기화 작업을 합니다.
사용 : 빈은 애플리케이션에서 사용됩니다.
소멸 : 애플리케이션 종료 시, @PreDestroy나 destroy-method로 자원 정리 후 빈이 소멸됩니다.
@Component
public class Car {
private final Engine engine;
@Autowired
public Car(Engine engine) {
this.engine = engine;
}
@PostConstruct // 빈 초기화 시 호출
public void init() {
System.out.println("Car is ready to drive!");
}
@PreDestroy // 빈 소멸 시 호출
public void cleanup() {
System.out.println("Cleaning up car...");
}
public void drive() {
engine.run();
}
}
싱글톤과 스프링 빈
스프링이 빈을 기본적으로 싱글톤으로 관리하는 이유
- 메모리 효율성 : 하나의 인스턴스를 공유함으로써 자원 상용량 절약
- 성능 : 빈을 매번 생성하는 오버헤드 제거 (빈 생성 시간이 오래 걸림)
스프링 컨테이너가 내부에 싱글톤 레지스트리를 두고, 빈의 인스턴스를 저장 및 관리합니다.
빈의 스코프를 싱글톤이 아닌 다른 범위로 변경할 수 있습니다.
- 프로토타입 : 요청 시마다 새로운 인스턴스를 생성
- 세션 : HTTP 세션당 하나의 인스턴스가 생성
- 리퀘스트 : HTTP 요청당 하나의 인스턴스가 생성
@Component
@Scope("prototype") // 프로토타입 범위
public class Engine {
public void run() {
System.out.println("Engine running...");
}
}
'🤿백엔드 내실 채우기' 카테고리의 다른 글
[Spring] 스프링 3대 요소 - DI, AOP, PSA 정리 (0) | 2024.11.30 |
---|---|
[Spring] Spring MVC 작동 방식 - DispatcherServlet은 어떤 역할을 하는가? (1) | 2023.10.24 |