학습참조
인프런-스프링 MVC 1편 백엔드 웹 개발 핵심 기술(김영한님)
✅ Servlet 방식
public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
log.info("username={} age={}", username, age);
response.getWriter().write("ok");
}
- 가장 기본적인 서블릿 방식의 request.getParameter를 사용한 방식.
✅ @RequestParam 애노테이션 방식
☑ 가장 기본적인 형태
public String requestParamV2(
@RequestParam("username") String userName,
@RequestParam("age") int userAge) {
log.info("username={} age={}", userName, userAge);
return "ok";
}
☑ 애노테이션 @Request(name="")을 생략한 형태
public String requestParamV3(
@RequestParam String username,
@RequestParam int age) {
log.info("username={} age={}", username, age);
return "ok";
}
- 위와 같이 생략 할 경우 변수이름이 paramter 이름과 동일 해야함.
☑ 애노테이션 자체를 생략한 형태
public String requestParamV4(String username, int age) {
log.info("username={} age={}", username, age);
return "ok";
}
- parameter value type이 primitive 형태(int, long, float, double 등) 인 경우 생략 가능.
☑ required 옵션
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age) {
log.info("username={} age={}", username, age);
return "ok";
}
- default는 true이며 생략가능하고 true일 경우 반드시 해당 parameter가 담긴상태로 요청해야 한다. 이를 어길 경우 Bad Request 400 error 발생함.
- parameter의 value가 빈 문자일 경우 null이 아닌 공백("")이 적용됨.
- ...../username= 와 같은 요청이 들어왔을 경우 username은 ""이며 age는 null. int타입은 null을 가질수 없으므로 Integer 타입으로 선언되어야 한다.
☑ defaultValue 옵션
public String requestParamDefault(
@RequestParam(defaultValue = "guest") String username,
@RequestParam(defaultValue = "-1") int age) {
log.info("username={} age={}", username, age);
return "ok";
}
- parameter가 지정되지 않아도 자동으로 default 값을 가지며 username은 "geust", age는 -1 가 됨.
☑ Map을 이용한 모든 parameter 가져오기
public String requestParamMap(@RequestParam Map<String, Object> paramMap){
log.info("username={} age={}", paramMap.get("username"), paramMap.get("age"));
return "ok";
}
- 요청받은 모든 parameter들을 map에 저장하고 get을 통해 가져옴.
☑ MultiValueMap을 이용한 중복된 parameter명 처리
public String requestParamMap(@RequestParam MultiValueMap<String, Object> paramMap){
log.info("MultiValueMap={}", paramMap);
return "ok";
}
- parameter name이 중복 될 경우 사용 할 수 있음.
- MultiValueMap={key=[value1, value2, ...], key=[value1, value2, ...]} 와 같은 형태가 됨.
✅ @ModelAttribute를 이용한 만들어진 객체로 받기
☑ 예시를 위한 HelloData 객체
import lombok.Data;
@Data
public class HelloData {
private String username;
private int age;
}
- paramter를 전달받을 객체를 HelloData 객체 정의.
☑ 가장 기본적인 형태
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("helloData={}", helloData);
return "ok";
}
- parameter에 @ModelAttribute 애노테이션 넣어줌으로써 스프링이 자동으로 HelloData 객체를 생성하고 요청받은 Data를 주입함.
☑ @ModelAttribute 애노테이션 생략 형태
public String modelAttributeV2(HelloData helloData) {
log.info("helloData={}", helloData);
return "ok";
}