본문 바로가기
영상 후기/Spring Boot

영상 후기 - [10분 테코톡] 오찌, 야호의 DI와 IoC

by 올리브영 2023. 4. 27.
728x90
반응형

movie

 

IoC란? - 제어의 역전

 

직접 객체를 생성하여 코드를 "제어"

  • A 클래스에서 B를 필드로 가지고, 생성자 내부에서 직접 생성해 필드를 초기화하고 있다.
  • 이러한 코드를 객체 생명주기를 직접 제어하는 코드라고 할수있다.

 

프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것 - 역전

  • 외부로부터 b인자를 받아서 초기화하고 있다.
  • 이렇게 프로그램의 제어 흐름을 직접 제어하는 것이 아니라, 외부에서 관리하는 것을 제어를 역전시켰다고 말할 수 있다.

 

IoC가 필요한 이유

  • 객체 내부에서 재료의 종류를 제어해 변경에 자유롭지 못하던 코드가 외부에서 제어를 받으면서 변경이 자유로워진다.
  • 객체지향 원칙을 잘 지키기 위해 - 역할과 관심을 분리해 응집도를 높이고 결합도를 낮추며, 이에 따라 변경에 유연한 코드를 작성할 수 있는 구조가 될수있기 때문.
  • 주도권은 빼앗기고, 호출 당하기를 기다리는
  • 내부에서 외부로 역전된 것.
  • 기존메뉴얼로 만든 음식을 받지않고, 내가 원하는 대로 넣는?

 

DIP란?

  • 의존 역전 원칙
    • 상위 레벨의 모듈은 절대 하위 레벨 모듈에 의존하지 않는다. -> 둘 다 추상화에 의존해야 한다.
    • 햄버거(상위레벨)가 치킨패티(하위 레벨)에 의존하면 안된다. 
      • 햄버거(상위레벨)는 패티(인터페이스)에 의존하고 치킨패티도 패티(인터페이스)에 의존.

 

IoC와 DIP의 목적

  • 클래스 간 결합을 느슨히 하기 위함.
  • 한 클래스의 변경에 따른 다른 클래스의 영향을 최소화
    • 애플리케이션을 지속가능하고 확장성 있게 만든다.

 

DI란? - 의존성 "주입"

  • 클래스 간에 의존 관계가 있다는 것 = 한 클래스가 바뀔 때 다른 클래스가 영향을 받는다는 것
  • 의존성 주입이란 의존성을 다른 곳으로부터 주입해주는 것

의존성 주입 전

  • 이탈리안 비엠티와 각 재료들이 강하게 결합되어 있어서  하나라도 변화가 생기면, 이탈리안 비엠티에도 변화가 생긴다. 
  • ex) WhiteBread에 유통기한이란 인자가 필요해진다면, 이탈리안 비엠티 코드에도 변경이 일어난다.

 

의존성 주입을 받으면 변경으로부터 자유로워질 수 있다.

 

 

의존성 주입 패턴

  1. 생성자 주입 - 생성자 호출 시 외부로부터 의존성을 받는 방법

  • 필요한 의존성을 모두 포함하는 생성자를 만들고, 그 생성자를 통해서 의존성을 주입.

 

2. Setter 주입

  • 의존성을 입력받는 setter 메서드를 만들고, 메소드들을 호출해서 의존성을 주입한다.

 

3. Interface 주입

  • 의존성을 주입하는 메서드를 포함한 인터페이스를 작성하고, 이 인터페이스를 구현하도록 함으로써 실행 시에 이를 통하여 의존성을 주입한다. Setter 주입처럼 외부에서 호출해줘야 하는 것은 비슷하지만, 의존성 주입 메소드를 빠뜨릴 수 있는 setter와 다르게 오버라이드를 통해 메서드 구현을 강제함. 

 

Spring DI

  • MemberService라는 의존성을 주입받는 MemberController -> 생성자를 통해 의존성 주입.
  • 특정한 MemberService를 받는 생성자가 어딘가에 호출이 되어야하는데, 이는 스프링이 자동으로 의존성을 주입.

 

자동 주입

  • 스프링은 Bean으로 등록된 객체에 대해 자동으로 인스턴스를 생성해주고, 필요한 의존성이 있으면 자동으로 주입해준다.

 

의존성을 자동으로 주입해주는 방법

 

@Autowired 어노테이션 활용

  • 여기서 주입받을 MemberService도 스프링 Bean이어야 한다.

 

@Autowired를 통해 의존성을 주입받는 방법에는 필드주입, setter 주입, 생성자 주입이 있다.

 

 

1. 필드 주입

  • 필드 주입은 원래는 불가능한 주입을 프레임워크의 힘을 빌려서 주입해주는 방법.
  • 주입받고자 하는 필드 위에 @Autowired 어노테이션을 붙여주기만 하면 된다.
  • 하지만 추천하는 방법이 아니다.
    • 필드 주입을 사용하게 되면 테스트  등의 이유로 자동이 아닌 수동 의존성 주입을 하고 싶어도 생성자도 setter도 없으므로, 우리가 직접 의존성을 넣어 줄 수 없다. 그래서 필드 주입을 사용하게 되면, 의존성이 프레임워크에 강하게 종속된다는 문제점이 있다.

2. setter 주입

  • setter메서드에 Autowired 어노테이션을 붙이면, 스프링이 setter를 사용해서 자동으로 의존성을 주입해준다.
  • 빈 생성자 또는 빈 정적 팩토리 메서드가 필요하다. 그래서 파이널 필드르 만들 수 없고, 의존성의 불변을 보장할 수 없다는 특징이 있다. 

 

3. 생성자 주입

  • 생성자 주입을 사용하면 객체의 최초 생성 시점에 스프링이 의존성을 주입해준다.
  • 스프링에서 공식적으로 추천하는 방법.
  • 의존성 주입이 생성자 호출 시 최초 1회만 이루어짐. 의존관계를 불변으로 만들어 줄수있다.
  • NullPointerException 방지가능.
728x90
반응형