인프런 커뮤니티 질문&답변

skehdxhd님의 프로필 이미지
skehdxhd

작성한 질문수

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

Util성 클래스와의 비교

작성

·

217

0

안녕하세요 좋은 강의 만들어 주셔서 감사합니다.

 

많은 분들이 비슷한 질문을 해주신 것으로 생각되는데, Util성 클래스와 Holder인터페이스를 구현한 구체클래스의 의존주입의 사용 기준에 대해 여쭤보려고 합니다.

 

강의에서 예로 들어주신 SystemClockHolder의 경우 많은 예제에서 Util클래스로 만들어 사용할 것이라고 생각됩니다.

하지만 이렇게 되면 강의에서 말씀해주신 것처럼 메소드 내부에 사용자가 예측할 수 없는 값이 들어가게 되어 테스트하기 어려워지는 신호가 될 수 있다고 생각합니다.

 

반면 이러한 Holder가 너무 많아질 경우 서비스 계층에서 의존주입 받아야할 Holder가 너무 많아지지는 않을까 하는 고민도 되었습니다.

 

강사님께서는 어떤 기준으로 Util클래스와 인터페이스 기반의 의존주입 클래스를 구분하시는지 궁금합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
소중한 질문 주셔서 감사합니다, skehdxhd님.

Util 클래스와 인터페이스 기반의 의존주입 클래스를 구분할 때 고려할 수 있는 몇 가지 기준을 말씀드리겠습니다.

  1. 테스트 용이성: Util 클래스는 보통 static 메소드로 구성되며, 이러한 메소드들은 테스트 시에 특정 상태나 동작을 가정하기 어렵습니다. 대조적으로 인터페이스 기반의 의존 대상은 mock 객체를 사용하여 테스트가 용이합니다.
  2. 확장성 및 유연성: Util 클래스는 확장이 어렵기 때문에 변경사항이 있을 시 유연하게 대응하기 어려울 수 있습니다. 그에 반해 인터페이스를 사용하면 다양한 구현체를 만들어 유연하게 대응할 수 있습니다.
  3. 코드의 명확성: 인터페이스를 주입받는 것은 해당 객체가 외부에서 어떤 서비스를 필요로 하는지 명확하게 드러내므로 코드의 의도를 이해하기 쉽게 만듭니다.

단점으로 말씀하신, Holder 인터페이스 구현체의 의존주입 대상이 많아질 경우에 대해서는 Spring Framework의 ApplicationContext를 통한 통합 테스트와 같이 애플리케이션 컨텍스트 단위로 테스트를 수행하거나 Testcontainers와 같은 도구를 사용하여 실제 의존성을 포함하는 통합 환경에서 테스트를 진행할 수 있습니다.

관련 내용은 Spring Boot Reference Documentation에 자세히 나와 있습니다. 예를 들어, Spring Boot v3.1.5의 18.16. Testing부터 테스트 관련하여 자주 묻는 질문들에 대한 답변이 있고, 인터페이스를 기반으로 Testcontainers를 사용하는 방법은 7.8.4. Testcontainers의 Using Testcontainers at Development Time 섹션에서 찾아볼 수 있습니다.

이러한 문서들을 통해 더 깊이 있게 학습하시면 도움이 될 것입니다.

skehdxhd님의 프로필 이미지
skehdxhd

작성한 질문수

질문하기