IoC와 DI

SeungJoo
|2023. 11. 6. 12:26
728x90

IoC (Inversion of Controle)

프로그램의 흐름 제어가 응용 프로그램 코드에서 프레임워크나 컨테이너로 반전되거나 이동되며 여러 함수를 호출하고 객체의 수명주기를 관리하는 대신 프레임 워크가 제어를 가져가고 적절한 시점에서 코드를 호출하게 됩니다.

IoC는 느슨한 결합과 모듈성을 촉진하여 코드를 유지 보수를 가능하게 합니다.

public class A {
    b = new B();
}

IoC 사용 후

public class A {
    private B b;
}

느슨한 결합

소프트웨어 컴포넌트 간의 상호 의존성을 최소화하고 독립성을 높이는 소프트웨어 설계 원칙!

public class MemoService {
    private final MemoRepository memoRepository;
    public MemoService(MemoRepository memoRepository) {
        this.memoRepository = memoRepository;
    }

 

장점

  • 컴포넌트의 변경이 다른 컴포넌트에 미치는 영향을 최소화하기에 유지 보수가 용이합니다.
  • 독립적으로 재사용 가능하며, 다른 프로젝트에서도 재사용할 수 있습니다.
  • 새로운 기능을 추가하거나 기존 기능을 확장하기 쉽습니다.

[이미지 출처] : 1분 만에 이해하는 ‘느슨한 결합 원칙’ - HyunHo Shin - Medium /왼쪽 느슨한 결합 / 오른쪽 강한 결합

강한 결합

컴포넌트 간의 상호 의존성이 높고 서로 강하게 결합된 상태를 나타냅니다.

public class MemoService {
    private final MemoRepository memoRepository;
    public MemoService(JdbcTemplate jdbcTemplate) {
        this.memoRepository = new MemoRepository(jdbcTemplate);
    }

 

장점

  • 두 개 이상의 컴포넌트 간의 상호 작용을 직접적으로 나타내기에 코드가 간결합니다.

DI(Dependency Injection)

클래스가 외부 소스에서 필요한 종속성을 제공하는 방법으로 주로 생성자 주입, 메서드 주입을 통해서 수행됩니다.

쉽게 말하면 객체를 관리하기 위해 IoC를 사용하며 IoC를 구현하기 위한 것이 DI입니다.

 

객체 주입

public class A {
    @Autowired
    B b;
}

 

스프링에서는 클래스 A에서 B객체를 쓰고 싶은 경우 객체를 생성하는 것이 아닌 컨테이너에서 주입받아 사용합니다.

 

스프링 컨테이너

스프링 애플리케이션의 객체인 Bean을 생성, 관리, 제어하는 역할을 담당합니다. 빈이 생성되고 소멸되기까지를 스프링 컨테이너에서 관리하게 됩니다.

 

특징

  • 제어의 역전(IoC)의 원칙을 따르며 코드가 객체의 생성과 관리를 스프링 컨테이너에서 합니다.
  • 의존성 주입을 통해 런타임 시에 필요한 의존 객체를 주입합니다. 
  • 싱글톤 스코프를 사용하여 빈을 생성, 관리 합니다.
  • 모듈화와 느슨한 결합을 촉진시킵니다.

빈(Bean)

스프링 컨테이너에 의해 생성, 관리되는 객체를 말하며 스프링 애프리케이션의 핵심 구성 요소입니다.

쉽게 생각하면 스프링의 객체라고 생각할 수 있습니다.

 

728x90

'Spring(Boot & FrameWork)' 카테고리의 다른 글

Entity 연관 관계  (0) 2023.11.09
JPA 영속성  (0) 2023.11.07
서버와 클라이언트  (0) 2023.11.02