[CS] DI와 IoC

khj·2025년 1월 23일

Computer Science

목록 보기
15/25
post-thumbnail

1. DI와 IoC란 무엇인가?

DI(Dependency Injection)와 IoC(Inversion of Control)는 소프트웨어 설계 원칙으로, 코드의 유연성과 유지보수성을 높이기 위한 중요한 개념입니다. DI는 IoC의 구현 방법 중 하나로 간주됩니다.

DI(Dependency Injection) - 의존성 주입

  • DI는 객체가 의존하고 있는 다른 객체를 직접 생성하지 않고, 외부에서 주입받는 방식입니다.
  • IoC를 실현하는 한 가지 방법으로, 코드 간의 결합도를 낮추고 테스트 가능성을 높입니다.

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

  • IoC는 프로그램의 흐름 제어 권한을 개발자가 아닌 프레임워크나 외부 컨테이너가 관리하도록 하는 디자인 패턴입니다.
  • 객체가 스스로 의존성을 관리하지 않고, 외부에서 이를 주입받아 사용합니다.
  • 일반적으로 제어권이 개발자로부터 프레임워크로 넘어가는 방식으로 설명됩니다.

2. IoC와 DI의 관계

IoC는 소프트웨어 설계 원칙(패러다임)이며, DI는 이를 구현하는 구체적인 방법 중 하나입니다.
IoC는 "제어를 외부로 넘긴다"라는 큰 개념이고, DI는 "의존성을 외부에서 주입받는다"는 구체적인 기법입니다.

3. 왜 DI와 IoC가 중요한가?

  • 결합도 감소: 객체 간의 의존성이 줄어들어 코드 변경이 용이해집니다.
  • 유지보수성 향상: 새로운 의존성을 추가하거나 기존 의존성을 수정하기 쉬워집니다.
  • 테스트 용이성: Mock 객체를 주입하여 단위 테스트를 쉽게 수행할 수 있습니다.
  • 유연성 증가: 런타임 시 다양한 의존성을 주입하여 동적으로 객체를 구성할 수 있습니다.

4. DI(의존성 주입)의 종류

DI는 의존성을 주입하는 방식에 따라 다음과 같이 구분됩니다:

종류 설명 예시
생성자 주입 객체를 생성할 때 의존성을 생성자의 매개변수로 전달받습니다.
public Service(Repository repository) {
    this.repository = repository;
}
세터 주입 객체를 생성한 후, 세터 메서드를 통해 의존성을 주입받습니다.
public void setRepository(Repository repository) {
    this.repository = repository;
}
인터페이스 주입 의존성을 주입하기 위한 별도의 인터페이스를 구현하여 주입받습니다.
public interface ServiceInjector {
        void inject(Service service);
} 

### 5. IoC 컨테이너란? IoC 컨테이너는 객체의 생성과 의존성 주입을 관리하는 도구로, 대표적으로 Spring Framework에서 사용됩니다. IoC 컨테이너는 다음과 같은 역할을 합니다:
  • 객체 생성 및 관리
  • 의존성 주입 수행
  • 객체 간의 라이프사이클 관리

6. Spring Framework에서 DI와 IoC의 구현

Spring Framework는 IoC와 DI를 효과적으로 구현할 수 있는 프레임워크입니다.

  • IoC 컨테이너: Spring에서는 ApplicationContext가 IoC 컨테이너 역할을 합니다.
  • DI 구현: XML 설정 파일, 애너테이션, 또는 Java Config를 통해 의존성을 주입합니다.


    예제: 애너테이션 기반 DI
@Component
public class Repository {}

@Service
public class Service {
    private final Repository repository;

    @Autowired
    public Service(Repository repository) {
        this.repository = repository;
    }
}

### 7. DI와 IoC의 장점과 단점
장점 단점
결합도가 낮아 코드 변경 및 확장이 용이함 DI 컨테이너 설정이 복잡할 수 있음
테스트 작성이 쉬워짐 디버깅이 어려울 수 있음
객체 생성을 관리하여 효율성을 높임 학습 곡선이 존재함
profile
Spring, Django 개발 블로그

0개의 댓글