제어의 역전(Inversion of Control)이란 무엇일까?
제어의 역전, IoC(Inversion of Control)는 객체 지향 프로그래밍에서 역방향 제어를 지원하는 소프트웨어 설계 원리입니다. 여기서 통제는 일차적인 책임 외에 계급이 지어야 할 어떤 추가적인 책임입니다. 프로그램의 객체(Object) 또는 부분(Cokmponent)에 대한 제어권을 컨테이너나 프레임워크로 전송하는 소프트웨어 엔지니어링의 원칙입니다. 자바 프로그래밍에서는 객체 지향 프로그래밍의 맥락에서 가장 많이 사용합니다.
사용자 지정 코드가 라이브러리에 호출하는 기존 프로그래밍과 달리, IoC는 프레임워크가 프로그램 흐름을 제어하고 사용자 지정 코드를 호출할 수 있도록 합니다. 이 기능을 사용하기 위해 프레임워크는 추가적인 동작이 내장된 추상화를 사용합니다. 고유한 동작을 추가하려면 프레임워크의 클래스를 확장하거나 자체 클래스를 플러그인으로 연결해야 합니다. 이 아키텍처의 장점은 다음과 같습니다.
- 작업의 실행과 그 구현을 분리시킬 수 있다.
- 서로 다른 구현 간에 쉽게 전환할 수 있도록 한다.
- 프로그램의 모듈성(컴퓨터 과학에서, 프로그램이 모듈이라는 부분으로 나뉘어 작성될 때 나타나는 특성)을 높인다.
- 컴포넌트를 분리하거나 의존성을 주입함으로써, 컴포넌트가 계약을 통해 소통할 수 있도록 해, 프로그램 테스트의 용이성을 높입니다.
전략 설계 패턴, 서비스 로케이터 패턴, 공장 패턴, 의존성 주입(DI) 등의 다양한 메커니즘을 통해 제어의 반전을 달성할 수 있습니다.
의존성 주사란 무엇입니까?
IoC(제어의 역전)을 구현하기 위해 사용하는 패턴 중의 하나로, 객체의 의존성을 셋팅함으로써 제어를 역전시킵니다. 객체를 다른 객체와 연결하거나, 또는 하나 혹은 다수의 객체를 다른 객체들에게 "주입"하는 것은 객체들 스스로가 아니라 어셈블러에 의해 수행됩니다.
다음은 기존의 전통적인 프로그래밍에서 객체의 의존성을 생성하는 방법입니다.
public class Store {
private Item item;
public Store() {
item = new ItemImpl1();
}
}
위의 예에서는 Store 클래스 자체 내에서 Item 인터페이스의 구현을 인스턴스화해야 합니다. 이때, DI를 사용하면 원하는 항목의 구현을 지정하지 않고 예제를 다시 작성할 수 있습니다.
public class Store {
private Item item;
public Store(Item item) {
this.item = item;
}
}
다음 섹션에서는 메타데이터를 통해 아이템의 구현을 제공하는 방법에 대해 알아보겠습니다.
IoC와 DI는 모두 단순한 개념입니다. 하지만 시스템 구성 방식에 깊은 함의를 가지고 있기 때문에 시간을 들여 충분히 이해해야 할 가치가 있습니다.
IoC 컨테이너는 IoC를 구현하는 프레임워크의 일반적인 특성입니다. 스프링 프레임워크에서 ApplicationContext 인터페이스는 IoC 컨테이너를 나타냅니다. 스프링 컨테이너는 빈이라고 하는 객체를 인스턴스화, 구성 및 조립하고 생애 주기를 관리하는 역할을 합니다. 스프링 프레임워크는 ApplicationContext 인터페이스의 몇 가지 구현을 제공합니다. 단독 실행형 어플리케이션의 경우 ClassPathXmlApplicationContext 및 FileSystemXmlApplicationContext가, 웹 어플리케이션의 경우 WebApplicationContext가 그 역할을 합니다.
빈들을 조립하기 위해 스프링 컨테이너는 XML 구성(configuration) 또는 어노테이션(annotaition)의 형태로 구성 메타데이터를 사용합니다. 컨테이너를 수동으로 인스턴스화하는 한 가지 방법은 다음과 같습니다.
ApplicationContext context
= new ClassPathXmlApplicationContext("applicationContext.xml");
위의 예에서 아이템의 속성을 설정하기 위해 메타데이터를 사용할 수 있습니다. 그런 다음 컨테이너는 메타데이터를 읽고 이를 런타임에 빈들을 조립하는 데 사용합니다. 스프링의 의존성 주입은 생성자(constructor), 설정자(setter) 또는 필드(field)를 통해 수행할 수 있습니다.
이 글은 Baeldung.com의 게시물을 학습 목적으로 번역 및 편집한 게시물입니다.
저작권은 원 저작자 Loredana Crusoveanu 와 Baeldung에 있습니다.
https://www.baeldung.com/inversion-control-and-dependency-injection-in-spring
'Java' 카테고리의 다른 글
자바 스프링 CORS error 해결하기 (0) | 2021.11.27 |
---|---|
스프링 프레임워크와 제어 역전, 의존성 주입 🍃-02 (0) | 2021.11.09 |
레이어드 아키텍처와 각 계층의 역할 (0) | 2021.11.08 |
객체지향의 기본 다시 다지기 - 01 (0) | 2021.11.08 |
<JAVA> DTO가 뭐예요? 꼭 써야 하나요? (0) | 2021.11.08 |
댓글