ObjectMapper란?

박민주·2024년 1월 8일
0

일반적으로 요청을 받아야 내려받을 수 있다. 요청은 어떻게 내려받고 어떻게 표현될까?

//text
    @GetMapping("text")
    public String text(@RequestParam String account){
        return account;
    }

제일 기본적으로 위와 같이 text형식으로 내려받는 경우이다. 잘 쓰이지 않는다.

//json
    @PostMapping("/json")
    public User json(@RequestBody User user) {
        return user;
    }

위와 같은 json형식의 데이터를 객체를 return 받을 수 있다.
또한 객체는 json 형식으로 보내질 수 있는데 어떻게 된걸까?


객체 형태로 요청해도 json으로 받아올 수 있음을 확인 할 수 있다.

Reqeust가 오면
req -> object mapper -> object -> method -> object -> object mapper -> json -> response로 작동한다.

ObjectMapper

1. ObjectMapper를 이용한 직렬화(Serialize)

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

Spring에서는 기본적으로 jackson 모듈의 ObjectMapper라는 클래스가 직렬화를 처리한다. 그리고 그 과정에서 ObjectMapper의 writeValueAsString이라는 메소드가 사용된다.

var objectMapper = new ObjectMapper();

// object -> text
// objectMapper 가 get method를 활용한다.
User user = new User("steve", 10, "010-1111-1111");

String text = objectMapper.writeValueAsString(user);
System.out.println(text);

하지만 ObjectMapper의 기본 설정으로는 public 필드 또는 public 형태의 getter(getX로 시작하는 메소드)만 접근이 가능하다. 물론 ObjectMapper에 추가 설정을 통해 가시성을 높여줄 수 있지만, getter가 없는 경우는 거의 없으므로 기본 설정으로 사용해도 충분하다. 그러므로 ObjectMapper를 이용하는 경우, 직렬화를 위해 기본적으로 getter를 반드시 만들어두는 것이 좋다.


위와 같이 dto객체의 get으로 시작하는 메소드가 있다면

이와 같이 잘못된 응답을 내려 줄 수도 있다.

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

[ ObjectMapper의 역직렬화(Deserialize) 동작 방식 ]
ObjectMapper는 리플렉션을 활용해서 Json 문자열로부터 객체를 만들어내는데, 이것을 역직렬화(Deserialize)라고 한다. Spring에서 @RequestBody로 json 문자열을 객체로 받아올 때 역직렬화가 처리된다.

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

  1. 기본 생성자로 객체를 생성함
  2. 필드값을 찾아서 값을 바인딩 해줌
// text -> object
// default생성자가 있어야한다.
User objectUser = objectMapper.readValue(text, User.class);
System.out.println(objectUser);

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

참고

출처: https://mangkyu.tistory.com/223 [MangKyu's Diary:티스토리]
https://interconnection.tistory.com/137

profile
개발자 되고싶다..

0개의 댓글