일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Java
- JavaScript
- 책너두
- 객체지향
- 주니어개발자
- 클린코드
- IntelliJ
- 코딩
- 객체지향프로그래밍
- 직장인점심
- 성수볼거리
- 직장인
- 디자인패턴
- 헤드퍼스트디자인패턴
- docker
- 개발자
- Linux
- 상속
- 독서일지
- 성수핫플
- 성수
- 독서
- JAVA개발자
- DesignPattern
- 책읽기
- 헤드퍼스트
- 오브젝트
- 성수직장인
- 성수맛집
- 깨끗한코드
- Today
- Total
닭발개발
[오브젝트] 23일차. 291-304pg | 의존성 주입, 의존성 역전 본문
[오브젝트] 23일차. 291-304pg | 의존성 주입, 의존성 역전
D269 2023. 7. 22. 09:52
23일차.
오브젝트: 코드로 이해하는 객체지향 설계[4주차_금요일]
291-304pg
#요약
**Chapter 09. 유연한 설계**
- 8장에서 유연하고 재사용가능한 설계를 만드려고 적용할 수 있는 다양한 의존성 관리 기법들을 소개했다면 9장에서는 이 기법들을 원칙이라는 관점에서 정리
01. 개방-폐쇄 원칙(Open-Closed Principle, OCP)
02. 생성 사용 분리
- 결합도가 높을수록 개방폐쇄 원칙을 따르는 구조를 설계하기 어려워진다.
- 동일 클래스에서 객체 생성과 사용의 두 가지 이질적 목적을 가진 코드가 공존하는 것이 문제 -> 객체와 관련된 두 책임을 서로 다른 객체로 분리해야 함.
- 객체에 대한 생성과 사용을 분리.
- 사용으로부터 생성을 분리하는 방법은 객체를 생성할 책임을 클라이언트로 옮기는 것.
1) FACTORY 추가하기
- 생성과 사용을 분리하기 위해 객체 생성에 특화된 객체를 factory라고 한다.
2) 순수한 가공물에게 책임 할당하기
- 책임할당의 기본 원칙은 책임 수행에 필요한 정보를 가장 많이 알고있는 Information expert에게 책임을 할당하는 것.
- 시스템을 객체로 분해하는 방식 : 표현적 분해, 행위적 분해
- 표현적 분해 : 도메인에 존재하는 사물 또는 개념을 표현하는 객체들을 이용해 시스템을 분해하는 것. 객체지향 설계를 위한 가장 기본적인 접근법
- 순수한 가공물 : 책임을 할당하기 위해 창조되는 도메인과 무관한 인공적인 객체
- 어떤 행동을 추가하려고 했는데 책임질 마땅한 도메임이 없으면 순수한 가공물을 추가하고 이 객체에 책임을 할당하ㄴ다.
- 따라서 순수한 가공물은 표현적 분해보다 행위적 분해에 의해 생성된다.
- 순수한 가공물( pure fabrication 패턴) : information expert 패턴에 따라 책임을 할당한 결과가 별로일 경우 대안으로 사용됨. 적절한 대안이 없을 때 사람들이 창조적인 무언가를 만들어낸다는 의미.
- factory는 객체의 생성 책임을 할당할만한 도메인 객체가 존재하지 않을 때선택할 수 있는 순수한 가공물임.
03. 의존성 주입
- 의존성 주입 : 사용하는 객체가 아닌 외부 독립적 객체가 인스턴스를 만든 후에 이를 전달해서 의존성을 해결하는 방법
근데 왜 주입이냐? 외부에서 의존성의 대상을 해결한 후 이를 사용하는 객체 쪽으로 주입하기 떄문.
- 의존성 주입에서 의존성을 해결하는 3가지 방법
a. 생성자 주입 : 객체를 생성하는 시점에 생성자를 통한 의존성 해결
b. setter 주입 : 객체 생성 후 setter 메서드를 통한 의존성 해결
c. 메서드 주입 : 메서드 실행시 인자를 이용한 의존성 해결
'
- setter 주입 단점 : 객체가 생성되기 위해 어떤 의존성이 필수적인지를 명시적으로 표현 못함.
- 메서드 주입은 메서드 호출 주입이라고도 한다. 메소드가 의존성을 필요로 하는 유일한 경우에만 사용 가능
- 생성자 주입을 통해 의존성을 전달받으면 객체가 올바른 상태로 생성되는 데 필요한 의존성을 명확하게 표현할 수 있지만 주입된 의존성이 한 두 개의 메서드에서만 사용된 각 메서드 인자로 전달하는게 더 낫다.
1) 숨겨진 의존성은 나쁘다.
- 의존성 주입 외에 의존성을 해결하는 다양한 방법들.
- Service location 패턴 : 의존성을 해결할 객체들을 보관하는 일종의 저장소. 하지만 선호하지 않음. 그 이유는 얘는 의존성을 감춤.
- 숨겨진 의존성이 어려운 이유 : 디버깅 어렵고 문제점을 발견할 수 있는 시점이 코드작성 시점이 아니라 실행시점임.
- 숨겨진 의존성은 의존성을 이해하기 위해서 코드 내부 구현을 이해해야만 한다. 그래서 숨겨진의존성은 캡슐화를 위반함.
- 가능하면 의존성을 명시적으로 표현하기
04. 의존성 역전 원칙
1) 추상화와 의존성 역전
- 대부분 우리가 재사용하려는 대상읜 상위 수준의 클래스인데, 상위 수준 클래스가 하위 수준 클래스에 의존하면 상위 수준 클래스를 재사용할 떄 하위 수준 클래스도 필요하기 때문에 재사용하기 어려워진다.
- 하위수준의 이슈로 상위수준의 클래스들을 재사용하는 게 어렵다면 해결사는 추상화.
- 1. 상위 수준 모듈은 하위 수준 모듈에 의존하지 말고 모두 추상화에 의존할 것.
- 2. 추상화는 구체적인 사항에 의존하면 안되고 구체적인 사항이 추상화에 의존해야 한다.
=> 이것이 의존성 역전 원칙
2) 의존성 역전 원칙과 패키지
- 역전은 의존성의 방향 말고도 인터페이스의 소유권에도 적용된다.
- 의존성 역전 원칙에 따라 상위 수준의 협력 흐름을 재사용ㅇ하려면 추상화가 제공하는 인터페이스의 소유권도 역전시켜야 함.
- 유연하고 재사용 가능하며 컨텍스트에 독립적인 설계는 전통적인 패러다임이 고수하는의존성의 방향을 역전시킨다.
'책책책 책을 읽읍시다‼ ver.개발 > [ 오브젝트: 코드로 이해하는 객체지향 설계 ]' 카테고리의 다른 글
[오브젝트] 25일차. 322-335pg | 취약한 기반 클래스 문제, 추상화에 의존 (0) | 2023.07.31 |
---|---|
[오브젝트] 24일차. 305-321pg | 중복코드제거, DRY원칙 (0) | 2023.07.22 |
[오브젝트] 22일차. 277-290pg | 개방-폐쇄 원칙, 추상화 (0) | 2023.07.21 |
[오브젝트] 21일차. 264-276pg | 의존성, 명시적의존성, new (0) | 2023.07.19 |
[오브젝트] 20일차. 250-263pg | 변경과 의존성 (0) | 2023.07.18 |