본문 바로가기
Back-End/Spring

HTTP 요청 메시지 - JSON

by 호강하는 지해 2024. 1. 18.
728x90

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으로 바뀌어서 나가게 된다.

728x90

'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