스프링 | 스프링 부트

스프링 부트(입문) - API(@ResponseBody)

Adose 2024. 8. 2. 19:27
  • 서버에서 데이터를 보내는 방법 
    1. 서버에서 템플릿 엔진을 통해 화면을 html로 웹브라우저에 전달 방법 (=MVC와 템플릿 엔진)
    2. 데이터를 responseBody(보통 json 형태로 전송, xml도 가능)에 넣어서 바로 전달하는 방법이 있다. (=API)
  • template엔진과 API 방법 차이
    • template 엔진은 view(html) 방식으로 return 된다면, API 방법은 그 문자(데이터, json 형식) 그대로 return 된다는 것을 알 수 있다. 

 

데이터를 ResponseBody에 넣어서 바로 보내는 방법 

 

@ResponseBody 

 

http의 body부분을 의미하고, 응답 body에 내용을 넣어준다는 말이다.
이 응답 body에 들어갈 <형식>은 개발자 본인이 정하면된다 -> "json, xml, 문자열 등"

 

 

∵  단축어 메모 

command + shift + enter : 문장을 끝내주는 단축어 
ex. Hello hello = new Hello( 이 상태에서 위 단축어를 사용해주면 Hello hello = new Hello(); 문장을 끝내준다. 

 

command + n : getter and setter를 자동으로 생성해주는 명령어가 있는 단축어 
getter, setter 외에도 생성자 등을 생성해준다. 

 

 

 

클라이언트에서 데이터 요청을 받고 응답으로 데이터를 보내는 방법 (Json 형식)

 

 

@Responsebody를 사용하고 메서드가 객체를 return 한다면, 이 객체를 JSON으로 변환하여 응답 본문에 포함한다.

(-> 만약 메서드가 문자열을 return 하면 해당 문자열이 그대로 HTTP 응답 본문에 작성된다 -> 위에 설명함 ) 

@ResponseBody가 자동으로 호출하는 getName() 메서드를 통해, Hello 객체의 name 필드 값을 가져오고, 이를 JSON으로 직렬화 한다.

 

 

 직렬화 과정에서는 해당 객체의 Getter 메서드를 이용하여 데이터를 추출하고, 이를 JSON 형태로 변환한다. 
  • 위의 코드에서 @RequestParam은 name 외의 다른 입력을 받지 않지만, 응답할때는 객체를 return 했다.
  • 객체를 return했기 때문에 Json 형태로 직렬화 하는 과정에서 해당 객체의 Getter 메서드를 이용하여 데이터를 추출하기 때문에 test도 같이 응답 본문에 포함되어져 아래와 같은 결과가 나오는 것을 알 수 있다. 
  • 만약 getTest() 메서드가 없다면 ? -> 두번째 그림과 같이 test가 없는 것을 알 수 있다. 

 

 

 

@ResponseBody 동작 방식 

 

 

@ResponseBody 사용시 

  • Http의 Body에 문자 내용을 직접 반환한다.
  • Http의 Body에 문자 내용을 반환하기 위해, View Resolver 대신, Http Message Converter가 사용된다.  

StringConverter : 기본 문자를 입력으로 받을때, Http의 Body에 기본 문자 형태로 응답을 보낸다. (StringHttpsMessageConverter)

 

JsonConverter : 객체를 입력으로 받을때, Http Body에  Json 형태로 응답으로 보낸다.(MappingJackson2HttpMessageConverter)