Spring 기초 5주차
@RequestParam
URL에서 파라미터 값과 이름을 함께 전달하는 방식
GET 방식의 통신을 할 때 많이 사용
※ ?뒤에 오는 URL을 Query String, Query Parameter, Request Param이라 한다.
@Slf4j
@Controller
public class RequestParamControllerV2 {
@ResponseBody
@GetMapping("/v1/request-param")
public String requestParamV1 (
@RequestParam("name") String userName,
@RequestParam("age") int userAge
) {
// logic
log.info("name={}", userName);
log.info("age={}", userAge);
return "success";
}
}
- @Controller + @ResponseBody
- View를 찾는 것이 아니라 ResponseBody에 응답을 작성한다(=@RestController)
- @RequestParam
- 파라미터 이름으로 바인딩한다.
- @RequestParam(”속성값”)
- 속성값이 파라미터 이름으로 매핑된다.
\
@RequestParam 사용법
속성값과 변수명이 같으면 생략이 가능하다.
ex) @RequestParam("name") String name
@RequestParam String name,
@RequestParam int age
@RequestParam(어노테이션) 은 생략이 가능하지만 @RequestParam(required=false) 필수 여부 속성이 default로 설정된다. 요청 파라미터와 이름이 완전히 같아야 하고 또 단순 타입(int, String, Integer 등)이어야 생략 가능하다.
협업시 혼동을 줄 수 있기 때문에 이 방식을 권장은 하지 않고 최소 @RequestParam String name 속성 값 생략 형태를 쓰면 된다.
required 속성 설정
- 파라미터의 필수 값을 설정
- API 스펙을 규정할 때 사용
- @RequestParam을 사용하면 기본 Default값은 True
- default 속성 적용
- defaultValue 속성을 설정하게 되면 “” 빈 문자열의 경우에도 기본 값이 설정된다. - Map 사용
@ModelAttribute
요청 파라미터를 받아 필요한 Object로 바인딩 해준다.
주로 HTML 폼에서 전송된 데이터를 바인딩하고 HTTP Method POST인 경우 사용된다.
※ @Data는 @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructer를 자동으로 설정해주는 역할. 테스트 용도로만 사용하고 실무에서는 잘 사용하지 않음
// 기존 코드
@Data
public class Tutor {
private String name;
private int age;
}
@Controller
public class ModelAttributeController {
@ResponseBody
@PostMapping("/v1/tutor")
public String requestParamV1(
@RequestParam String name,
@RequestParam int age
) {
Tutor tutor = new Tutor();
tutor.setName(name);
tutor.setAge(age);
return "tutor name = " + name + " age = " + age;
}
}
@RequestParam 의 Mapping을 사용하게 되면 위와 같은 객체를 생성하는 코드가 포함되는데, @ModelAttribute 는 해당 과정을 자동화 한다.
// @ModelAttribute 적용
@ResponseBody
@PostMapping("/v2/tutor")
public String modelAttributeV2(
@ModelAttribute Tutor tutor
) {
String name = tutor.getName();
int age = tutor.getAge();
return "tutor name = " + name + " age = " + age;
}
@ModelAttirubte 동작 순서
- 파라미터에 @ModelAttribute가 있으면 파라미터인 Tutor 객체를 생성한다.
- 요청 파라미터 이름으로 객체 필드의 Setter를 호출해서 바인딩한다.
- 파라미터 이름이 name 이면 setName(value); 메서드를 호출한다.
- 파라미터 이름과 필드 이름이 반드시 같아야 한다.
@RequestParam, @ModelAttribute는 GET + Query Parameter와, POST HTML Form Data를 바인딩하는 방법
HttpEntity
HTTP Header, Body 정보를 편리하게 조회할 수 있도록 만들어줌
HttpEntity를 사용하면 HttpMessageConverter를 사용한다.
HttpMessageConverter
JSON 데이터와같은 것들을 Java에서 쉽게 접근해서 사용할 수 있도록 Object로 만들어주는 역할
@RequestBody, @ResponseBody
각각 Request, Response 객체의 Body에 편하게 접근하여 사용할 수 있다.
@RequestBody
- 요청 메세지 Body Data를 쉽게 조회할 수 있다.
@RequestHeader
- 요청 헤더 정보 조회
@ResponseBody
- 응답 메세지 바디에 값을 쉽게 담아서 전달할 수 있도록 해준다.
- View가 아닌 데이터를 반환한다.
요청 파라미터, HTML Form Data에 접근하는 경우 ▶ @RequestParam, @ModelAttribute 사용
Http Message Body에 접근하는 경우 ▶ @RequestBody 사용 (JSON, XML, TEXT)
JSON
@RequestBody 어노테이션을 사용하면 Object를 Mapping할 수 있다.
HttpEntity<>, @RequestBody를 사용하면 HTTPMessageConverter가 Request Body의 Data를 개발자가 원하는 String이나 Object로 변환해준다.
HTTP Message Converter가 ObjectMapper를 대신 실행한다.
- 요청 데이터는 @RequestBody를 사용해서 바인딩
- @RequestBody 는 생략 불가능 ▶ @ModelAttribute가 적용되기 때문
- HttpMessageConverter 가 요청 응답 데이터를 모두 변환할 수 있다.
- JSON은 MappingJackson2HttpMessageConverter 를 사용한다.
- Request Header의 Content-Type은 application/json 이어야 한다.
- Header로 어떤 Converter가 동작할지 판별한다.
HTTPMessageConverter
HTTP 요청과 응답을 변환하는 인터페이스
클라이언트와 서버 간에 데이터를 주고받을 때 요청 데이터를 자바 객체로 변환하거나 자바 객체를 응답 본문으로 변환하는 역할
MappingJackson2HttpMessageConverter는 JSON을 처리하는 대표적인 HTTPMessageConverter의 구현체이다.

- @RequestBody
- 요청 데이터 + Request Header를 참고하여 Object로 변환
- @ResponseBody
- 응답 데이터 + Accept Header를 참고하여 원하는 데이터 형식으로 변환
'TIL' 카테고리의 다른 글
| TIL 241105 (0) | 2024.11.05 |
|---|---|
| TIL 241104 (0) | 2024.11.04 |
| TIL 241101 (0) | 2024.11.01 |
| TIL 241031 (0) | 2024.10.31 |
| TIL 241030 (1) | 2024.10.30 |