매개변수 타입이 HttpServletRequest 선언하면 request객체에서 year를 직접 꺼낸다.
사용자가 요청할 때 보낸 year값을 읽어볼 수 있다.
@Controller
public class RequestParamTest {
@RequestMapping("/requestParam")
public String main(HttpServletRequest request) {
String year = request.getParameter("year");
// http://localhost/ch2/requestParam ---->> year=null
// http://localhost/ch2/requestParam?year= ---->> year=""
// http://localhost/ch2/requestParam?year ---->> year=""
System.out.printf("[%s]year=[%s]%n", new Date(), year);
return "yoil";
}
매개변수를 HttpServletRequest를 쓰지 않고 값을 직접 year로 받을 수 있다.
@RequestMapping("/requestParam2")
// public String main2(@RequestParam(name="year", required=false) String year) { // 아래와 동일
public String main2(String year) { //@RequestParam이 생략된 형태
// http://localhost/ch2/requestParam2 ---->> year=null
// http://localhost/ch2/requestParam2?year ---->> year=""
System.out.printf("[%s]year=[%s]%n", new Date(), year);
return "yoil";
}
@RequestParam을 붙이면 이름은 같은데 required=true라는 점이 위와 다르다.
@RequestMapping("/requestParam3")
// public String main3(@RequestParam(name="year", required=true) String year) { // 아래와 동일
public String main3(@RequestParam String year) {
// http://localhost/ch2/requestParam3 ---->> year=null 400 Bad Request. required=true라서
// http://localhost/ch2/requestParam3?year ---->> year=""
System.out.printf("[%s]year=[%s]%n", new Date(), year);
return "yoil";
}
(required=true)로 되어 있어 값을 넣어야 하기 때문에 year에 아무 값도 넣지 않으면 400에러가 난다.
WebDataBinder
요청을 하면서 쿼리스트링으로 데이터를 보냈다. 데이터는 맵-배열로 저장된다.
URL이 문자열이기 때문에 Map<String, String[]>으로 저장된다.
DispatcherServlet이 date 매개변수 타입을 보고 MyDate의 객체를 만든다.
객체의 인스턴스 변수 이름을 보고 Map에서 같은 변수 이름이 있는지 확인하고 찾으면 객체 값을 집어넣는다.
데이터 타입이 달라도 WebDataBinder가 타입변환과 데이터 검증 작업을 해준다.
=> WebDataBinder가 작업 중에 에러가 나면 BindingResult객체에 저장한다.
@ModelAttribute
적용 대상을 Model의 속성으로 자동 추가해주는 애너테이션
MyDate 앞에 @ModelAttribute를 붙이면 date 객체를 모델에 자동 저장해준다.
반환타입 또는 컨트롤러 메서드의 매개변수에 적용 가능하다.
메서드 앞에 붙인다고 보면 된다.
메서드가 자동으로 호출되고 그 결과를 모델에 저장한다.
@ModelAttribute에는 키를 주어야 하는데 생략하면 타입의 첫글자를 소문자로 반환한 것을 키로 사용한다.
@ModelAttribute("yoil") --> 권장
@ModelAttribute MyDate date 로만 작성하면 --> myDate를 키로 사용
컨트롤러 메서드 매개변수가 기본형일 때 @RequestParam이 생략되었다고 생각하면 된다.
참조형일 때 @ModelAttribute가 생략되었다고 생각하면 된다.
@RequestParam
: 요청 파라미터를 연결할 매개변수를 붙이는 애너테이션
요청 파라미터는 http://localhost/requestParam?year에서 year부분을 의미한다.
매번 request.getParameter로 값을 읽어오는게 귀찮으니
HttpServletRequest request 매개변수를 지우고 String year를 작성하면 더 편리하게 값을 처리할 수 있다.
String year를 매개변수로 하면 request.getParamter를 사용하지 않기 때문에
HttpServletRequest가 필요없다.
http://localhost/requestParam?year에서 year가 있으면
WebDataBinder가 String year값으로 대입해준다.
@RequestParam을 써주어야 하지만 위의 코드는 생략했다.
@RequestParam을 매개변수에 작성하지 않으면 required=false가 되어 요청 파라미터를 넣는 것이 필수가 아니게 되고
작성하면 required=true로 적용되어 요청 파라미터를 넣어주지 않으면 에러가 난다.
@RequestParam을 안붙였을 때 매개변수가 int타입인 경우
URL에 요청 파라미터를 넣지 않으면 500번 에러(서버 에러)가 난다.
--> required=false로 필수가 아니기 때문에 year=null이다. null을 int타입으로 바꾸려다가 에러가 난 것이다.
URL에 값을 넣어주지 않아도 400번 에러(클라이언트 에러)가 난다.
--> year=""로 처리되고, 빈문자열을 int타입의 값으로 변환하려다가 에러가 난다.
에러가 나지 않게 하기 위해선 defaultValue를 설정하면 된다.
'패스트캠퍼스 데브캠프 : 남궁성의 백엔드 개발 3기' 카테고리의 다른 글
Spring MVC | redirect와 forward (0) | 2025.03.05 |
---|---|
Spring MVC | @GetMapping, @PostMapping, URL인코딩 (0) | 2025.03.04 |
Spring MVC | @ModelAttribute (0) | 2025.02.28 |
Spring MVC | 서블릿과 JSP (2) (0) | 2025.02.26 |
Spring MVC | 서블릿과 JSP (1) (0) | 2025.02.25 |