스택큐힙리스트

자바 스프링 개발 시작하기 - 8일차 IoC·DI와 Bean 생명주기 본문

개발

자바 스프링 개발 시작하기 - 8일차 IoC·DI와 Bean 생명주기

스택큐힙리스트 2025. 7. 14. 18:02
반응형

1. 왜 IoC와 DI인가?

  • IoC(제어의 역전) : 객체 생성과 의존성 관리 책임을 개발자가 아니라 스프링 IoC 컨테이너에게 넘겨 비즈니스 로직에만 집중하도록 돕는다.
  • DI(의존성 주입) : 필요한 의존 객체를 컨테이너가 주입한다. 생성자 주입을 기본으로 쓰면 불변·테스트 용이성·순환 참조 방지 효과가 크다.

2. Bean 생명주기의 큰 흐름

  1. 인스턴스화 (new)
  2. 의존성 주입 (필드·세터·생성자)
  3. 초기화 콜백 @PostConstruct 혹은 InitializingBean.afterPropertiesSet()
  4. 사용 (요청 처리)
  5. 소멸 직전 콜백 @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.
반응형
Comments