TIL/Spring

[Spring] Handler Method Parameter

yndev 2022. 4. 15. 01:53

 

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 구현 시 많이 사용한다.