[sw 아카데미] 5. POJO와 DI (2)
의존성 주입(Ioc/DI)
- 의존성 주입(DI)을 지향하는 코드란?
- 어떤 의존성이 붙더라도 돌아가는 코드를 작성하자는 것.
- 쉽게 확장이 가능한 구조 필요
- 의존성이란?
- 어떤 프로그램이나 서비스가 수행되기 위해 필요한 것
- 의존성의 종류
- 대부분 "사용(use)"
- Ex) 사람은 돈에 의존한다.
- 의존성에는 방향이 있다.
- DI에서 ⭐전체는 부분에게 의존한다⭐
- 회사 -> 직원 : 회사는 직원에게 의존한다.
- 프로그램 -> 오라클 : 프로그램은 오라클에 의존한다.
- UML에서의 표현 - 갈고리에 점선 (의존관계)
DI 실습
- DI (Dependency Injection)
- DI는 어떤 인터페이스를 하나 정의 -> 인터페이스를 상속 받아 구현클래스를 만들고 인터페이스에 의존하도록 만드는 것이다. 즉, DI는 인터페이스 기반 패턴이다.
- 실습 코드 예제
- 결합도를 낮춘다: order를 거쳐서 sell 호출
- 생성자를 통한 주입: new로 인터페이스의 구현체 클래스 주입
- 왜 이 코드는 OCP를 만족하는가?
- 기능추가에 열림, 수정에 닫힘
- 뭐든지 판매하는 기능이라면 seller를 추가하면 된다.
- new로 어떤 기능(구현체)이든 Main클래스에 추가할 수 있다.
- Order와 Sell을 분리 -> 인터페이스의 구현체인 클래스에서 구현된 메소드 호출 가능
상속의 문제점
- 자바 자체가 단일 상속이기 때문에 부모를 상속받는 구조를 선호하지 않는다.
- 상속의 장점: 코드 재사용
- 상속의 문제점:
- 클래스를 상속받았을 때 재활용이 안되는 코드가 존재
- 전체를 다 상속받았지만 사용되지 않는 코드 존재 -> 메모리를 차지
- 객체지향은 부분 상속이 불가능하다.
- 다중 상속은 활용되지 않는 코드가 늘어날 가능성 높음
- 따라서 단일 상속만 허용
- 인터페이스는 오버헤드 없는 상속 가능
- 코드가 없는데 무슨 상속이야? 재활용이 아닌데? -> DI 패턴 등장
- 기능 추가에 유연한 구조가 된다. 특히 OCP를 잘지키는 코드가 된다.
- 코드 통일성 유지
코드 재사용 < 기능추가
에 방점을 두는 것으로 변화
스프링 PSA
- DI 적용되지 않은 코드도 DI스럽게 포장
- POJO스럽지 않은 코드도 POJO스럽게 포장
정리
- 스프링이 지향하는 바는 모든 코드를 POJO스럽게 만드는 것이다.
- DI가 중심 역할
- DI가 적용되지 않는 부분은 PSA를 통해 포장