◇ PART · SPRING

IoC — 제어 역전

Java와 Spring의 철학 — 읽기 자료

📍 지금 어디를 만지고 있나요?
브라우저
Tomcat
Spring 컨테이너
Controller
DB

이 차시의 핵심 용어

IoC (Inversion of Control)객체의 생성·소멸·관리를 개발자가 아닌 외부 컨테이너가 담당하는 설계 원칙. 「제어 역전」.
Spring 컨테이너IoC 를 실제로 구현해주는 Spring 의 핵심 부품. ApplicationContext 가 대표 인터페이스.
BeanSpring 컨테이너가 관리하는 객체. 우리가 만든 클래스를 컨테이너에 등록하면 Bean 이 됨.

1. 답답함의 정체

전 차시에서 우리는 new 직접 생성이 만드는 강한 결합을 직접 경험했습니다. 부품 교체가 어려운 이유는 — 클래스가 자기 객체를 자기가 만들기 때문입니다.

발상의 전환

"내가 직접 만든다" → "누가 만들어준다". 누가? 외부의 누군가가요.

2. IoC — 제어 역전

「내가」 → 「외부에서」

객체의 생성·관리 권한을 개발자에서 외부 컨테이너로 넘기는 설계 원칙. 제어권이 뒤집혔다고 해서 「Inversion of Control = 역전」.

3. 비유 — 택시 뒷좌석

기존 방식 IoC 방식
내가 운전자
핸들을 잡고 직접 운전
길 막히면 내가 새 길 찾기

= 객체를 직접 new
나는 뒷좌석 손님
목적지만 말함
택시(컨테이너) 가 알아서 운전

= 컨테이너가 객체 관리

4. 코드의 변화

BEFORE — 직접 new

class OrderService {
    private MailSender mail = new GmailSender();
    // 내가 직접 만들고 관리
}

AFTER — IoC

class OrderService {
    private MailSender mail;
    // 받기만 한다 — 만드는 건 컨테이너가
}

new 가 사라졌습니다. 「누가 객체를 만들어주는지」를 클래스 안에서는 모릅니다. 이게 IoC 의 핵심 — 제어권을 위임한다는 것입니다.

5. 누가 만들어주는가?

Spring 컨테이너가 합니다. 애플리케이션 시작 시:

  1. 컨테이너가 우리 코드를 스캔
  2. 등록할 클래스(@Component, @Service 등) 발견
  3. 각 클래스의 인스턴스를 미리 만들어 보관
  4. 필요한 곳(다른 클래스의 필드)에 자동 주입

이 컨테이너가 관리하는 객체를 Bean 이라 부릅니다. 다음 차시에서 실제 코드로.

6. 효과

7. Before / After

전 차시 끝

강한 결합의 답답함을 체감했다.

이번 차시 끝

「제어권을 외부 컨테이너에 위임」하면 풀린다는 발상을 안다.