[프로그래밍 기록] Spring - Jackson

김엄지·2024년 3월 24일
0

Spring

목록 보기
11/21

Jackson이란?

JSON 데이터 구조를 처리해주는 라이브러리

  • Object -> JSON 타입의 String으로 변환
  • JSON 타입의 String -> Object로 변환

SpringBoot의 starter-web에서는 default로 Jackson 관련 라이브러리들을 제공한다.
직접 JSON 데이터를 처리해야할 때는 Jackson 라이브러리의 ObjectMapper를 사용할 수 있다.

1. Object To JSON

ObjectMapper의 직렬화(Serialize) 동작 방식

객체로부터 Json 형태의 문자열을 만들어내는데, 이것을 직렬화(Serialize)라고 한다. 해당 부분은 @ResponseBody나 @RestController 또는 ResponseEntity 등을 사용하는 경우에 처리된다.

@Test
@DisplayName("Object To JSON : get Method 필요")
void test1() throws JsonProcessingException {
    Star star = new Star("Robbie", 95);

    ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
    String json = objectMapper.writeValueAsString(star);

    System.out.println("json = " + json);
}
  • objectMapper의 writeValueAsString 메서드를 사용하여 변환
  • 파라미터에 JSON으로 변환시킬 Object의 객체를 준다.
  • Object -> JSON 타입의 String으로 변환하기 위해서는 해당 Object에 get Method가 필요

2. JSON To Object

2-1 ObjectMapper를 이용한 역직렬화(Deserialize)

son 문자열로부터 객체를 만들어내는데, 이것을 역직렬화(Deserialize)라고 한다. Spring에서 @RequestBody로 json 문자열을 객체로 받아올 때 역직렬화가 처리된다.

@Test
@DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
void test2() throws JsonProcessingException {
    String json = "{\"name\":\"Robbie\",\"age\":95}"; // JSON 타입의 String

    ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper

    Star star = objectMapper.readValue(json, Star.class);
    System.out.println("star.getName() = " + star.getName());
}
  • objectMapper의 readValue 메서드를 사용하여 변환
  • 첫 번째 파라미터는 JSON 타입의 String, 두 번째 파라미터에는 변환할 Object의 class 타입을 준다.
  • JSON 타입의 String -> Object로 변환하기 위해서는 해당 Object에 기본 생성자와 get 혹은 set Method가 필요

2-2 역직렬화는 기본적으로 다음과 같은 과정을 거쳐서 처리된다.

  • 기본 생성자로 객체를 생성함

  • 필드값을 찾아서 값을 바인딩 해줌

    가장 먼저 객체를 생성하는데, 기본 생성자가 없다면 에러를 발생시킨다. 기본 생성자로 객체를 생성한 후에는 필드값을 찾아야하는데, 기본적으로 public 필드 또는 public 형태의 getter/setter로 찾을 수 있다. 만약 처리에 실패하면 예외가 발생하게 되므로 기본 생성자와 getter Method는 반드시 만들어주는 것이 좋다.

2-3 Dto 클래스를 다음과 같이 사용하자.

참고한 블로그에서 위와 같은 개념을 머리에 담고 개발하는 것은 비효율적이라 dto에 다음과 같은 코드를 붙여주며 부담없이 일관된 방식을 제공하신다고 한다. (만약 @ModelAttribute 사용이 필요하다면 @Setter까지 넣어주기)

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MangKyuRequest {

    private String name;
    private Integer age;

}

마무리

직렬화, 역직렬화를 공부하면서 너무 생각없이 코드만 따라 작성했던 내 자신을 발견할 수 있었다... 일관된 방식 참 괜찮은 방법이라 생각한다. 👍


참고자료

profile
나만의 무언가를 가진 프로그래머가 되자

0개의 댓글