JSON은 규격화 한 문자열
규격화 했다는 것은 일정한 규칙에 맞게 작성했다는 의미다.
이 문자열을 해석해서 객체로 변환, 사용하기 쉽게 만드는 것을 '파싱'한다고 표현한다.
문자로 된 JSON 데이터를 Jackson 라이브러리인 objectMapper 를 사용해서 자바 객체로 변환한다.
여기서 잠깐❗️
objectMapper란?
객체를 직렬화하거나 객체로 역직렬화하는 Jackson 라이브러리의 클래스이다.
ObjectMapper는 생성 비용이 비싸기 때문에 bean/static으로 처리하는 것이 좋다.
객체로부터 JSON 형태의 문자열을 만들어내는데, 이것이 바로 직렬화(Serialize)다.
그리고 그 과정에서 ObjectMapper의 writeValue()라는 메소드가 사용된다.
- @ResponseBody나 @RestController 또는 ResponseEntity 등을 사용하는 경우에 처리된다.
JSON 문자열로부터 객체를 만들어내는데, 이것은 역직렬화(Deserialize)라고 한다.
그리고 그 과정에서 ObjectMapper의 readValue()라는 메소드가 사용된다.
- @RequestBody로 json 문자열을 객체로 받아올 때 역직렬화가 처리된다.
@RequestBody 덕분에 String messageBody로 받아온 json형태의 문자열 데이터를 파싱할 수 있었던 것
🧑🏻💻그렇다면❓
문자로 변환하고 다시 json으로 변환하는 과정이 불편하다. @ModelAttribute처럼 한번에 객체로 변환할 수는 없을까?
@RequestBody에 직접 만든 객체를 지정할 수 있다. 그럼 @ModelAttribute처럼 생략해도 될까?
답은 NO!
@RequestBody를 생략하면 안된다!
✍🏻 참고
매개변수란에 String messageBody로 문자열을 받아와서 또 objectMapper를 쓰며 json형태로 바꾸는 건 불편하니까 @RequestBody를 사용하면 한 번에 객체로 받아와서 쓸 수 있다. 라는 의미!
스프링은 @ModelAttribute , @RequestParam과 같은 해당 애노테이션을 생략시 다음과 같은 규칙을 적용한다.
- String , int , Integer 같은 단순 타입 = @RequestParam
- 나머지 = @ModelAttribute (argument resolver 로 지정해둔 타입 외)
따라서 이 경우 HelloData에 @RequestBody 를 생략하면 @ModelAttribute가 적용되어버린다.
HelloData data ➡️ @ModelAttribute HelloData data
따라서 생략하면 HTTP 메시지 바디가 아니라 요청 파라미터를 처리하게 된다.
JSON이 객체로 들어왔다가 객체가 다시 JSON으로 바뀌어서 나가게 된다.
'Back-End > Spring' 카테고리의 다른 글
HTTP 요청 파라미터 - @RequestParam, @ModelAttribute (0) | 2024.01.17 |
---|---|
Spring boot - 첨부파일이 있는 글 수정 (0) | 2024.01.04 |
페이징과 리스트 (0) | 2023.12.25 |
Spring - Spring MVC (0) | 2023.12.22 |