프로젝트

블로그 만들기 - controller test (ObjectMapper)

ernest45 2025. 3. 29. 22:29

 

 

스프링에서 테스트가 익숙치 않은데 그 중에서도 더 익숙하지 않은 경우는 controller test이다..

mock으로 직접 설정하고 해야하기에..

 

@Test
@DisplayName("createNewAccessToken() : 새로운 액세스 토큰을 발급한다.")
void createNewAccessToken() throws Exception {

    //given

    final String url = "/api/token";

    User testUser = userRepository.save(User.builder()
            .email("user@email.com")
            .password("test")
            .build());

    String refreshToken = JwtFactory.builder()
            .claims(Map.of("id", testUser.getId()))
            .build()
            .createToken(jwtProperties);


    refreshTokenRepository.save(new RefreshToken(testUser.getId(), refreshToken));

    CreateAccessTokenRequest request = new CreateAccessTokenRequest();
    request.setRefreshToken(refreshToken);

    final String requestBody = objectMapper.writeValueAsString(request);

    //when

    ResultActions resultActions = mockMvc.perform(post(url)
            .contentType(MediaType.APPLICATION_JSON_VALUE)
            .content(requestBody));


    resultActions.andExpect(status().isCreated())
            .andExpect(jsonPath("$.accessToken").isNotEmpty());
}

 

 

테스트 내용은

 

토큰이 들어온다면, 201과 accessToken이 있는 지 검증하는 결과이다.

 

 

 

그 과정에서 항상 헷갈리는 것이 objectmappermockMvc

 

 

 

 

1. ObjectMapper

 

 

ObjectMapper는 Jackson 라이브러리에서 제공하는 클래스로,
Java 객체와 JSON 변환(직렬화 & 역직렬화)을 도와줌

 

ObjectMapper는 @RestController에서 기본적으로 사용되고,
Spring Boot의 @RestController는 내부적으로
ObjectMapper를 사용해서
컨트롤러의 반환 객체를 자동으로 JSON으로 변환해준다.

 

 

왜 ObjectMapper가 필요한가?

HTTP 요청의 본문(body)은 JSON 형식

  • MockMvc로 테스트할 때, 요청 본문(body)을 JSON 형식으로 보내야 함.
  • objectMapper.writeValueAsString(request)를 사용하면 Java 객체를 JSON 문자열로 변환하여 요청 본문으로 사용할 수 있음.

Spring MVC 컨트롤러는 JSON을 객체로 변환해야 함

  • 컨트롤러에서 @RequestBody CreateAccessTokenRequest request 같은 파라미터를 받을 때,
    Spring은 JSON 데이터를 자동으로 객체로 변환해줌.
  • 이때 내부적으로 ObjectMapper가 동작해서 JSON을 CreateAccessTokenRequest 객체로 바꿔줌.

 

 

 

 

즉! 직렬화와 역직렬화를 해주는 객체와 Json의 변환을 담당!

 

 

(자동으로 controller에서 해주다보니, 간과할 때가 많다ㅠ)