JSON 데이터 구조를 처리해주는 라이브러리
SpringBoot의 starter-web에서는 default로 Jackson 관련 라이브러리들을 제공한다.
직접 JSON 데이터를 처리해야할 때는 Jackson 라이브러리의 ObjectMapper를 사용할 수 있다.
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);
}
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());
}
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;
}
직렬화, 역직렬화를 공부하면서 너무 생각없이 코드만 따라 작성했던 내 자신을 발견할 수 있었다... 일관된 방식 참 괜찮은 방법이라 생각한다. 👍
참고자료