본문 바로가기
SPRING/개념

[ 개념 ] 스프링 IOC 컨테이너란? DI 사용이유 작동방식

by hak0205 2023. 2. 10.
반응형

스프링의 IOC(제어의 역전), DI(의존성주입)에 대해서 알아봅니다. IOC는 프로그램의 흐름을 개발자가 직접 관리하는 게 아니라 외부에서 관리하는 것을 말합니다. DI는 객체를 직접 생성하는 게 아니라 외부에서 생성 후 주입시켜 주는 것을 말합니다. IOC컨테이너는 IOC를 생성하고 의존성을 관리합니다.

 

 

IOC 컨테이너

Spring IoC 컨테이너는 IoC(Inversion of Control) 및 DI(Dependency Injection) 기능을 제공하는 Spring 프레임워크의 구성 요소입니다. 

 

객체를 인스턴스화, 구성 및 조립하고 종속성을 관리하는 역할을 합니다. Spring IoC 컨테이너는 구성 메타데이터를 사용하여 생성하는 객체의 수명 주기를 관리하고 해당 종속성을 관리합니다. 이 구성 메타데이터는 XML, 주석 또는 Java 기반 구성을 사용하여 지정할 수 있습니다. 

(메타데이터란? 구성 요소 간의 종속성이 IOC 컨테이너에서 관리되는 방식을 설명하는 추가 정보입니다.)

 

컨테이너는 애플리케이션에서 객체를 생성하고 관리하여 객체가 종속성과 분리될 수 있도록 합니다. 이렇게 하면 객체가 종속 항목 생성 또는 관리에 대해 걱정할 필요가 없으므로 객체가 더 유연하고 유지 관리 및 테스트하기 쉬워집니다. 

 

전반적으로 Spring IoC 컨테이너는 Spring 프레임워크이며 Spring 기반 애플리케이션에서 IoC 및 DI의 이점을 달성하는 데 사용됩니다

 

IOC / DI 사용이유

IOC(Inversion of Control)는 프로그램 흐름에 대한 제어가 애플리케이션 코드에 의해 유지되는 것이 아니라 프레임워크 또는 컨테이너에 제공됩니다. 즉, 프레임워크 또는 컨테이너는 객체를 생성하고 관리하는 역할을 하고 애플리케이션 코드는 단순히 이러한 객체를 사용합니다.

 

DI(Dependency Injection)는 IoC를 달성하기 위한 기술입니다. 여기서 객체의 종속성은 객체 자체에 의해 생성되는 것이 아니라 프레임워크나 컨테이너에 의해 제공됩니다. 즉, 프레임워크나 컨테이너는 객체가 의존하는 객체를 제공하므로 객체가 객체를 생성할 필요가 없습니다.

 

 

작동방식

다음은 IOC 컨테이너가 작동하는 방식을 설명하는 간단한 예입니다.

 

UserService 및 UserRepository를 포함하여 여러 클래스로 구성된 시스템이 있다고 가정합니다.

UserService는 UserRepository에 의존하여 사용자 데이터를 검색합니다. IOC 컨테이너가 없으면 UserRepository를 수동으로 인스턴스화하고 UserService 생성자에 전달해야 합니다.

 

그러나 IOC 컨테이너를 사용하면 UserService가 생성될 때 종속성을 자동으로 생성하고 주입하도록 컨테이너를 구성할 수 있습니다. 컨테이너는 메타데이터를 사용하여 UserService의 종속성을 결정하고 그에 따라 생성합니다.

 

IOC 컨테이너를 사용하는 프로세스와 다음과 같습니다.

  1. UserRepository 및 UserService 구성 요소를 종속성을 설명하는 메타데이터와 함께 컨테이너에 등록합니다.
  2. UserService가 컨테이너에서 요청되면 컨테이너는 메타데이터를 사용하여 UserService의 새 인스턴스를 생성합니다.
  3. 컨테이너는 UserService가 UserRepository에 종속되어 있음을 감지하고 UserRepository의 새 인스턴스를 자동으로 생성합니다.
  4. 컨테이너는 UserService가 UserRepository에 종속되어 있음을 감지하고 UserRepository의 새 인스턴스를 자동으로 생성합니다.
  5. UserService 인스턴스는 완전히 구성되고 사용할 준비가 된 상태로 호출자에게 반환됩니다.

 

IOC 컨테이너 장점

Spring에서 IOC 컨테이너는 객체 생성 및 관리를 담당하고 종속성 주입은 객체에 종속성을 제공하는 데 사용되는 메커니즘입니다. 그래서 Spring에서 Dependency Injection은 IoC를 달성하기 위한 기술입니다. IOC와 DI를 사용하면 다음과 같은 장점이 있습니다.

 

  1. 느슨한 결합 : 스프링 IOC는 객체 간의 느슨한 결합을 가능하게 하여 다른 객체에 영향을 미치지 않고 한 객체를 쉽게 변경할 수 있습니다.
  2. 간편한 테스트 : IOC 컨테이너에서 관리하는 객체는 별도의 설정이나 종속성 없이 분리하여 쉽게 테스트할 수 있습니다.
  3. 유연성 : 응용 프로그램의 객체는 유연한 방식으로 사용자 정의 및 변화하는 요구 사항에 맞게 조정할 수 있습니다.
  4. 코드 복잡성 감소 : Spring IOC는 수동 객체 생성 및 관리의 필요성을 제거하여 코드 복잡성을 줄입니다.
  5. 유지보수성 향상 : Spring IOC는 관심사의 분리를 촉진하여 시간이 지남에 따라 애플리케이션의 유지보수성과 확장성을 향상합니다.
  6. 향상된 모듈성 : 객체는 응용프로그램의 여러 부분에 걸쳐 쉽게 재사용할 수 있으므로 모듈화 및 코드 재사용이 개선됩니다.
  7. 구성 용이성 : 응용프로그램의 객체 구성은 XML, 주석 또는 Java 기반 구성을 사용하여 쉽게 관리할 수 있습니다.

 

IOC 컨테이너 단점

  1. 가파른 학습 곡선 : 특히 프레임워크나 의존성 주입 개념을 처음 접하는 사람들에게 봄 IOC는 배우기가 복잡할 수 있습니다.
  2. 구성 오버헤드 : Spring IOC를 사용하는 데 필요한 구성은 시간이 많이 걸리고 오류가 발생하기 쉬우며, 특히 크고 복잡한 애플리케이션의 경우 그렇습니다.
  3. 성능 오버헤드 : 프레임워크가 객체의 수명 주기를 관리하고 종속성 주입을 수행해야 하기 때문에 Spring IOC를 사용하면 응용 프로그램에 성능 오버헤드를 추가할 수 있습니다.
  4. 디버깅 난이도 : 제어 흐름이 응용 프로그램 코드 대신 프레임워크에 의해 관리되기 때문에 Spring IOC 기반 응용 프로그램의 디버깅 문제는 어려울 수 있다.
  5. 프레임워크에 대한 결합 : 스프링 IOC를 사용하면 응용 프로그램과 프레임워크 간의 긴밀한 결합을 초래하여 다른 종속성 주입 프레임워크로 전환하거나 스프링 생태계 외부에서 응용 프로그램을 사용하는 것이 어려울 수 있습니다.
  6. 초기 설정 비용 : 기존 애플리케이션에서 Spring IOC를 구현하려면 시간이 많이 소요될 수 있으며 애플리케이션 아키텍처의 상당한 리팩터링 및 재설계가 필요할 수 있습니다.

 

감사합니다.

 
 
반응형

댓글