HTTP 요청시 데이터를 주고 받는 형식이 있다.
HTTP 요청 메세지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법
서버로 요청 데이터를 전달하는 3가지 방법
크게는
- 요청 파라미터로 전달
- HTTP message Body에 담아서 전달
파라미터로 전달
GET 쿼리 파라미터 전송 방식이든, POST HTML Form 전송 방식이든 둘다 형식이 같으므로 구분없이 조회할 수 있다. 이것을 간단히 요청 파라미터 조회라고 한다.
- request.getParameter() : 단순히 HttpServlerRequest가 제공하는 방식으로 요청 파라미터를 조회
- @RequestParam : 파라미터 이름으로
- HTTP 파라미터 이름이 변수와 같으면 name="xx" 생략 가능
- String , int , Integer등의 단순 타입의 경우 @RequestParam도 생략 가능
- @PathVariable : url에 /{userId} 인경우 @PathVariable을 통해 userId를 바인딩 할 수 있음
- @ModelAttribute : 요청 파라미터를 받아서 객체에 값을 넣어주는 것을 편하게 만들어줌, 객체를 생성하고, 요청 파라미터의 이름으로 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 바인딩(입력)한다. 파라미터의 값이 username이면 setUsername()메서드를 찾아서 호출하면서 값을 입력한다.
HTTP message Body에 데이터를 담아서 전달
이 경우에는 @RequestParam,@ModelAttribute를 사용할 수 없다. 단, HTML Form 형식으로 전달되는 경우 요청 파라미터로 인정된다.
- HTTP API에서 주로 사용 된다
- 데이터 형식은 주로 JSON 사용
- POST,PUT,PATCH
요청 데이터 정리
- 요청 파라미터를 조회하는 기능 : @RequestParam , @ModelAttribute
- HTTP 메세지 바디를 직접 조회하는 기능
- @ResponseBody : 응답 결과를 HTTP 메세지 바디에 직접 담아서 전달할 수 있다. 물론 이 경우에도 view를 사용하지 않는다. 또한 직접 만든 객체를 지정할 수 있다. 메세지 바디로 온 데이터의 경우 @ResponseBody를 생략할 수 없다. 생략한다면 @RequestParam 또는 @ModelAttibute가 적용되어 버린다.
주의 할것은 HTTP message body에 json 데이터를 전달할 경우 HTTP 요청시에 content-type이 application/json인지 꼭 확인해야 한다. 그래야 JSON을 처리할 수 있는 HTTP 메세지 컨버터가 실행되기 때문이다.
HTTP 응답
스프링에서 응답 데이터를 만드는 방법은 크게 3가지이다.
- 정적 리소스
- 뷰 템플릿 사용
- HTTP 메시지 사용
@ResponseBody가 없으면 뷰 리졸버가 실행되어서 뷰를 찾고, 렌더링 한다. @ResponseBody가 있으면 뷰 리졸버를 실행하지 않고, HTTP 메시지 바디에 직접 문자가 입력된다.
@RestController를 사용하면 해당 컨트롤러에 모두 @ResponseBody가 적용되는 효과가 있다. 따라서 뷰 템플릿을 사용하는 것이 아니라, HTTP 메시지 바디에 직접 데이터를 입력한다.