inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Util성 클래스와의 비교

290

skehdxhd

작성한 질문수 14

0

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

 

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

 

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

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

 

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

 

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

spring tdd jpa 소프트웨어-테스트 unittest

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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 섹션에서 찾아볼 수 있습니다.

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

UserService, CertificationService 책임 분리 기준 질문

0

26

1

service.port 패키지로 이동한 UserRepository가 infrastructure에 있는 UserEntity에 의존

0

58

1

Service 소형 테스트 질문

0

82

1

조회 시 엔티티를 조회하는 것이 아닌QueryDSL을 많이 사용 시 Dto는 어떻게 하나요?

0

116

1

controller 의 port 패키지의 service 인터페이스 사용

0

72

1

빌드 문제

0

92

1

빌드 안 되시는 분들 참고

0

102

1

update에서 Repository.save

0

105

1

최종 완성된 코드를 받아 볼 수 있을까요?

0

156

1

의존성 역전으로 해결한 외부의존성?

0

162

1

좋은 설계

0

180

1

Controller에 테스트

0

138

1

JPA가 아닌 Mapper 아키텍처 기반 테스트 코드 작성

0

242

0

영속성 객체 구분으로 인한 JPA와 Querydsl의 Projection 사용

0

224

1

인프라계층 구현체와 테스트 구현체에 대한 질문

0

222

1

실습 코드 커밋

0

372

1

UserEntity 메서드

0

293

2

CertificationServiceTest에서 MailSender 인터페이스가 아닌 FakeMailSender를 이용하는 것

0

217

1

레이어드 아키텍처 개발에 대하여

0

231

1

BDDMockito의 when을 사용한 코드가 given 절에 있는 이유가 궁금합니다.

0

223

1

테스트에서 주입과 생성

0

198

1

프로젝트 코드는 제공해주시지 않는건가요?

0

382

2

개선된 아키텍처의 구조

0

277

1

서비스 레이어의 단위 테스트 범위 고민

0

188

1