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

박병주·2023년 1월 10일
0

제어의 역전(Inversion of Control)

프로그램의 흐름을 개발자가 직접 제어하는 것이 아닌 외부에서 제어 및 관리

프레임워크를 사용하면 객체의 생명 주기를 모두 프레임워크에 위임할 수 있다. 즉, 외부 라이브러리가 프로그래머가 작성한 코드를 호출하고, 흐름을 제어한다.

IoC는 클래스 간의 결합을 느슨하게 해 테스트와 유지 관리를 더 쉽게 하는 설계(design) 원칙이다.

IoC가 구현된 예는 다음 세 가지가 있다.

  • Dependency Injection (의존성 주입)
  • Service Locator Pattern (서비스 로케이터 패턴)
  • Event-driven Programs, as opposed to Sequential Programs (이벤트 드리븐 프로그램)

의존성 주입(Dependency Injection, DI)

A 객체가 B객체의 메서드를 필요로 할 때 A클래스 안에 B클래스 생성자를 사용해 B의 인스턴스를 만들어 사용하는 대신, 의존성 주입은 다음 세 가지 방법 중 하나를 써서 B클래스가 A클래스에 주입되도록 한다.

  • 생성자 주입
  • Setter 주입
  • 인터페이스 주입

Service Locator Pattern

서비스 로케이터 패턴에는 애플리케이션이 제공하는 모든 서비스에 대한 정보를 담고 있는 서비스 로케이터 객체가 있다. 인스턴스를 생성할 때 서비스는 서비스 로케이터에 자신을 등록한다. 클라이언트로부터 요청을 받으면 서비스 로케이터가 필요한 작업을 수행하고 필요한 값을 반환한다. 이 패턴 역시 의존 클래스 간의 결합을 느슨하게 한다.

스프링 프레임워크와 IoC

개발자가 가지고 있어야 할 객체의 생명주기 제어권이 컨테이너에게 넘어갔다는 의미에서 제어가 역전되었다고 한다. 스프링 컨테이너는 프로그램 내 객체의 라이프사이클을 인스턴스로 만들어 관리한다. 사용자는 configuration 파일에서 애플리케이션에 필요한 객체 및 의존성에 대한 정보를 제공한다. 이 파일은 다음 세가지 중 하나일 수 있다.

  • XML
  • Java Annotations
  • Java code

IoC의 장점

  • 애플리케이션 코드의 양을 줄일 수 있다.
  • 클래스 간의 결합을 느슨하게 한다.
  • 애플리케이션의 테스트와 유지 관리를 쉽게 해 준다.
profile
Developer

0개의 댓글