Spring Boot 공부 일기 <10> - IOC, DI

이동휘·2024년 8월 19일

Spring Boot

목록 보기
10/21

1. IDE

Intellij

2. 오늘 공부 내용

IOC, DI

IOC(제어의 역전)

  • IOC (Inversion of Control) - 객체의 생성과 의존성 주입에 대한 제어권을 개발자가 아닌 프레임워크나 컨테이너가 갖도록 하는 디자인 원칙

    객체들이 자신이 사용할 의존성을 직접 생성하거나 관리하지 않고 외부에서 주입받도록 하는 구조

  • 주요 개념
  • 제어의 역전: 애플리케이션의 흐름을 개발자가 직접 제어하는 것이 아니라, 프레임워크가 대신 제어합니다.
  • 확장성: 코드의 결합도를 낮추고, 의존성 주입으로 인해 확장성이 높아집니다.
  • 모듈화: IoC를 사용하면 코드의 모듈화가 쉬워지며, 각 모듈 간의 의존성을 명확히 관리할 수 있습니다.

DI(의존성 주입)

  • DI (Dependency Injection) - IOC 구체적인 구현 방법 중 하나
  • 객체가 스스로 의존성을 생성하지 않고, 외부로부터 필요한 의존성을 주입받는 방식
  • 객체 간의 결합도를 줄이고, 코드의 유연성과 테스트 가능성을 높이는 중요한 역할
  • DI 종류

  • Constructor Injection (생성자 주입): 객체 생성 시 생성자를 통해 의존성을 주입받습니다.

public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

장점: 불변성을 보장하고, 모든 의존성을 주입받지 않으면 객체를 생성할 수 없기 때문에 객체의 완전성을 보장합니다.

  • Setter Injection (세터 주입): 객체 생성 후, setter 메서드를 통해 의존성을 주입받습니다.
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
  • 장점: 의존성이 선택적일 때 유용하며, 객체 생성 후에 의존성을 주입할 수 있습니다.
  • 단점: 객체의 불완전한 상태가 발생할 수 있습니다.
  • Field Injection (필드 주입): 필드에 직접 주입하는 방식입니다.
public class UserService {
    @Autowired
    private UserRepository userRepository;
}
  • 장점: 코드가 간결해집니다.
  • 단점: 테스트하기 어려울 수 있고, 의존성 주입을 위한 필드가 private로 설정되면 테스트 시 주입이 복잡해질 수 있습니다.

IOC, DI 의 관계

  • IoC는 제어의 흐름을 개발자에서 프레임워크로 넘기는 큰 개념이고, DI는 그 구현 방식 중 하나
  • DI를 통해 IoC를 실현함으로써 객체의 생성과 의존성 관리를 프레임워크가 담당하게 되어, 코드의 결합도를 낮추고 유지보수성을 높이는 것이 핵심입니다.
  • IoC와 DI의 적용은 객체 간의 강한 결합을 줄이고, 코드의 재사용성, 유지보수성, 그리고 테스트 용이성을 크게 향상시키는 효과를 가져옵니다.

0개의 댓글