[Spring] Handler Method Parameter
GET 방식의 /first/regist 요청이 들어오면 /first/regist 뷰로 위임한다.
views의 하위 경로를 요청 경로와 동일하게 해주어야 한다.
핸들러 메소드에 파라미터로 특정 몇가지 타입을 선언하게 되면 핸들러 메소드 호출 시 인자로 값을 전달해준다.
1. HttpServletRequest를 매개변수로 선언하여 파라미터로 전달 받은 값 꺼내기
핸들러 메소드 매개변수로 HttpServletResponse도 사용 가능하다.
상위 타입인 ServletRequest, ServletResponse도 사용 가능하며 WebRequest도 사용 가능하다.
messagePrinter.jsp
인코딩 설정이 안 되어 있어서 글씨가 깨져서 나온다
같은 폴더에 EncodingFilter 생성 후 모든 파일들에 적용될 수 있게 @WeabFilter 어노테이션 달아준다.
Filter 클래스 상속받고 메소드 생성해준 뒤 doFilter에 UTF-8적용
2. @RequestParam 으로 값 꺼내기
요청 파라미터를 매핑하여 호출 시 값을 넣어주는 어노테이션으로 @PathVariable처럼 변수 앞에 작성한다.
form의 name 속성 값과 매개변수의 이름이 다른 경우 @RequestParam("name")을 설정하면 된다.
또한 어노테이션은 생략 가능하지만 명시적으로 작성하는 것이 의미 파악에 쉽다.
- 전달하는 form의 name 속성이 일치하는 것이 없는 경우 400 - 잘못 된 요청 에러가 발생하는데
required 속성을 false로 설정하면 해당 name 값이 존재하지 않아도 null로 처리하며 에러가 발생하지 않는다.
(기본 값이 true이기 때문에 설정하지 않으면 에러가 발생함)
- 값이 넘어오지 않게 되면 "" 와 같은 빈 문자열이 넘어오게 되는데, 이 때 parsing 관련 에러가 발생할 수 있다. (400 - 잘못 된 요청)
값이 넘어오지 않는 경우 defaultValue를 이용하면 기본 값을 설정할 수 있다.
파라미터가 여러 개 인 경우 맵으로 한 번에 처리할 수도 있다.
이 때 맵의 키는 form의 name 속성 값이 된다.
3. @ModelAttribute를 이용하는 방법
DTO 같은 모델을 커맨드 객체로 전달 받는다.
@ModelAttribute의 경우 커맨드 객체를 생성하여 매개변수로 전달해 준 뒤 해당 인스턴스를 model에 담는다.
경우에 따라서 폼에서 입력한 값을 다음 화면으로 전달해야 하는 경우가 발생하는데 이 때 유용하게 사용할 수 있다. @ModelAttribute("모델에 담을 key값")을 지정할 수 있으며, 지정하지 않으면 타입의 앞 글자를 소문자로 네이밍한 규칙을 따른다.
해당 어노테이션은 생략이 가능하지만 명시적으로 작성하는 것이 좋다.
4-1. session 이용하기
HttpSession을 매개변수로 선언하면 핸들러 메소드 호출 시 세션 객체를 넣어서 호출한다.
loginResult.jsp
4-2. @SessionAttributes를 이용하여 session에 값 담기
클래스 레벨에 @SessionAttributes 어노테이션 이용하여 세션에 값을 담을 key 값을 설정해두면 Model 영역에 해당 key로 값이 추가되는 경우 session에 자동으로 등록한다.
@SessionAttributes로 등록 된 값은 session의 상태를 관리하는 SessionStatus의 setComplete() 메소드를 호출해야 사용이 만료된다.
현재 컨트롤러 세션에 저장 된 모든 정보를 제거한다. 개별 제거는 불가능하다.
5. @RequestBody를 이용하는 방법
해당 어노테이션은 http 요청 본문 자체를 모델로 변환시켜주는 어노테이션이다.
클릭해보면 쿼리스트링 형태의 문자열이 전송된다.
JSON으로 전달하는 경우 Jackson의 컨버터로 자동 파싱하여 사용할 수 있다.
주로 RestAPI 구현 시 많이 사용한다.