Spring MVC - 에러 메시지 커스터마이징, From 데이터 유지하기
에러 메시지 커스터마이징
- JSR-303에서 정의한 메시지 대신, 직접 에러 메시지를 정의하여 출력
- 위반 코드를 이용하여 Propertie에 저장한 데이터를 이용할 수 있다.
이제 Java로 하는 방법과 XML로 하는 방법을 알아보자.
방법 1 - Java
작성한 JSP에서 에러 메시지 출력
▼ DataBean.java
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%--<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>--%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>input_data</h1>
<form action="input_pro" method="post">
data1 : <input type='text' name='data1'/><br/>
<spring:hasBindErrors name="dataBean1">
<c:if test="${errors.hasFieldErrors('data1') }">
${errors.getFieldError('data1').defaultMessage }<br/>
${errors.getFieldError('data1').codes[0] }<br/>
</c:if>
</spring:hasBindErrors>
data2 : <input type='text' name='data2'/><br/>
<spring:hasBindErrors name="dataBean1">
<c:if test="${errors.hasFieldErrors('data2') }">
${errors.getFieldError('data1').defaultMessage }<br/>
${errors.getFieldError('data1').codes[0] }<br/>
</c:if>
</spring:hasBindErrors>
<button type="submit">확인</button>
</form>
</body>
</html>

${errors.getFieldError('data1').defaultMessage }
- JSR-303에 정의된 default Message 출력
${errors.getFieldError('data1').codes[0] }
- 위반된 Code 출력
- codes 배열의 인덱스별 값을 보고 싶으면
Spring MVC - 유효성 검사 (JSR-303) :: 울타리 (tistory.com) 참고
Spring MVC - 유효성 검사 (JSR-303) :: 울타리 (tistory.com)
Spring MVC - 유효성 검사 (JSR-303)
유효성 검사 (JSR-303) 서버에서 사용자 입력에 대해 유효성 검사를 할 수 있다. JavaScript로 처리할 수도 있지만 Spring MVC에서도 유효성을 처리할 수 있다. JSR - 303 라이브러리 사용 Bean에 데이터가 입
jddng.tistory.com
properties 파일을 이용하여 사용자 정의 에러 메시지 출력
위 JSP에서 codes 배열을 이용해 위반 정보를 알 수 있었다. 이 위반 정보를 이용해 각 위반에 따른
사용자 정의 에러 메시지를 출력 할 수 있다.
우선 출력할 에러 메시지를 properties 파일에 작성
▼ error_message.properties (/WEB-INF/properties/)
Size.dataBean1.data1 = data1은 2 ~ 10글자를 입력해야 합니다.
Max.dataBean1.data2 = data2는 100 이하의 정수를 넣어야 합니다.
작성한 properties 파일을 Message로 등록
아래 링크를 참고하길 바란다.
이제 JSP에서 properties 파일에 있는 데이터를 이용할 수 있다.
사용자 정의 에러 메시지 출력
properties 파일에 각 위반에 따른 사용자 정의 에러 메시지를 저장했으므로 위반이 발생하면
위반 코드를 이용해 사용자 정의 에러 메시지 데이터를 가져와 출력할 수 있다.
▼ JSP
<form action="input_pro" method="post">
data1 : <input type='text' name='data1'/><br/>
<spring:hasBindErrors name="dataBean1">
<c:if test="${errors.hasFieldErrors('data1') }">
<spring:message code="${errors.getFieldError('data1').codes[0] }"></spring:message><br/>
</c:if>
</spring:hasBindErrors>
data2 : <input type='text' name='data2'/><br/>
<spring:hasBindErrors name="dataBean1">
<c:if test="${errors.hasFieldErrors('data2') }">
<spring:message code="${errors.getFieldError('data2').codes[0] }"></spring:message><br/>
</c:if>
</spring:hasBindErrors>
<button type="submit">확인</button>
</form>

<spring:message code="${errors.getFieldError('data1').codes[0] }"></spring:message><br/>
- errors.getFieldError('data1').codes[0] -> Size.dataBean1.data1
- Message에서 errors.getFieldError('data1').codes[0]를 key값으로 value값을 가져온다.
- key = Size.dataBean1.data1, value = data1은 2 ~ 10글자를 입력해야 합니다.
위와 같이 개발자가 properties 파일에 해당 오류 코드에 대한 문자열을 저장해 놓고 JSP에서 해당 오류 코드로 Mesaage에서 해당 문자열을 가져올 수 있다.
Form 데이터 유지하기
- 유효성 검증에 통과하지 못해 다시 입력 화면으로 돌아와 기존에 입력했던 내용을 유지해야 할 경우
- 화면으로 전달된 Bean 객체를 input 태그에 값을 주입하면 된다.
Form 커스텀 태그 사용하여 From 데이터를 유지할 수 있다. Form커스텀 태그는 아래 링크 참고하길 바란다.
▼ JSP
<%--
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
--%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form action="input_pro" modelAttribute="dataBean1" acceptCharset="UTF-8">
data 1 : <form:input path="data1" type="text"/><br/>
<form:errors path="data1"/><br/>
data 1 : <form:input path="data2" type="text"/><br/>
<form:errors path="data2"/><br/>
<form:button type="submit">확인</form:button>
</form:form>

만약 오류 페이지가 나온다면 위 JSP 파일에 dataBean1을 전달하지 못해서 그런 경우이니
JSP를 처리하는 Controller에 Mapping된 메서드에 해당 Bean을 주입해주면 된다.
▼ Controller
@GetMapping("/input_data")
public String input_data(DataBean1 dataBean1) {
return "input_data";
}