[JAVA] 의존성 주입(DI)과 renew()의 활용

윤하빈·2026년 4월 14일

개발 공부

목록 보기
4/13

1. 직접 생성이 가져오는 문제점

기존 방식에서는 각 클래스가 필요한 객체를 내부에서 직접 만들었음.
ScannerService가 필요할 때마다 new를 남발하니 관리가 안 됨.

public class WiseSayingController {
    private final Scanner scanner = new Scanner(System.in); 
}

public class SystemController {
    private final Scanner scanner = new Scanner(System.in); 
}
  • 문제점: 객체들이 파편화되어 제어가 힘들고, 특히 테스트할 때 외부에서 입력을 넣어줄 방법이 없음.

2. renew()를 통한 객체 중앙 관리

이 문제를 해결하기 위해 객체 생성 권한을 한곳으로 모았음. 이것이 바로 의존성 주입(Dependency Injection)의 시작임.

public static void renew(Scanner _scanner) {
    scanner = _scanner;                          
    systemController = new SystemController();   
    wiseSayingRepository = new WiseSayingRepository();
    wiseSayingService = new WiseSayingService();
    wiseSayingController = new WiseSayingController();
}
  • 효과: 이제 모든 객체는 이 메서드를 통해서만 생성됨. 이로 인해 프로그램의 상태를 한 번에 초기화할 수 있게 됨.

3. 두 가지 버전의 renew()가 필요한 이유

상황에 따라 다른 부품을 끼워 넣기 위해 메서드 오버로딩을 활용했음.

  • 실제 실행 시: renew() 호출 → 내부적으로 new Scanner(System.in)을 사용하여 키보드 입력 모드로 작동함.
  • 테스트 시: renew(scanner) 호출 → TestUtil.genScanner("종료") 같은 테스트 입력을 넣어 테스트 자동화를 가능하게 함.

4. 테스트 코드에서의 장점

의존성 주입 구조를 잡으니 테스트가 매우 깔끔해졌음.

@Test
void t1() {
    // 테스트용 스캐너를 주입해 모든 객체를 새로 세팅함
    AppContext.renew(TestUtil.genScanner("종료"));
    
    // 덕분에 매 테스트마다 깨끗한 상태로 시작할 수 있음
}

핵심 요약

  • 직접 생성: 클래스 내부에서 new 하는 것. 유연성이 없음.
  • 의존성 주입(DI): 외부에서 객체를 넣어주는 것. renew(scanner)가 그 역할을 수행함.
  • 결론: 객체 생성을 한곳에서 관리하면 앱 실행과 테스트가 모두 자유로워짐.

1개의 댓글

comment-user-thumbnail
2026년 4월 15일

👍👍👍

답글 달기