우리네 장

[ Spring ] HTTP Protocol GET/POST 방식 차이에 따른 Spring annotation 사용 본문

SpringFramework

[ Spring ] HTTP Protocol GET/POST 방식 차이에 따른 Spring annotation 사용

qpmi1zm29 2022. 4. 19. 12:33

※GET / POST 방식의 차이 

GET POST
request header에 데이터를 담아 패킷을 전송한다.  request body에 데이터를 담아 패킷을 전송한다. 
Content-Type header 속성이 적용되지 않는다.  Content-Type header 속성이 적용 된다. 
1차원적인 데이터만 parameter로 전달할 수 있다. 객체속의 객체, 2차원 배열 등을 parameter로 전달할 수 있다.
웹 서버에서 cache 기능을 사용할 수 있다.  웹 서버에서 cache 기능을 사용할 수 없다. 

 

GET / POST 속도 견해

 

4번째 차이로 인해 발생한다. 

GET 방식은 캐싱 기능을 사용할 수 있어 WAS 까지 진입하지 않고도 client에 response 할 수 있어 속도면에서 더 빠르다. 

 

GET / POST 방식에 따른 annotation 사용 

 

1번째 차이로 인해 Spring 에서 파라미터에 사용하는 어노테이션에서 차이를 보인다. 

@RequestBody는 request 패킷에 body 가 존재해야 사용할 수 있는 어노테이션인데, GET 방식의 경우에는 body가 존재하지 않으므로 @RequestBody를 사용할 수 없다. 

 

또한 method 파라미터에 아무 어노테이션을 사용하지 않으면 Spring에서 GET방식으로 보낸 요청으로 파악하여 그에 맞게 binding한다고 한다. 

 

결국, POST 방식에서는 메소드 파라미터에 @RequestBody를 붙여줘야 하고, 이는 MessageConverter의 영향을 받는다.

MessageConverter는 request로 넘어오는 패킷의 header 부분 Content-Type을 확인하여 request parameter를 VO 혹은 String 으로 binding 해준다. 

참고로 컨트롤러 메소드 파라미터에 @RequestBody는 하나만 사용할 수 있다.

 

그러나 GET 방식에서는 어노테이션을 붙이지 않아야 Spring에서 GET방식으로 binding을 해주고,  binding할 파라미터가 많지 않은 경우에는 @RequestParam을 사용 가능하다. 

 

@RequetBody 가 붙지 않았으므로 MessageConverter의 영향을 받지 않고, GET방식은 위 2번째 특징으로 인해 Content-Type 헤더가 붙지 않으므로 파라미터를 받는 입장 ( 현재 Controller ) 에서는 일반 문자열 ( = String ) 으로 인식하여 처리한다. 

 

그러나 client로 response를 return  할 때는 @ResponseBody 가 붙었으므로 MessageConverter의 영향을 받고, return type에 따라 적절한 Converter를 선택하여 response Content-Type을 세팅해 client에게 내려준다. 

( Content-Type이 없으면 데이터 전송 측은 특정한 형식의 데이터여도, 데이터 수신 측은 단순 텍스트 데이터로 인식한다. )

 

 기타 추가 정보

 

※ header의 Accept 속성 ※

 

Content-Type과 같은 MIME 속성이라 의미가 자주 헷갈려 정리하게 되었다.

Content-Type은 패킷의 body에 담긴 정보를 설명하는 header 속성이라면, 

Accept 헤더는 client에서 server에게 response를 내려줄 때 Accept 헤더와 같은 데이터 타입으로 값을 내려달라고 요구 할 때 쓰는 속성이다.

이는 client에서 처리 가능한 데이터 타입이 한정되어 있을 때 사용한다. 

 

※ @ModelAttribute 

 

request 관련 어노테이션을 공부하던 와중에 @ModelAttribute의 의미가 request로 들어온 파라미터 중 특정 파라미터만을 사용하고 싶을 때 ( binding 하고 싶을 때 ) 쓰는 것이라고 보았다. 

 

그러나 위 의미 외에 한가지가 더 있다.

@ModelAttribute가 붙은 파라미터는 Model 객체에 setAttribute( ) 를 하지 않아도 자동으로 Model에 포함되어 return 된 view에서 사용할 수 있게 된다. 

 

그러므로 ViewResolver, Model 객체와 긴밀한 연관이 있으며, 보통 return 타입이 String 이고 @ResponseBody가 붙지 않는 메소드에서 자주 사용되게 된다.