더북(TheBook)

이 코드는 일견 ConferenceWebSvc, Messenger, Attendee 객체가 각자 자신만의 임무를 갖고 아름다운 모듈로 조화를 이룬 것처럼 보인다. Attendee.reserve는 너무 간단해서 굳이 단위 테스트를 하지 않아도 되는데, 어차피 그럴 수도 없으니 잘된 일이다! ConferenceWebSvc 내부에는 HTTP 호출이 있다. 이렇게 HTTP 통신이 필요한 코드는 단위 테스트를 어떻게 할까? 알다시피 단위 테스트는 그 자체로 신속하고 확고해야 한다. 그리고 Messenger는 메시지마다 OK 버튼이 있어야 하는데, 이 또한 이 모듈에서 단위 테스트할 대상은 아니다. 단위 테스트는 자바스크립트 코드를 바르게 작성하기 위한 핵심인데, 승현은 모든 단위가 미처 준비도 되기 전에 시스템 테스트의 늪으로 빠지는 게 싫다.

요는, Attendee 객체가 아니라 이 객체가 의존하는 코드다. 의존성을 주입하는 식으로 바꾸면 해결할 수 있다. 즉, ConferenceWebSvcMessenger와의 의존성을 하드 코딩하지 말고 이들을 Attendee에 주입하는 것이다. 실제 운영 환경에서는 진짜 의존성을 주입하겠지만, 단위 테스트용으로는 모의체(fake)(메서드는 같지만 처리 로직은 가짜인 객체)나 재스민 스파이 같은 대체제를 주입하면 된다.


// 운영 환경:
var attendee = new Attendee(new ConferenceWebSvc(), new Messenger(), id);

// 개발(테스트) 환경:
var attendee = new Attendee(fakeService, fakeMessenger, id);

이처럼 DI 프레임워크를 사용하지 않고 의존성을 주입(DI)하는 것을 두고 ‘빈자의 의존성 주입(poor man’s dependency injection)’이라 한다. 실제로 가장 뛰어난 DI 전용 프레임워크가 공짜라는 사실은 참 역설적이다. 예제 2-10은 빈자의 의존성 주입 방식으로 작성한 Attendee 객체다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.