728x90
반응형
IoC란? - 제어의 역전
직접 객체를 생성하여 코드를 "제어"
- A 클래스에서 B를 필드로 가지고, 생성자 내부에서 직접 생성해 필드를 초기화하고 있다.
- 이러한 코드를 객체 생명주기를 직접 제어하는 코드라고 할수있다.
프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것 - 역전
- 외부로부터 b인자를 받아서 초기화하고 있다.
- 이렇게 프로그램의 제어 흐름을 직접 제어하는 것이 아니라, 외부에서 관리하는 것을 제어를 역전시켰다고 말할 수 있다.
IoC가 필요한 이유
- 객체 내부에서 재료의 종류를 제어해 변경에 자유롭지 못하던 코드가 외부에서 제어를 받으면서 변경이 자유로워진다.
- 객체지향 원칙을 잘 지키기 위해 - 역할과 관심을 분리해 응집도를 높이고 결합도를 낮추며, 이에 따라 변경에 유연한 코드를 작성할 수 있는 구조가 될수있기 때문.
- 주도권은 빼앗기고, 호출 당하기를 기다리는
- 내부에서 외부로 역전된 것.
- 기존메뉴얼로 만든 음식을 받지않고, 내가 원하는 대로 넣는?
DIP란?
- 의존 역전 원칙
- 상위 레벨의 모듈은 절대 하위 레벨 모듈에 의존하지 않는다. -> 둘 다 추상화에 의존해야 한다.
- 햄버거(상위레벨)가 치킨패티(하위 레벨)에 의존하면 안된다.
- 햄버거(상위레벨)는 패티(인터페이스)에 의존하고 치킨패티도 패티(인터페이스)에 의존.
IoC와 DIP의 목적
- 클래스 간 결합을 느슨히 하기 위함.
- 한 클래스의 변경에 따른 다른 클래스의 영향을 최소화
- 애플리케이션을 지속가능하고 확장성 있게 만든다.
DI란? - 의존성 "주입"
- 클래스 간에 의존 관계가 있다는 것 = 한 클래스가 바뀔 때 다른 클래스가 영향을 받는다는 것
- 의존성 주입이란 의존성을 다른 곳으로부터 주입해주는 것
의존성 주입 전
- 이탈리안 비엠티와 각 재료들이 강하게 결합되어 있어서 하나라도 변화가 생기면, 이탈리안 비엠티에도 변화가 생긴다.
- ex) WhiteBread에 유통기한이란 인자가 필요해진다면, 이탈리안 비엠티 코드에도 변경이 일어난다.
의존성 주입을 받으면 변경으로부터 자유로워질 수 있다.
의존성 주입 패턴
- 생성자 주입 - 생성자 호출 시 외부로부터 의존성을 받는 방법
- 필요한 의존성을 모두 포함하는 생성자를 만들고, 그 생성자를 통해서 의존성을 주입.
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
반응형
'영상 후기 > Spring Boot' 카테고리의 다른 글
영상 후기 - [10분 테코톡] 🌕제이의 Spring AOP (0) | 2023.04.06 |
---|---|
영상 후기 - [10분 테코톡] ⏰ 아마찌의 ORM vs SQL Mapper vs JDBC (0) | 2023.04.01 |
영상 후기 - [10분 테코톡] 수달의 JPA N+1 문제 (0) | 2023.03.31 |
영상 후기 - [10분 테코톡] 루나의 Gradle (0) | 2023.03.17 |
영상 후기 - [10분 테코톡] 🐝범블비의 MVC Pattern (0) | 2023.03.17 |