1. DI란?
- Dependency Injection으로 의존성 주입이라는 뜻
- 객체의 의존 관계를 외부에서 주입하는 방법
- 의존 관계란?
- 네모 그림과 그림 그리는 함수가 예로 있다.
- 네모 그림에 김 그림을 그리는 함수를 넣으면 네모는 김이 되고, 스마트폰을 그리는 함수를 넣으면 네모는 폰이 된다.
- 네모 그림을 그리는 함수 A는 김을 그리거나 폰을 그리는 함수 B, C에 의해 무엇이든 될 수 있고, 이 관계를 의존 관계라 한다.
- 의존 관계란?
- 이같은 의존성을 외부에서 주입하는 것을 의존성 주입 DI 라고 한다.
2. 클래스 간의 관계
- 연관 관계
class A {
private B b;
}
- 의존 관계
class A {
public B method(B b){
return new B();
}
}
- 상속 관계
class A extends B {
}
- 실체화 관계
class A implements B {
}
3. 의존성 주입 방법
- 생성자 주입
- 인텔리제이에서 생성자 주입을 추천하는 이유
- 순환 참조 방지
- final 선언으로 객체 불변성 지키기
- 테스트 코드 작성 용이
- 참조: https://jackjeong.tistory.com/entry/Spring-%EC%83%9D%EC%84%B1%EC%9E%90-%EC%A3%BC%EC%9E%85-vs-%ED%95%84%EB%93%9C-%EC%A3%BC%EC%9E%85-Autowired
- 인텔리제이에서 생성자 주입을 추천하는 이유
public class SquarePic {
private final Phone phone;
public SquarePic(Phone phone) {
this.phone = phone;
}
}
- Setter 주입
public class SquarePic {
private Phone phone;
public void setCpu(Phone phone) {
this.phone = phone;
}
}
- Field 주입
public class SquarePic {
@Autowired
private Phone phone;
}
- 인터페이스 주입
public class SquarePic implements Drawing{
private Phone phone;
@Override
public void drawPhone(Phone phone) {
this.phone = phone;
}
}
interface Drawing {
void drawPhone(Phone phone);
}
4. IoC란?
- Inversion Of Control로 제어의 역전이라는 뜻
- 일반적으로 객체의 생명 주기 및 변수, 메소드 등을 내부에서 주입해서 코드를 제어한다.
- 그러나, 외부에서 의존성을 주입하여 컨트롤하는 것으로 제어권을 넘겨주게 된다.
- 이것을 한국어 그대로 제어의 역전이라고 한다.
- 그리고 이것의 예시로 Strategy Pattern, DI, Abstract Factory 등 을 들 수 있다.
- 의존 관계로 조립된 빈을 모아둔 그릇을 스프링 IoC 컨테이너라고 한다.
- 의존성의 결합도(Coupling)가 낮아져서 유연성이 높아진다.
- Loose Coupling일 수록 더 다양한 모습의 객체가 될 수 있다.
5. DIP란?
- Dependency Inversion Principle로 의존성 주입 원칙이라는 뜻
- 상위 모듈은 하위 모듈에 의존하지 않는다.
- 추상화에 의존해야한다.
- 네모 그리기가 폰 그리기, 버스 그리기 등으로 완성되기 때문에 의존하는 관계였다면 추상화를 통해 구현에서 자유를 주고 하위 객체로 부터 독립시켜주었다.
public interface Drawing {
void draw();
}
public class SquarePic implements Drawing {
private Drawing phone;
private Drawing bus;
public SquarePic(Drawing phone, Drawing bus) {
this.phone = phone;
this.bus = bus;
}
@Override
public void draw() {
phone.draw();
bus.draw();
}
}
public class Phone implements Drawing {
@Override
public void draw() {
}
}
public class Bus implements Drawing {
@Override
public void draw() {
}
}
6. 프레임워크와 라이브러리 차이
- 소프트웨어 개발에 사용되는 도구라는 공통점이 있다.
- 프레임워크
- 소프트웨어의 구조와 흐름을 결정하는 것으로 프레임워크의 규칙과 패턴에 따라 코드를 작성
- 코드가 프레임워크에서 제공하는 규칙과 기능에 밀접하게 의존
- 개발자에게 제공하는 실행 환경, 기능
- 라이브러리
- 재사용 가능한 메소드, 클래스 등의 집합체
- 개발자가 필요에 의해 선택적으로 사용할 수 있음
- 필요한 라이브러리를 코드에서 호출하여 사용
- 코드가 라이브러리에 선택적으로 의존
7. 목적
: 이 모든 복잡한 이론의 목적은 결국!!!!! 유지보수의 용이성! 유연성!
cf) 참고: https://velog.io/@gillog/Spring-DIDependency-Injection
'⭐ Programming > Backend' 카테고리의 다른 글
| HikariCP - DB ConnectionPool (1) | 2023.05.08 |
|---|---|
| IoC 컨테이너와 @Bean, @Component (0) | 2023.05.08 |
| Blocking/Non-Blocking 와 Sync/Async 와 Future/Completable Future (0) | 2023.05.07 |
| 트랜잭션이란? (0) | 2023.02.14 |
| JPA와 Mybatis 차이 = ORM과 SQL MAPPER 차이 (0) | 2023.02.09 |