[스프링 부트 Mock(목) 테스트] 개념 정리 & 서블릿 컨테이너 모킹, 로깅 완벽 가이드

[스프링 부트 Mock(목) 테스트] 개념 정리 & 서블릿 컨테이너 모킹, 로깅 완벽 가이드

스프링 부트(Spring Boot)를 사용하다 보면, 테스트(Test) 환경에서 Mock(목) 개념과 MockMvc를 활용하게 됩니다. 특히 서블릿 컨테이너 없이도 컨트롤러를 테스트할 수 있는 모킹(Mocking) 기술은 개발 효율성을 높여줍니다. 이번 글에서는 스프링 부트 Mock의 개념부터 서블릿 컨테이너 모킹, MockMvc 사용 방법, 그리고 스프링 부트 로깅(Logging)까지 살펴보겠습니다.


1. 스프링 부트(Mock) 이란?

1) 목(Mock)의 사전적 의미

  • Mock(목)은 ‘테스트를 위해 만든 모형(model)’이라는 의미를 지닙니다.
  • 테스트 목적으로 모의 객체(Mock Object)를 생성하는 과정을 모킹(Mocking)이라고 하며, 이를 통해 얻어낸 테스트용 객체를 목업(Mock up)이라고도 부릅니다.

2) Mock 객체를 사용하는 이유

  • 복잡한 의존성이 있는 실제 객체 대신, 간단한 기능만 수행하도록 만든 가짜 객체를 이용하면 가볍고 빠른 테스트가 가능합니다.
  • 데이터베이스나 외부 API처럼, 생성에 시간이 오래 걸리거나 별도의 환경이 필요한 객체를 매번 준비하지 않아도 되므로 테스트 효율성을 크게 높일 수 있습니다.

2. 서블릿 컨테이너 모킹(Mocking)

1) 서블릿 컨테이너 없이 컨트롤러 테스트가 가능하다?

  • 전통적으로는 웹 환경에서 컨트롤러를 테스트하려면 서블릿 컨테이너(예: Tomcat)가 구동되고, DispatcherServlet이 메모리에 올라와야 합니다.
  • 서블릿 컨테이너 모킹을 사용하면, 실제 톰캣 서버 없이도 테스트용 서블릿 컨테이너를 흉내 내어 컨트롤러를 실행할 수 있습니다.

2) @WebMvcTest와 @AutoConfigureMockMvc

  • 스프링 부트 테스트에서 @WebMvcTest 또는 @AutoConfigureMockMvc 어노테이션을 사용하면 MockMvc 환경이 구성됩니다.
  • 이를 통해 실제 서블릿 컨테이너 없이도 컨트롤러 로직을 테스트할 수 있습니다.

3. MockMvc로 컨트롤러 테스트하기

1) MockMvc의 perform() 메소드

  • MockMvc 객체는 마치 웹 브라우저가 서버에 URL 요청을 보내는 것처럼 컨트롤러를 실행할 수 있도록 해줍니다.
  • mockMvc.perform(…) 메소드를 사용하여 HTTP 요청을 흉내 낸 뒤, 컨트롤러의 동작을 확인할 수 있습니다.

mockMvc.perform(get(“/api/example”))

       .andExpect(status().isOk())

       .andExpect(content().string(“Hello World”));

  • perform() 메소드가 요구하는 RequestBuilder는 MockMvcRequestBuilders 클래스의 get(), post() 등 정적 메소드를 통해 생성합니다.
  • 생성된 MockHttpServletRequestBuilder 객체에 HTTP 요청의 파라미터, 헤더, 요청 본문 등을 체이닝 메소드로 추가 설정할 수 있습니다.

2) ResultActions와 andExpect() 메소드

  • perform() 메소드는 ResultActions 객체를 반환하며, 이 객체를 통해 컨트롤러의 응답 결과를 검증할 수 있습니다.
  • ResultActions의 andExpect() 메소드를 호출할 때는, MockMvcResultMatchers 클래스의 다양한 정적 메소드를 사용해 응답 상태 코드, 본문, 헤더 등의 검증 로직을 작성합니다.

예시:

mockMvc.perform(get(“/api/users/1”))

       .andExpect(status().isOk())

       .andExpect(jsonPath(“$.name”).value(“홍길동”));

  • 위 코드에서 jsonPath(“$.name”).value(“홍길동”)는 JSON 응답의 name 필드가 “홍길동”인지 확인합니다.

4. 스프링 부트 로깅(Logging)

1) SLF4J와 LogBack

  • SLF4J(Simple Logging Façade for Java)는 로깅 프레임워크가 아니라, 퍼사드(Facade) 역할을 담당하는 추상화 계층입니다.
  • 스프링 부트는 내부적으로 LogBack 로거를 사용하며, SLF4J 인터페이스를 통해 LogBack을 호출합니다.

2) 퍼사드(Facade) 패턴의 장점

  • 퍼사드는 GoF(GoF 디자인 패턴) 중 하나로, 복잡한 서브시스템을 단일 인터페이스로 감싸 간단하게 사용하도록 해줍니다.
  • SLF4J 퍼사드를 사용하면 로깅 프레임워크(Log4j, LogBack 등)를 교체하더라도 개발 코드에 미치는 영향이 최소화됩니다.

3) LogBack

  • LogBack은 기존에 널리 사용되던 Log4j를 대체하며, 성능과 기능 면에서 뛰어난 장점을 제공합니다.
  • 스프링 부트가 자동 구성(Auto Configuration)을 통해 logback-spring.xml 또는 application.properties 내 로깅 설정을 간편하게 지원합니다.

 요약

  1. 스프링 부트 Mock
    • 실제 객체 대신 가벼운 모의(Mock) 객체를 사용해 테스트 속도를 높이고, 외부 의존성을 단절시킵니다.
  2. 서블릿 컨테이너 모킹
    • 실제 톰캣을 띄우지 않아도 @WebMvcTest, @AutoConfigureMockMvc 등을 이용해 컨트롤러 로직을 빠르게 검증할 수 있습니다.
  3. MockMvc
    • perform() 메소드로 가상의 요청을 보내고, andExpect() 메소드로 컨트롤러 응답을 검증합니다.
    • 파라미터, 헤더, 요청 본문, 응답 코드, JSON 응답 등 다양한 항목 테스트 가능.
  4. 스프링 부트 로깅(SLF4J & LogBack)
    • SLF4J 퍼사드를 통해 로그 프레임워크 종속성을 줄이고, LogBack을 기본 로깅으로 사용.
    • 퍼사드 패턴 덕분에 로깅 프레임워크를 교체해도 코드 수정 범위가 최소화됩니다.

테스트 코드를 간소화하고, 실제 환경 의존도를 낮추어 더 높은 테스트 안정성속도를 확보하고 싶다면 스프링 부트의 Mocking 기법과 MockMvc를 적극 활용해 보세요. 또한, 로깅은 애플리케이션 운영과 디버깅에 매우 중요한 요소이므로, SLF4J와 LogBack을 잘 구성해 두면 장기적으로 큰 도움이 될 것입니다.


  • 스프링 부트(Spring Boot)
  • Mock(목), Mocking(모킹)
  • MockMvc, 서블릿 컨테이너 모킹
  • @WebMvcTest, @AutoConfigureMockMvc
  • SLF4J, LogBack, 퍼사드(Facade) 패턴
  • 테스트 자동화, 서블릿 컨테이너 없이 테스트하기

위 내용을 통해 스프링 부트 테스트에서 MockMvc를 활용한 서블릿 컨테이너 모킹로깅(Logging) 전략을 쉽게 이해하시길 바랍니다. 궁금하신 점이나 더 알고 싶은 부분이 있다면 언제든지 댓글로 남겨주세요! 여러분의 개발과 테스트 환경에 조금이라도 도움이 되길 바랍니다.

Leave a Comment