개발
자바 스프링 개발 시작하기 - 8일차 IoC·DI와 Bean 생명주기
스택큐힙리스트
2025. 7. 14. 18:02
반응형
1. 왜 IoC와 DI인가?
- IoC(제어의 역전) : 객체 생성과 의존성 관리 책임을 개발자가 아니라 스프링 IoC 컨테이너에게 넘겨 비즈니스 로직에만 집중하도록 돕는다.
- DI(의존성 주입) : 필요한 의존 객체를 컨테이너가 주입한다. 생성자 주입을 기본으로 쓰면 불변·테스트 용이성·순환 참조 방지 효과가 크다.
2. Bean 생명주기의 큰 흐름
- 인스턴스화 (new)
- 의존성 주입 (필드·세터·생성자)
- 초기화 콜백 @PostConstruct 혹은 InitializingBean.afterPropertiesSet()
- 사용 (요청 처리)
- 소멸 직전 콜백 @PreDestroy 혹은 DisposableBean.destroy()
스프링은 초기화·종료 시점을 자동 감지해 콜백을 실행하므로, DB 커넥션 풀 준비·캐시 비우기처럼 리소스 관리 코드를 이곳에 넣는다.
3. XML-free Java Config로 Bean 등록 실습
// AppConfig.java
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
@Bean
public HelloService helloService() { // 빈 이름 기본: helloService
return new HelloService();
}
}
// HelloService.java
@Slf4j
public class HelloService {
@PostConstruct
public void init() {
log.info("🎉 Bean 초기화 완료!");
}
public String greet() {
return "Hello, Spring!";
}
@PreDestroy
public void close() {
log.info("💤 Bean 소멸 직전 정리 작업");
}
}
// Main.java
public class Main {
public static void main(String[] args) {
try (AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppConfig.class)) {
HelloService hello = ctx.getBean(HelloService.class);
System.out.println(hello.greet());
} // 컨텍스트가 AutoCloseable → 종료 시 @PreDestroy 호출
}
}
포인트
- @Configuration 이 붙은 클래스 자체도 Bean.
- @Bean 메서드 리턴 객체가 컨테이너에 등록된다.
- XML 없이도 타입 안전·리팩터링 친화적 설정이 가능하고, IDE 자동완성·컴파일 타임 검증 혜택이 크다.
4. 오늘의 핵심 정리
- IoC → 제어 주체를 프레임워크로 이동.
- DI → 의존성 주입으로 느슨한 결합·테스트 용이.
- Bean 생명주기 → 초기화·종료 훅으로 리소스 관리.
- Java Config → 타입 안전·XML-free 설정, @Configuration + @Bean.
반응형