본문 바로가기
SpringBoot/테스트와 품질 관리

단위 테스트 (@WebMvcTest, @DataJpaTest)

by DEVLIB 2025. 4. 15.
728x90

스프링 부트 단위 테스트 기본 개념

구분
설명
단위 테스트(Unit Test) 특정 클래스(컨트롤러, 서비스, 리포지토리)를 독립적으로 테스트
통합 테스트(Integration Test) 실제 스프링 애플리케이션 컨텍스트를 로딩해 전체 구성 요소를 테스트

1. @WebMvcTest – 컨트롤러 단위 테스트

목적

  • Controller 레이어만 테스트
  • 서비스, DB 등은 Mock으로 처리

예제

@WebMvcTest(MemberController.class)
class MemberControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private MemberService memberService;

    @Test
    void getMember_응답_200() throws Exception {
        MemberDto dto = new MemberDto("홍길동", "test@example.com");

        given(memberService.getMember(1L)).willReturn(dto);

        mockMvc.perform(get("/api/member/1"))
               .andExpect(status().isOk())
               .andExpect(jsonPath("$.name").value("홍길동"));
    }
}

핵심 요소

어노테이션 설명
@WebMvcTest 컨트롤러만 빈 등록
MockMvc HTTP 요청/응답 시뮬레이션
@MockBean 외부 의존성을 가짜로 주입 (Service, Repository 등)
jsonPath() JSON 응답 내용 검증

2. @DataJpaTest – JPA 레이어 단위 테스트

목적

  • JPA 엔티티 & 리포지토리 테스트
  • DB 연동 테스트 (보통 H2)

예제

@DataJpaTest
class MemberRepositoryTest {

    @Autowired
    private MemberRepository memberRepository;

    @Test
    void 이메일로_회원_조회() {
        Member member = new Member("danbi", "danbi@example.com");
        memberRepository.save(member);

        Optional<Member> result = memberRepository.findByEmail("danbi@example.com");

        assertTrue(result.isPresent());
        assertEquals("danbi", result.get().getName());
    }
}

핵심 요소

어노테이션 설명
@DataJpaTest JPA 관련 빈만 로딩, H2 메모리 DB 사용
@AutoConfigureTestDatabase 실제 DB 사용 시 설정 필요
@Sql 테스트 전후 SQL 실행

테스트 환경 설정

application.yml (테스트 전용)

spring:
  datasource:
    url: jdbc:h2:mem:testdb
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true

단위 테스트에서 H2 DB를 사용하면 빠르고 독립적으로 테스트할 수 있습니다.


마무리 요약

구분 @WebMvcTest @DataJpaTest
목적 컨트롤러 레이어 테스트 JPA/DB 테스트
로딩 범위 Controller + MockMvc Repository + H2 DB
의존성 주입 @MockBean 사용 실제 JPA 구성 요소 자동 주입
사용 예 GET/POST 요청 테스트 CRUD, 쿼리 메서드 검증

통합 테스트 어노테이션

어노테이션 설명
@SpringBootTest 실제 앱처럼 전체 로딩 (통합 테스트)
@Transactional 테스트 후 롤백 (데이터 초기화)
LIST