인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

dlsrksrhk님의 프로필 이미지
dlsrksrhk

작성한 질문수

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

컨트롤러를 소형 테스트로 만들기

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

작성

·

54

0

안녕하세요.

UserRepository를 구현하는 구현체로는 UserJpaRepository를 사용하는 UserRepositoryImpl와 테스트용 구현체인 FakeUserRepository가 있는데요.

 

TDD라는게 단순 객체지향적인 설계를 잘하는 방법론이라면 납득이 가는데, 실제 서비스 되어야 할 코드가 잘 동작하는지 검증하기 위함이라는 관점에서는 조금 궁금한점이 생겨 질문드립니다.

 

FakeUserRepositoryUserRepository의 계약을 잘 이행하고 테스트도 성공하도록 잘 구현하였습니다.

그런데 실제 서비스에 사용될 UserRepositoryImpl는 한번도 검증된 적 없는데 테스트를 통해 어떻게 소프트웨어가 변화함에 있어서 확신을 가질 수 있나요?

 

UserRepositoryImpl 내부 구현이 변경되었을때 여전히 FakeUserRepository만 테스트를 실행할텐데 어떤식으로 개발 과정에서 확신을 얻을 수 있는지 궁금합니다.

 

추가적으로 TDD의 역할에는 어떤 구현 기술에 대해 잘 사용되었는지에 대한 검증은 포함되지 않나요? 예를 들어 스프링 데이터 JPA를 잘 사용하였는지..?

 

예를 들자면 저는 TDD를 해본적은 없지만 실제 실행되는 인프라 계층을 실행해볼 수 있는 샘플 테스트코드 개념으로 만들어서 사용하고 있는데요.

 

제가 개발하고 있는 기업용 솔루션이 버전이 높아짐에 따라 워낙 무거워져서 로컬 PC에서 WAS를 기동하는데에만 2분이 넘기 때문에 최소한의 인프라계층 혹은 인프라계층의 협력 클래스들정도는 테스트 코드로 직접 테스트해볼 수 있도록 테스트 코드를 작성해 두었습니다. 이렇게 해두면 어떤 이슈가 발생했을때도 곧바로 쉽게 테스트가 가능하니까요. 물론 DB 개발서버 장비에 연결하고 더미데이터를 가지고 실행하는 식으로요.

 

이번 강의에서 H2를 통한 인프라 테스트 강의까지가 딱 제가 하고 있는 테스트들이었는데요. 중간에 놓친것인지 테스트가 무거워진다는 설명만 하고 그뒤로는 리팩토링과 함께 인프라 레벨의 테스트는 언급을 안하셔서 제가 생각하는 구현 기술을 잘 사용하여 실제 서비스되는 인프라 모듈을 직접 테스트 하는 부분은 어떻게 해야할지 궁금합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

dlsrksrhk님께서 말씀하신 것처럼 TDD는 주로 객체지향적인 설계를 돕고, 코드가 의도한 대로 동작하는지 확인하는 데 그 목적이 있습니다. 그러나, 실제 서비스에 사용될 코드(UserRepositoryImpl 등)가 테스트되지 않으면 실제로 그것이 잘 동작하는지 확신하기 어려운 점은 이해할 수 있습니다.

실제 동작을 검증하는 방법으로는 몇 가지 접근이 가능합니다:

  1. 통합 테스트(integration test): UserRepositoryImpl 등 실제 구현체에 대하여 통합 테스트를 작성하여 전체 시스템이 의도대로 작동하는지 검증할 수 있습니다. 예를 들어 Spring Boot의 경우 @SpringBootTest를 사용하여 전체 컨텍스트를 로드하고 테스트를 수행할 수 있습니다.

  2. 실제 환경에서의 테스트: 개발 단계에서 실제 환경과 최대한 유사한 환경을 구축하고 그 환경에서 테스트를 수행하여 코드가 제대로 작동하는지 확인할 수 있습니다. H2와 같은 in-memory 데이터베이스를 사용할 수도 있지만, 실제와 다른 점이 있다면 테스트 실패 요명이 될 수 있습니다.

  3. Mocking의 적절한 활용: TDD에서는 Mock 객체를 많이 사용하여 의존성을 격리할 수 있습니다. 그러나, 실제 구현체도 검증이 필요하다면 필요에 따라 실제 의존성을 포함한 테스트를 작성할 수도 있습니다.

TDD는 구현 기술의 사용 검증까지는 포괄하지 않을 수 있지만, 적절한 테스트 커버리지를 유지하면서, 실제 서비스에 근접한 자동화된 테스트를 구축함으로써 어느 정도 확신을 얻을 수 있습니다. 특히, Spring Boot를 사용할 때는 자동 설정 및 다양한 테스팅 유틸리티가 이를 도울 수 있습니다. 예를 들어 Spring Data JPA 관련 테스트의 경우 @DataJpaTest와 같은 어노테이션을 사용하여 테스트 환경을 구성할 수 있습니다.

Spring Boot Reference Documentation에 따르면, 실제 데이터베이스를 사용할 때는 @AutoConfigureTestDatabase(replace = Replace.NONE) 어노테이션을 활용하여 원하는 방식으로 데이터베이스를 적용할 수 있습니다.

자세한 정보는 아래의 Spring Boot 참고 문서를 확인하시기 바랍니다:
Spring Boot Testing Reference

이미지를 보여줄 수는 없지만, 이미지의 링크와 문서 링크를 통해 추가적인 참고가 가능하니 이용해 보시기 바랍니다.

dlsrksrhk님의 프로필 이미지
dlsrksrhk

작성한 질문수

질문하기