- Spring MVC 마스터하기 2 (요청 부분)2022년 04월 19일
- starryeye
- 작성자
- 2022.04.19.:53
서블릿의 예제와 문법은 제외 하겠다.
(Spring MVC의 핵심이 되는 컨트롤러 에노테이션 기준으로 서술)
@Controller
반환 값이 String이면 View 이름으로 인식, View를 찾고(ViewResolver) View가 렌더링 된다.
@RestController
반환 값으로 뷰를 찾는게 아니라, HTTP 메세지 바디에 바로 입력 된다.
@RequestMapping
method = RequestMethod.GET 과 같이 HTTP 메서드를 지정하지 않을 경우, HTTP Method와 무관하게 모두 적용된다.
(GET, HEAD, POST, PUT, PATCH, DELETE)
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping
@RequestMapping에 각 HTTP Method를 지정한 것과 동일한 효과이다.
@PathVariable
"userId" 를 PathVariable(경로변수)이라 부른다.
파라미터 data 변수로 해당 값을 받을 수 있다.
위 예제에서 "@PathVariable String userId" 로 파라미터를 받으면, ("userId") 부분을 생략 가능하다.
(PathVariable을 여러개 만들고, 파라미터를 여러개 받으면 다중으로 사용가능)
(위 예제의 클래스에서 @RestController를 사용하여 "ok" 스트링이 HTTP Message Body에 직접 입력됨)
@RequestHeader
@RequestHeader는 HTTP Message의 헤더 값들을 받을 수 있다.
@RequestHeader MultiValueMap<String, String> headerMap 으로 모든 HTTP 헤더를 MultiValueMap 형식으로 조회 할 수 있다.
@RequestHeader("host") String host 형식으로 특정 HTTP 헤더를 조회 할 수 있다.
HTTP 요청 데이터 다루기
클라이언트에서 서버로 요청데이터를 보내는 건 3가지 뿐이다.
ㄱ. GET - 쿼리 파라미터
ㄴ. POST - HTML Form
ㄷ. HTTP message body
ㄱ, ㄴ은 컨트롤러 입장에서 동일한 방식으로 조회 가능하다.
(아래는 쿼리 파라미터, HTML Form 형식으로 요청 데이터가 왔을 경우이다.)
@ResponseBody, @RequestParam
@RequestParam("username") String memberName 형식으로
쿼리 파라미터(or Post Html Form) key(username) 값에 대한 value 값을 조회
@RequestParam(required = false) String memberName 형식으로 Optinal 필드로 설정 가능
(기본값은 true로 mandatory, false일 경우 타입을 신중하게 선택 Integer 객체를 사용해야함 - null 처리)
@RequestParam(defaultValue = "-1") int age 형식으로 기본값을 사용할 경우 Integer 객체를 사용할 필요없다.
@PathVariable과 동일한 방식으로 생략하는 것 가능
@RequestParam Map<String, Object> paramMap 형식으로 모든 쿼리 파라미터를 다 받을 수 있다.
클래스에 @Controller라고 되어있을 경우 String 반환이면 뷰를 찾는데,
@ResponseBody로 적용된 메서드는 HTTP 메세지 바디에 직접 문자열을 넣어주게 된다.(뷰 X)
@ModelAttribute
위 예제처럼 @ModelAttribute 에노테이션 사용 시, 객체로 바로 받을 수도 있다.
흐름은 다음과 같다.
1. HelloData 객체 생성
2. 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티 찾기
3. 해당 프로퍼티의 setter를 호출하여 파라미터의 값을 바인딩
<프로퍼티>
객체의 getXXX(), setXXX() 메서드가 있으면, 해당 객체는 XXX라는 프로퍼티를 가지고 있음.
set에서 타입이 안맞는 경우에 (숫자 타입인데 문자를 넣게되면...) BindException 터짐
@ModelAttribute 자체를 생략 할 수 있다.
그러나, @RequestParam도 자체 생략 가능하다.
-> 스프링은 String, int, Interger와 같은 primitive 타입은 @RequestParam이 생략했다고 생각, 그외는 @ModelAttribute
(argument resolver 로 지정한 타입은 제외 - 대표적으로 HttpServletResponse 같은게 있다..)
또 하나의 기능, Model에 @ModelAttribute로 지정한 객체(HelloData)가 자동으로 넣어진다.
위 예제에서는 Model 타입의 파라미터가 없는데.. 없어도 동작한다. (생략이 가능하다는 말)
=> model.addAttribute("helloData", helloData) 이게 있는 효과이다. (자동)
Model에 addAttribute 메서드로 객체(HelloData)를 넣을때는 이름이 필요하다..
-> 예제와 같이 @ModelAttribute의 name 요소가 없을 경우엔 지정된 객체의 앞글자 소문자로 들어간다.
;-> name요소가 있으면 name요소로..
-> 물론 addAttribute로 직접 넣을수도 있다.
-> @ModelAttribute를 생략한 케이스에도 작동된다.
@ModelAttribute
위와 같이, 컨트롤러 클래스에 @ModelAttribute로 메서드를 만들면
해당 클래스의 모든 컨트롤러 메서드의 model 객체에 해당 값이 넣어진다.
model.addAttribute("regions", regions); 한 결과와 동일..
(attributeName은 에노테이션의 값, attributeValue는 return 값이다.)
ㄷ. HTTP message body를 통해 직접 데이터가 넘어오는 경우
(아래는 쿼리파라미터 또는 HTML Form 형식이 아닌 바디에 직접 데이터가 넘어오는 경우이다.)
@RequestParam, @ModelAttribute를 사용할 수 없다.
단순 텍스트가 넘어왔다 HttpEntity
HTTP message body에 있는걸 String으로 변환하여 넘겨주겠다는 의미이다.
httpEntity.getHeaders()로 헤더를 조회하는 것도 가능하다.
HttpEntity를 이용하여 응답 메세지 바디 정보를 직접 넣어주는 것도 가능
<HttpEntity를 상속하여 구현한 객체>
RequestEntity
-> HttpMethod, url 정보가 추가 되었다.
ResponseEntity
-> HTTP 상태코드 설정 가능하다.
(return new ResponseEntity<String>("good", responseHeaders, HttpStatus.CREATED) // 201 상태코드
단순 텍스트가 넘어왔다 @RequestBody
@RequestBody와 @ResponseBody는 짝이다.
@RequestBody를 사용하면 요청 HTTP 메세지 바디정보를 조회 할 수 있다.
@RequestHeader를 사용하면 요청 HTTP 메세지 헤더정보를 조회 가능하다. (위에 있었음)
@RequestBody, @RequestHeader는 생략이 불가능하다.
-> 생략시 @RequestParam, @ModelAttribute가 적용되어 버린다. (쿼리 파라미터를 처리하게 됨)
Json이 넘어왔다 ObjectMapper
ObjectMapper 객체를 통하여 String으로 받은 요청데이터 HTTP message body를 객체로 읽을 수 있다.
(파라미터 자체는 단순텍스트 받기와 동일)
ObjectMapper 객체를 사용하지 않고 객체 타입으로 직접 받아도 된다.
<반환 값을 String으로 하지 않고 HelloData와 같이 객체로 설정하여 리턴 가능하다.>
<물론 HttpEntity로도 가능하다>
<@RequestBody 요청>
Json 요청 -> HTTP 메세지 컨버터 -> 객체 생성
<@ResponseBody 응답>
객체 생성 -> HTTP 메세지 컨버터 -> Json 응답
HTTP 메세지 컨버터에 대해서는 따로 포스팅 예정
Json이 넘어왔다 HttpEntity
단순텍스트 받기와 동일하게 사용하고 Generic 타입을 객체로 설정해준다.
<클라이언트에서 서버로 보내는 요청 데이터 받기 정리>
헤더
-> @RequestHeader
경로 변수(PathVariable) - url 자체
-> @PathVariable
쿼리 파라미터, HTML Form
-> @RequestParam, @ModelAttribute(객체)
요청 HTTP Message Body - json시, HTTP 메세지 컨버터 개념
-> @RequestBody, HttpEntity
'Spring > MVC' 카테고리의 다른 글
Spring MVC Redirect, PRG (0) 2022.05.06 Spring MVC 마스터하기 4 (0) 2022.04.24 Spring MVC 마스터하기 3 (응답 부분) (0) 2022.04.22 Spring MVC 마스터하기 1 (0) 2022.04.17 Servlet + JSP의 MVC 패턴에서 Spring MVC 로 발전하는 모습 (0) 2022.04.05 다음글이전글이전 글이 없습니다.댓글