
기존 방식에서는 각 클래스가 필요한 객체를 내부에서 직접 만들었음.
Scanner나 Service가 필요할 때마다 new를 남발하니 관리가 안 됨.
public class WiseSayingController {
private final Scanner scanner = new Scanner(System.in);
}
public class SystemController {
private final Scanner scanner = new Scanner(System.in);
}
이 문제를 해결하기 위해 객체 생성 권한을 한곳으로 모았음. 이것이 바로 의존성 주입(Dependency Injection)의 시작임.
public static void renew(Scanner _scanner) {
scanner = _scanner;
systemController = new SystemController();
wiseSayingRepository = new WiseSayingRepository();
wiseSayingService = new WiseSayingService();
wiseSayingController = new WiseSayingController();
}
상황에 따라 다른 부품을 끼워 넣기 위해 메서드 오버로딩을 활용했음.
renew() 호출 → 내부적으로 new Scanner(System.in)을 사용하여 키보드 입력 모드로 작동함.renew(scanner) 호출 → TestUtil.genScanner("종료") 같은 테스트 입력을 넣어 테스트 자동화를 가능하게 함.의존성 주입 구조를 잡으니 테스트가 매우 깔끔해졌음.
@Test
void t1() {
// 테스트용 스캐너를 주입해 모든 객체를 새로 세팅함
AppContext.renew(TestUtil.genScanner("종료"));
// 덕분에 매 테스트마다 깨끗한 상태로 시작할 수 있음
}
new 하는 것. 유연성이 없음.renew(scanner)가 그 역할을 수행함.
👍👍👍