1. @RequestParam
1-1. 매개 변수 String
@RequestParam은 요청한 parameter와 매개변수를 연결하는 애너테이션이다.
main2 메서드에 매개변수 String year만 썼는데 @RequestParam(name="year", required=false)이 생략됐다. name="year"는 parameter이고 required=false는 필수여부이다. false이므로 필수가 아니다. url에 parameter, parameter 값을 쓰지 않아도 된다.
요청에 parameter이 없다면 null이 들어가고 parameter는 있지만 값이 없다면 빈 문자열("")이 들어간다.
@RequestParam String year는 required=true와 같다. 요청에 parameter가 없다면 null이 들어가고 "400 Bad Request"가 발생한다. 400번은 클라이언트 에러로 parameter를 필수입력으로 지정했는데 사용자가 입력하지 않아 발생한다. parameter는 있지만 값이 없다면 빈 문자열("")이 값이 있는 것으로 판단해서 에러가 아니다.
1-2. 매개 변수 int
required=false는 parameter에 null이 들어가고 null을 int형으로 형변환 하지 못해 500 에러가 발생한다. parameter가 있을 때 빈 문자열은 int형으로 바꾸지 못하므로 400 에러, 클라이언트 에러이다. 값을 주었는데 잘 못준 경우는 클라이언트 에러이다.
필수 입력이 아닐경우 String일 때와 int일 때가 다르다. int에서 required=false일 때 defaultValue="1"로 기본 값을 지정해야 한다. 아무 값을 쓰지 않거나 year만 쓸 경우 문자열 "1"이 들어간다.
required=true, 입력 값이 필수일 때 400 에러로 클라이언트 에러이다. year를 적어도 빈 문자열을 형변환을 하지 못해 400 에러가 발생한다.
RequestParamTest 클래스를 만든다.
한글 깨짐을 수정하자.
<!-- 한글 변환 필터 시작 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 한글 변환 필터 끝 -->
위 코드를 WEB-INF에 있는 web.xml 파일에 복사해서 붙여넣는다.
한글 안 깨진다. 대체로 한글 깨짐은 web.xml파일에 필터 추가하면 고쳐진다.
url에 requestParam을 입력할 경우 required=false는 year 값이 필수가 아니다.
year값을 살펴보기 위해 yoil.jsp를 위와 같이 수정한다. year=null 임을 알 수 있다.
year만 입력할 경우 빈 문자열 ""이 들어간다.
url에 requestParam3을 입력할 경우 required=true이므로 400 에러가 발생한다.
year만 입력할 경우 빈 문자열이므로 에러가 발생하지는 않는다.
url에 requestParam8을 입력할 경우 required=false이므로 클라이언트의 잘못이 아니라 500 에러이다.
requestParam에 defaultValue="2021"을 입력할 경우 사용자는 아무 값도 입력하지 않아 null이 반환되고, controller는 "2021"을 받아 console에는 2021이 출력된다.
required=false일 때 year을 입력하지 않았을 경우
1. defaultValue 없음
null이 int year에 들어갈 경우 형변환이 되지 않기 때문에 서버에러인 500 에러이다.
2. defaultValue = "2021"
null 대신에 2021이 들어가서 페이지가 출력된다. 하지만 View에는 입력값이 없으므로 화면에는 null이 출력된다.
왼쪽처럼 예외 처리를 만들줄 경우 year 값이 없을 경우 400에러가 뜨지 않고 오른쪽과 같이 yoilError.jsp를 출력하게 만들 수 있다.
예외 처리를 실행했지만 console 결과에는 출력되지 않는다. 이 설정을 바꿀 수 있다.
src/main/resources에 log4j.xml에 logging 설정을 할 수 있는 코드가 있다. 패키지 별로 logging을 설정 할 수 있고 "org.springframework.web"의 기본값인 info를 trace로 바꾸면 log 출력을 가장 자세히 볼 수 있다. console에 보면 int 타입을 바꾸는데 실패했다고 출력되고 입력된 input string은 빈 문자열인 "" 이다. 빈 문자열을 int 타입으로 바꾸는데 실패했다.
위와 같이 필수 입력일 때는 예외처리로 사용자가 값을 제대로 입력하도록 유도해야 한다. 필수 입력이 아닐 경우는 defaultValue 값을 지정해서 500 에러가 발생하지 않도록 한다.
yoilTellerMVC의 매개변수에 @RequestParam(required=true)로 필수 입력을 지정한다.
값이 없을 경우 400에러가 발생한다.
입력 값이 필수 일 때는 위와 같이 예외처리를 만든다.
입력 값이 없을 때 yoilError.jsp가 예외 처리로 실행됐다.
날짜를 개별로 받으면 갯수가 많아질 경우 코드가 복잡해 진다. MyDate 클래스를 따로 만든다.
private로 변수를 설정하고, getter setter toString을 자동으로 생성한다.
위와 같이 MyDate를 생성해서 getYoil, isValid를 수정한다.
값 찍었을 때 안나온다. 값이 출력되지 않았으므로 jsp 파일이 문제이다.
yoil.jsp파일의 변수를 수정하면 잘 출력된다.
'스프링의 정석 > Ch. 02 Spring MVC' 카테고리의 다른 글
19. 회원가입 화면 작성하기 (0) | 2023.07.22 |
---|---|
18. @RequestMapping (0) | 2023.07.20 |
16. 서블릿과 JSP (4) (0) | 2023.07.19 |
15. 서블릿과 JSP (3) (0) | 2023.07.15 |
14. 서블릿과 JSP (2) (0) | 2023.07.10 |