woowacourse-study / 2022-cs-plant

cs 씨앗을 심기 위한 repository 입니다.
7 stars 1 forks source link

DI & IoC #24

Open summerlunaa opened 1 year ago

summerlunaa commented 1 year ago

DI & IoC

용어 정리

DI (Dependency Injection, 의존성 주입)

DI 방법

  1. 생성자 주입 (권장)
    • 생성자 호출 시 외부로부터 의존성을 받는 방법
    • 생성자 주입을 사용하면 필드를 final로 만들 수 있고 불변을 보장할 수 있다.
    • 생성시 의존성을 바로 주입하므로 NullPointerException을 방지할 수 있다. 컴파일 타임에 순환 참조를 순환 참조도 방지할 수 있다.
    • 생성자의 파라미터 개수가 많을 경우 각 인자가 어떤 의존 객체를 설정하는지 알아내기 위해 생성자의 코드를 확인해야 한다는 단점이 있다.
  2. Setter 주입
    • 의존성을 입력 받는 setter 메서드 사용
    • 빈(empty) 생성자나 빈 정적 팩토리 메서드가 필요하다. 때문에 final 필드를 만들 수 없고 불변을 보장할 수 없다. 의존성을 선택적으로 주입하고 싶거나 수정할 필요가 있을 때 유용하지만 NPE가 발생할 가능성이 존재한다.
  3. Interface 주입

    • 의존성을 받는 메서드를 포함한 인터페이스를 작성하고 이 인터페이스를 구현하여 실행 시 메서드를 사용한다.
    • setter 주입처럼 외부에서 메서드 호출을 통해 의존성을 주입받는 것은 같지만, 인터페이스를 통해 구현을 강제한다는 차이가 있다.
    • 객체의 관계를 일일이 설정해야 한다.
    • 의존성 분리 : DIP 이용

    상위계층이 하위계층에 의존하는 상황을 Interface를 이용해 분리한다.

Spring DI

적절하게 책임과 관심이 다른 코드를 분리하고, 서로 영향을 주지 않도록 다양한 추상화 기법을 도입하고, 애플리케이션 로직과 기술/환경을 분리하는 등의 작업은 갈수록 복잡해지는 엔터프라이즈 애플리케이션에는 반드시 필요하다. 이를 위한 핵심적인 도구가 바로 스프링이 제공하는 DI다. 스프링의 DI가 없었다면 인터페이스를 도입해서 나름 추상화를 했더라도 적지 않은 코드 사이의 결합이 남아있게 된다.

스프링이 DI에 담긴 원칙과 이를 응용하는 프로그래밍 모델을 자바 엔터프라이즈 기술의 많은 문제를 해결하는 데 적극적으로 활용하고 있기 때문이다. 또, 스프링과 마찬가지로 스프링을 사용하는 개발자가 만드는 애플리케이션 코드 또한 이런 DI를 활용해서 깔끔하고 유연한 코드와 설계를 만들어낼 수 있도록 지원하고 지지해주기 때문이다.

→ 자바를 객체 지향, 프로그래밍 원칙에 맞게 쓰기 위해 스프링(di)을 사용한다.

Spring DI 방법

  1. 필드 주입
    • 주입받고자 하는 필드 위에 어노테이션을 붙인다.
    • 하지만 필드 주입을 사용하면 테스트 등의 이유로 수동으로 의존성 주입을 하고 싶어도 하지 못한다. 따라서 의존성을 주입받아야 하는 객체가 프레임워크에 강하게 종속된다.
  2. setter 주입
    • setter 메서드에 어노테이션을 붙인다.
  3. 생성자 주입
    • 생성자 위에 어노테이션을 붙인다. 생성자가 하나인 경우 생략 가능하다.

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

Bean

Bean Factory

Application Context

Servlet Container

Container or IoC Container

DI를 사용하지 않았을 때의 문제점

0. dao, service 등을 static 키워드를 통해 구현한다.

1. 생성자 주입

2. 인터페이스로 생성자 주입

DI 컨테이너를 사용하여 문제점들을 모두 해결하자!

DI Container

jaeyeonling commented 1 year ago

여긴 예상 질문 없나요? ㅋㅋ