티스토리 뷰
반응형
자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
-
많은 클래스가 하나 이상의 자원을 의존한다.
-
맞춤법 검사기(SpellChecker)가 사전(Dicitonary)에 의존하는 예를 확인해보자
//정적 유틸리티 활용 public class SpellChecker { private static final Lexicon dictionary = ...; //정적 유틸리티 private SpellChecker() {} //객체 생성을 방지 public static boolean isValid(String word) {...} public static List<String> suggestions(String typo) {...} } //싱글턴 활용 public class SpellChecker { private final Lexicon dictionary = ...; private SpellChecker() {} //객체 생성을 방지 public static SpellChecker INSTANCE = new SpellChecker(...); public static boolean isValid(String word) {...} public static List<String> suggestions(String typo) {...} }
-
두 방식(정적 유틸리티 클래스, 싱글턴) 모두 하나의 자원(하나의 사전)만 사용한다는 점에서 볼 때 그리 훌륭한 설계는 아니다.
- why? 맞춤법 검사를 할 때 하나의 사전만을 보지는 않으니깐!
-
즉, 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식은 적합하지 않다
-
클래스(SpellChecker)가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원(Dictionary)을 사용해야한다.
-
결과적으로, 인스턴스를 생성할 때, 생성자에 필요한 자원을 넘겨주는 방식을 사용해야한다.
- 이는, 의존 객체 주입의 한 형태로 맞춤법 검사기를 생성할 때 의존 객체인 사전을 주입해주면 되는 것이다.
public class SpellChecker { private final Lexicon dictionary = ...; public SpellChecker(Lexion dictionary) { this.dictionary = Objects.requireNonNull(dictionary); } public static boolean isValid(String word) {...} public static List<String> suggestions(String typo) {...} }
-
일반적으로 사용한 생성자를 통해 자원을 받아오는 방식을 사용한 것이다.
-
그렇다면 이 패턴의 쓸만한 변형은 또 무엇이 있을까?
-
생성자에 자원 팩토리를 넘겨주는 방식이 있을 것이다. 즉, 팩토리 메서드 패턴을 말하는 것이다.
-
Java8에서는
Supplier<T>
가 팩토리를 표현한 완벽한 예이다.//클라이언트가 제공한 팩토리(Tile)로 구성된 Mosaic를 만드는 메서드 Mosaic create(Supplier<? extends Tile> tileFactory) {...}
- 핵심 정리
- 클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스에는 사용하지 않는 것이 좋다.
- 필요로 하는 자원(혹은 그 자원을 만들어주는 팩토리)을 생성자에게 넘겨주자
- 의존 객체 주입은 클래스의 유연성, 재사용성, 테스트 용이성을 개선해준다.
http://www.yes24.com/Product/Goods/65551284?scode=032&OzSrank=1
반응형
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용해라 (0) | 2020.02.03 |
---|---|
[Effective Java] 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2020.01.04 |
[Effective Java] 아이템5. 불필요한 객체 생성을 피하라 (0) | 2019.12.22 |
[Effective Java] 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2019.12.14 |
[Effective Java] 아이템 3. Private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2019.12.14 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Effective Java
- junit
- 자바8
- ifPresent
- 빌더 패턴
- 이펙티브자바
- try catch finally
- springboot
- 연관관계
- jdk버전
- package-private
- flatMap
- 빈 순환 참조
- JPA
- effectivejava
- @Lazy
- 팩토리 메소드 패턴
- 정적팩터리메서드
- 이펙티브 자바
- java8
- java
- 인프런
- try with resources
- 스프링부트
- 복사 팩토리
- 점층적 생성 패턴
- 생성자
- Spring
- 김영한
- mustache
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함