Spring 기초

이지예·2026년 4월 9일

개발

목록 보기
4/58

Spring의 IoC와 DI + Bean 생명주기 정리


1. IoC란? (Inversion of Control, 제어의 역전)

✔ 한 줄 정의

객체의 생성과 관리를 개발자가 아닌 Spring 컨테이너가 담당한다


✔ 문제 상황 (IoC 적용 전)

public class OrderService {
    private PaymentService paymentService;
    private EmailService emailService;

    public OrderService() {
        this.paymentService = new PaymentService(); // 직접 생성
        this.emailService = new EmailService();     // 직접 생성
    }
}

###문제점

  • OrderService가 PaymentService를 직접 생성
  • 구현체 변경 시 OrderService 코드 수정 필요
  • 객체 간 결합도가 높아짐

✔ IoC 적용 후

@Service
public class OrderService {
    private final PaymentService paymentService;

    // Spring이 객체를 생성해서 넣어줌
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

✅ 핵심 변화

  • 객체 생성 책임 → Spring
  • 개발자는 "필요한 객체"만 선언

👉 이것이 IoC (제어의 역전)


2. IoC 컨테이너와 Bean

✔ IoC 컨테이너란?

객체를 생성하고, 연결하고, 관리하는 공간
→ ApplicationContext


✔ Bean이란?

Spring 컨테이너가 관리하는 객체


✔ Bean 등록 방법

@Component   // 일반 컴포넌트
@Service     // 비즈니스 로직
@Repository  // DB 접근
@Controller  // 웹 요청 처리

✔ @Component vs @Bean

// @Component → 클래스 자체를 Bean 등록
@Component
public class MyComponent {}

// @Bean → 메서드 반환 객체를 Bean 등록
@Configuration
public class AppConfig {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

3. DI란? (Dependency Injection, 의존성 주입)

✔ 한 줄 정의

IoC를 구현하는 방법으로, 필요한 객체를 외부에서 주입받는 것


✔ 의존성이란?

public class OrderService {
    private PaymentService paymentService; // 의존성
}

👉 OrderService는 PaymentService 없으면 동작 불가


4. DI 주입 방식 3가지

① 생성자 주입 (Constructor Injection)

@Service
public class OrderService {

    private final PaymentService paymentService;

    // 생성자가 하나면 @Autowired 생략 가능
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

✔ Lombok 사용

@Service
@RequiredArgsConstructor
public class OrderService {
    private final PaymentService paymentService;
}

✅ 특징

  • final 사용 가능 (불변성 보장)
  • 테스트 용이
  • 가장 권장되는 방식

② Setter 주입 (Setter Injection)

@Service
public class OrderService {

    private PaymentService paymentService;

    @Autowired
    public void setPaymentService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

✅ 특징

  • 선택적 의존성에 사용

③ 필드 주입 (Field Injection)

@Service
public class OrderService {

    @Autowired
    private PaymentService paymentService;
}

###문제점

  • final 사용 불가
  • 테스트 어려움
  • 순환 참조 발견 어려움

5. Spring Bean 생명주기

✔ 한눈에 보기

객체 생성 → 의존성 주입 → 초기화 → 사용 → 소멸

6. 단계별 설명

1️⃣ Bean 생성

public class MyBean {
    public MyBean() {
        System.out.println("Bean 생성");
    }
}

👉 아직 의존성 주입 안 된 상태


2️⃣ 의존성 주입

@Autowired
private MemberService memberService;

👉 이 단계 이후 정상 동작 가능


3️⃣ 초기화 콜백

✔ @PostConstruct

@PostConstruct
public void init() {
    System.out.println("초기화 완료");
}

✔ InitializingBean

@Override
public void afterPropertiesSet() {
    System.out.println("초기화");
}

✔ init-method

@Bean(initMethod = "init")
public MyBean myBean() {
    return new MyBean();
}

4️⃣ Bean 사용

public void businessLogic() {
    System.out.println("비즈니스 로직 실행");
}

👉 실제 서비스 로직 실행


5️⃣ 소멸

✔ @PreDestroy

@PreDestroy
public void destroy() {
    System.out.println("Bean 소멸");
}

✔ DisposableBean

@Override
public void destroy() {
    System.out.println("소멸");
}

✔ destroy-method

@Bean(destroyMethod = "close")
public MyBean myBean() {
    return new MyBean();
}

7. 생명주기 흐름 정리

생성자 호출
   ↓
의존성 주입
   ↓
@PostConstruct
   ↓
(비즈니스 로직 실행)
   ↓
@PreDestroy

8.Q&A

Q1. Bean 생명주기 설명해보세요

Spring Bean은 컨테이너에 의해 생성되고, 의존성 주입 후 초기화 과정을 거친 뒤 사용되며, 컨테이너 종료 시 소멸됩니다.


Q2. 초기화 메서드 실행 시점은?

의존성 주입이 완료된 이후 실행됩니다.


profile
github: @dlwldP

0개의 댓글