https://book.naver.com/bookdb/book_detail.nhn?bid=14097515
이펙티브 자바
자바 플랫폼 모범 사례 완벽 가이드 - JAVA 7, 8, 9 대응자바 6 출시 직후 출간된 『이펙티브 자바 2판』 이후로 자바는 커다란 변화를 겪었다. 그래서 졸트상에 빛나는 이 책도 자바 언어와 라이브
book.naver.com
이 글은 이펙티브 자바 Effective Java를 읽고 희미한 기억을 또렷한 기록으로 바꾸기 위해 작성했습니다
들어가기 전에
많은 클래스는 하나 이상의 자원에 의존합니다.
"응집도를 높이고(High Cohesion), 결합도는 낮추라(Loose Coupling)"
자주 변경되는 구체(Concrete) 클래스에 의존하지 마라 - 로버트 C.마틴 -
이 책에서는 맞춤법 검사기를 예제로 다루고 있습니다
그러면 예제를 통해 자원을 직접 명시하지 말고 왜 의존 객체 주입을 사용하라라고 했는지 알아보겠습니다
정적 유틸리티와 싱글턴
위 이미지는 정적 유틸리티와 싱글턴을 잘못 사용 한 예로 유연하지 않고 테스트하기 어렵습니다
그 이유는 두 방식 모두 "테스트 사전" 단 하나만을 사용했기 때문입니다
사전에는 언어별 사전도 있고 특수 어휘용 사전도 있기 때문에 사전 하나로 이 모든 쓰임에 대응할 수 없기에
정적 유틸리와 싱글턴은 자주 변경되는 구체 클래스(언어별 사전, 테스트 사전 등)에 의존하고 있습니다.
dictionary 필드에서 final 를 제거하고 다른 사전으로 교체하는 메소드를 추가할 수 있지만
이 방법은 오류를 내기 쉬우며 멀티스레드 환경에서 사용할 수 없습니다
그래서 사용하는 구체 클래스에 따라 달라지는 클래스의 경우는 정적 유틸리티 클래스나 싱글턴 방식에는 사용이 적합하지 않습니다
그렇기 떄문에 맞춤법 검사기 클래스가 여러 사전 인스턴스를 지원해야 하며 클라이언트가 원하는 사전을 사용해야 합니다
그러면 이 조건을 만족할 수 있는 간단한 방법은 무엇일까요?
의존 객체 주입
클래스는 원하는 구체 클래스를 지원해야 하며 클라이언트는 원하는 구체 클래스를 사용하게 해야 합니다
그러기 위해서는 인스턴스를 생성할 때 생성자에 필요한 구체 클래스를 넘겨주는 방식을 해야 합니다
바로 의존 객체 주입의 한 형태로 맞춤법 검사기를 생성할 때 의존 객체인 사전을 주입해주면 됩니다
위의 코드에서는 dictionary라는 딱 하나의 자원만을 사용하지만, 자원이 몇 개든 의존 관계가 어떻든 상관없이 잘 작동합니다
또한, 불변을 보장하며 여러 클라이언트가 의존 객체들을 안심하고 공유할 수 있기도 합니다
이 패턴은 생성자에 자원 팩토리를 넘겨주는 방식입니다
팩토리란 호출할 때마다 특정 타입의 인스턴스를 반복해서 만들어주는 객체를 말합니다
즉, 위의 소스는 팩토리 메소드 패턴을 구현한 것입니다
의존 객체 주입이 유연성과 테스트 용이성을 개선해주긴 하지만
의존성이 수 천 개나 되는 큰 프로젝트에서는 코드를 어지럽게 만들기도 합니다
대거, 주스, 스프링 같은 의존 객체 주입 프레임워크를 사용하면 해소할 수 있습니다.
'책 > 기록' 카테고리의 다른 글
조종사의 비행 계측기에 해당하는 장치를 만들자 (0) | 2022.10.13 |
---|---|
스프링 부트로 Reactive Programming 간단하게 맛보기 (0) | 2022.06.24 |
[Effective Java] 아이템4 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2022.06.20 |
[Effective Java] 아이템3 private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2022.06.20 |
[Effective Java] 아이템2 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2022.06.18 |