본문으로 건너뛰기
Advertisement

1.2 IoC와 DI의 이해 (Understanding IoC & DI)

스프링 프레임워크의 가장 핵심적인 사상인 제어의 역전(IoC)의존성 주입(DI) 에 대해 자세히 알아봅니다.

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

전통적인 프로그래밍 방식에서는 개발자가 사용할 객체를 직접 결정하고 생성(new)하며 흐름을 제어합니다. 하지만 IoC가 적용된 환경에서는 프로그램의 흐름을 관리하는 주체가 개발자에서 프레임워크(스프링)로 바뀝니다.

  • 전통적 방식: "내가 필요한 물건(객체)을 내가 직접 만든다."
  • IoC 방식: "내가 필요한 기능(인터페이스)을 선언만 해두면, 누군가(컨테이너)가 알아서 가져다준다."

2. 의존성 주입 (Dependency Injection, DI)

DI는 IoC를 구현하는 구체적인 방법 중 하나입니다. 객체 간의 의존 관계를 외부(스프링 컨테이너)에서 설정하고 주입해주는 방식입니다.

🚗 자동차와 엔진 예시

자동차(Car)가 엔진(Engine)을 사용한다고 가정해봅시다.

  • 직접 생성 시: 자동차 공장에서 엔진 제조법까지 완벽히 알아야 함 (강한 결합). 엔진이 바뀌면 자동차 공정 전체가 수정됨.
  • 주입(DI) 방식: 자동차는 '엔진'이 필요하다는 규격만 정의함. 외부(조립 라인)에서 완성된 엔진을 자동차에 끼워 넣음 (약한 결합).

3. DI의 장점

  1. 결합도 감소 (Loose Coupling): 클래스 간의 의존성이 낮아져 한 클래스를 수정해도 다른 클래스에 미치는 영향이 최소화됩니다.
  2. 재사용성 증가: 의존하는 객체만 갈아 끼우면 다른 환경에서도 쉽게 재사용할 수 있습니다.
  3. 테스트 용이성: 실제 객체 대신 테스트용 가짜 객체(Mock)를 주입하여 단위 테스트를 수행하기 매우 편리해집니다.

4. 스프링에서의 DI 방식

스프링에서는 주로 다음과 같은 방식으로 의존성을 주입합니다.

  • 생성자 주입 (Constructor Injection): 가장 권장되는 방식. 객체 생성 시점에 의존성을 주입하므로 불변성을 보장합니다.
  • 세터 주입 (Setter Injection): 선택적인 의존성이 필요할 때 사용합니다.
  • 필드 주입 (Field Injection): @Autowired를 사용하여 필드에 바로 주입하지만, 외부에서 변경이 어려워 권장되지 않습니다.

정보

DI의 핵심은 "객체는 자신이 사용할 부품을 스스로 만들지 않고, 외부로부터 제공받는다" 는 것입니다.

Advertisement