[JAVA] Spring Boot + Jackson으로 JSON 테스트 자동화!

wony·2024년 12월 2일

Java

목록 보기
30/30
  • 스프링 프레임워크에서는 JSON 데이터를 처리하기 위해 Jackson 라이브러리를 사용한다.
  • Jackson은 자바 객체와 JSON 데이터 간의 변환을 쉽게 처리할 수 있는 강력한 라이브러리로, JSON 직렬화 및 역직렬화를 지원한다.
  • 즉, Java Object를 JSON으로 변환하거나 JSON을 Java Object로 변환하는 데 사용할 수 있는 Java 라이브러리이다.

1. Jackson과 ObjectMapper

1. ObjectMapper란?

Jackson 라이브러리의 핵심 클래스인 ObjectMapper는 Java 객체와 JSON 간의 변환 작업을 처리합니다.

  • Java 객체 → JSON: 직렬화(Serialization)
  • JSON → Java 객체: 역직렬화(Deserialization)

2. writeValueAsString() 메서드

objectMapper.writeValueAsString(request)는 Java 객체를 JSON 문자열로 변환하는 메서드입니다.

  • 입력: Java 객체 (PostCreate)
  • 출력: JSON 문자열
    {
        "content": "내용입니다."
    }

3. Spring Boot와 Jackson의 통합

Spring Boot에서는 기본적으로 Jackson이 통합되어 있어 추가 설정 없이 사용할 수 있습니다.

  • Jackson 포함 위치: spring-boot-starter-web에 Jackson 라이브러리가 포함되어 있음.
  • HTTP 요청/응답 변환: Spring MVC는 Jackson을 사용하여 JSON 데이터를 자동으로 직렬화/역직렬화합니다.
    • 요청 JSON → Java 객체: @RequestBody
    • Java 객체 → 응답 JSON: @ResponseBody 또는 RestController

4. 결과적으로 Jackson의 역할

  • 요청 데이터 준비: ObjectMapper로 Java 객체를 JSON 문자열로 변환하여 API 요청에 사용.
  • Spring MVC와의 통합: JSON 요청 데이터를 자동으로 Java 객체로 변환하여 컨트롤러에서 처리.

5. Jackson 추가 설정

Jackson의 기본 설정 외에도 다음과 같은 기능을 커스터마이징할 수 있습니다:
1. JSON 필드 이름 변경: @JsonProperty

public class PostCreate {
    @JsonProperty("title")
    private String title;
}
  1. 무시할 필드 지정: @JsonIgnore
@JsonIgnore
private String sensitiveData;
  1. 날짜 형식 지정: @JsonFormat
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate date;

2. Jackson 라이브러리를 활용한 Spring Boot 테스트 작성

@Test
@BlogMockUser
@DisplayName("글 작성 요청 시 title 값은 필수다.")
void test2() throws Exception {
    // given: 테스트에서 사용할 데이터를 준비합니다.
    PostCreate request = PostCreate.builder()
            .content("내용입니다.") // title 값을 누락하여 필수 값 검증을 유발
            .build();

    // Jackson의 ObjectMapper를 사용하여 Java 객체를 JSON 문자열로 변환
    String json = objectMapper.writeValueAsString(request);

    // expected: API 호출과 예상 결과를 검증합니다.
    mockMvc.perform(post("/api/posts") // HTTP POST 요청
                    .contentType(APPLICATION_JSON) // 요청 데이터의 타입을 JSON으로 지정
                    .content(json)) // JSON 데이터 전송
            .andExpect(status().isBadRequest()) // HTTP 상태 코드 400 (Bad Request) 확인
            .andExpect(jsonPath("$.code").value("400")) // 응답 JSON에서 code 필드 값 확인
            .andExpect(jsonPath("$.message").value("잘못된 요청입니다.")) // message 필드 값 확인
            .andExpect(jsonPath("$.validation.title").value("타이틀을 입력하세요.")) // validation 필드 값 확인
            .andDo(print()); // 요청 및 응답 정보 출력
}

코드 주요 흐름

  1. 테스트 데이터 준비:

    • PostCreate 객체를 생성하되, 필수 값인 title을 누락하여 유효성 검증 오류를 유발합니다.
    • Jackson의 ObjectMapper를 사용해 이를 JSON 문자열로 변환합니다.
  2. mockMvc를 이용한 API 테스트:

    • /api/posts 경로로 POST 요청을 보냅니다.
    • JSON 데이터를 전송하며, Content-Type을 application/json으로 지정합니다.
  3. 응답 결과 검증:

    • HTTP 상태 코드가 400 (Bad Request)인지 확인합니다.
    • 응답 JSON의 특정 필드(code, message, validation.title) 값을 검증합니다.
  4. 출력 확인:

    • andDo(print())를 사용해 요청 및 응답 데이터를 출력합니다.
profile
안녕하세요. wony입니다.

0개의 댓글