@RequestBody는 왜 빈 생성자를 필요로 할까? (2편)

허진혁·2022년 12월 20일
0

이전편에서 클라이언트가 Json형태에서 요청을 하면, @ReuqestBody 애노테이션이 붙은 객체로 변환하는 과정을 살펴보았어요.

이번 편에는 ObjectMapper의 변환 과정을 살펴볼게요.

변환 과정을 살피기 전에 objectMapper는 Jackson 문서에서 다음과 같이 정의되어 있어요.

"ObjectMapper는 기본 POJO(Plain Old Java Objects) 또는 범용 JSON Tree Model(JsonNode)에서 JSON을 읽고 쓰는 기능과 변환 수행을 위한 기능을 제공합니다.
또한 다양한 스타일의 JSON 컨텐츠와 함께 작동하고 다형성 및 객체 동일성과 같은 고급 객체 개념을 지원하도록 Customizing할 수 있습니다."

정리해보면
Jackson의 objectMapper는 Java Object ←→ JSON 파싱을 쉽게 해주는 역할을 합니다.

ObjectMapper 클래스를 살펴보면, serialize와 deserialize라는 단어가 포함된 메서드를 찾을 수 있어요.

Java -> Json 파싱 과정을 직렬화(serialize)라고 하며, 반대는 역직렬화(deserialize)라고 합니다.

Json을 타입을 인식 후 Object로 변환하는 과정을 살펴 보아요.

테스트 코드를 먼저 작성해서 디버깅 하는 방식으로 해보려 했어요.
(부족한게 많으니 틀린 부분이 있다면 알려주세요!!)

@SpringBootTest
public class JsonTest {

    @Test
    void test() {
        ObjectMapper objectMapper = new ObjectMapper();
        String json = "{\"name\":\"jin\"}";
        InputStream inputStream = new ByteArrayInputStream(json.getBytes());

        try {
            User user = objectMapper.readValue(inputStream, User.class);
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @NoArgsConstructor
    @AllArgsConstructor
    static class User {
        String name;
    }

}

위를 실행하니 아래와 같이 나와서 차근차근 디버깅해보려 해요

AbstractJackson2HttpMessageConverter에서 objectMapper가 readvalue() 메서드를 호출합니다.

로직을 따라가다보니 deserialize()에서 vanillaDeserialize()실행

다음과 같이 디폴트생성자를 사용해서 Object 만드는 것을 확인할 수 있어요.

객체를 만들 때 일반적으로 기본생성자를 호출 !!!!

그렇다면 이제 값을 어떻게 넣는지 확인해봐요.
우선 json에서 key값을 가져와요.

key에 해당하는 value를 가져와 set을 해줘요.

이렇게 변환하는 과정이 정리가 되었어요.

단지 @Requestbody가 어떻게 작동하는지 알아보려 했는데, 정말 스프링 내부적으로 많은 메서드들이 이뤄지고 있네요.

참고자료

@RequestBody에 왜 기본 생성자는 필요하고, Setter는 필요 없을까? #2

profile
Don't ever say it's over if I'm breathing

0개의 댓글