5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
📚 요약
프로그램에서 필요한 도구(자원)를 직접 만들지 말고, 외부에서 만들어진 것을 받아서 사용하라.
이렇게 하면 다양한 도구를 쉽게 교체할 수 있고, 테스트하기 쉬워지며, 프로그램이 더 유연해진다.
복잡한 프로젝트에서는 스프링과 같은 의존 객체 주입 프레임워크를 활용하면 더 편리하게 관리할 수 있다.
의존 객체 주입이란?
프로그램에서 필요한 도구(자원)를 직접 만들지 않고, 밖에서 만들어진 도구를 받아서 사용하는 방법!
왜 필요할까?
예를 들어, 맞춤법 검사기는 단어를 확인하기 위해 사전이 필요한데, 이때 맞춤법 검사기가 직접 특정 사전을 만들면 다른 종류의 사전(한국어, 영어, 일본어 등)을 사용하기 어렵다
🚫 나쁜 방법: 직접 자원 만들기
정적 유틸리티 클래스 사용 (좋지 않은 방법)
class 맞춤법검사기 {
// 직접 한국어 사전을 만들어서 사용함
private static final 사전 한국어사전 = new 한국어사전();
private 맞춤법검사기() {} // 인스턴스 생성 방지
public static boolean 맞는지확인(String 단어) {
return 한국어사전.포함하는지(단어);
}
public static List<String> 제안단어들(String 오타) {
return 한국어사전.비슷한단어찾기(오타);
}
}
싱글턴 방식 사용 (좋지 않은 방법)
class 맞춤법검사기 {
// 여전히 직접 한국어 사전을 만듦
private final 사전 한국어사전 = new 한국어사전();
private 맞춤법검사기() {}
public static final 맞춤법검사기 인스턴스 = new 맞춤법검사기();
public boolean 맞는지확인(String 단어) {
return 한국어사전.포함하는지(단어);
}
public List<String> 제안단어들(String 오타) {
return 한국어사전.비슷한단어찾기(오타);
}
}
문제점
한국어 사전만 사용할 수 있다
다른 사전으로 바꾸기 어렵다
테스트하기 어렵다
✅ 좋은 방법: 의존 객체 주입 사용하기
class 맞춤법검사기 {
private final 사전 dictionary;
// 외부에서 사전을 받아옴 (의존 객체 주입)
public 맞춤법검사기(사전 dictionary) {
this.dictionary = Objects.requireNonNull(dictionary);
}
public boolean 맞는지확인(String 단어) {
return dictionary.포함하는지(단어);
}
public List<String> 제안단어들(String 오타) {
return dictionary.비슷한단어찾기(오타);
}
}
사용 예시:
// 한국어 사전으로 맞춤법 검사
사전 한국어사전 = new 한국어사전();
맞춤법검사기 한국어검사기 = new 맞춤법검사기(한국어사전);
// 영어 사전으로 맞춤법 검사
사전 영어사전 = new 영어사전();
맞춤법검사기 영어검사기 = new 맞춤법검사기(영어사전);
🏭 팩터리를 활용한 방법
팩터리는 물건을 만드는 공장같은 역할로, 필요할 때마다 객체를 만들어준다
// 사전을 만드는 팩터리
Supplier<사전> 한국어사전팩터리 = () -> new 한국어사전();
// 팩터리를 이용한 맞춤법 검사기 생성
맞춤법검사기 검사기 = new 맞춤법검사기(한국어사전팩터리.get());
더 복잡한 예시:
// 타일을 만드는 팩터리를 받아서 모자이크를 만드는 메서드
Mosaic create(Supplier<? extends Tile> tileFactory) {
// tileFactory를 이용해 여러 개의 타일을 만들어서 모자이크 구성
}
📝 의존 객체 주입의 장점
유연성: 어떤 종류의 사전이든 사용할 수 있다
테스트 용이성: 테스트할 때 가짜 사전을 만들어서 테스트할 수 있다
불변성: 한번 주입된 사전은 변경되지 않아서 안전하다
🤔 단점과 해결책
큰 프로젝트에서 의존성이 많아지면 코드가 복잡해질 수 있다
이럴 때는 스프링(Spring)과 같은 의존 객체 주입 프레임워크를 사용하여 쉽게 관리할 수 있다
😃 느낀 점
의존 객체 주입을 사용하면 레고 블록처럼 프로그램의 부품을 쉽게 바꿀 수 있어서 정말 편리할거같다
처음에는 조금 어려울 수 있지만, 익숙해지면 프로그램을 더 쉽게 수정하고 테스트할 수 있게 될거같다
🧩 어려웠던 점
처음에는 '의존성'이나 '주입'이라는 단어가 어렵게 느껴졌다
하지만 실생활의 예시(로봇-건전지)로 생각해보니 이해가 한결 편해졌다
Last updated