본문 바로가기
Spring/Spring MVC 5

에러 메시지 커스터마이징

코동이 2020. 5. 27.

유효성 검사를 통해 오류를 검출할 때 그대로 출력하면 JSR-303 에러이다.(우리가 이전 시간에 했던 것)

기본 메세지말고 우리가 만든 메세지를 출력할 수는 없을까?

 

codes[0]을 통해 [에러종류.빈이름.프로퍼티이름]를 확인할 수 있었다.

 

<ServletAppContext.java>
	@Bean
	public ReloadableResourceBundleMessageSource messageSource() {
		ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
		res.setBasename("/WEB-INF/properties/error_message");
		return res;
	}

메세지를 나타내기 위해서는 당연하게도 properties 파일을 인식시키기 위해 ReloadableResourceBundleMessageSource를 @Bean으로 주입해야 한다.

 

 

우리가 Properties 파일에 위의 양식의 이름으로 메세지를 등록하면 된다. 다국어처리도 가능하다.

<error_message.properties>
Size.dataBean1.data1 = data1은 2~10글자여야 합니다.
Max.dataBean1.data2 = data2는 100 이하여야 합니다.

 

유효성 검증에 통과하지 못해 다시 입력화면으로 돌아갈 때, 기존에 입력했던 내용을 유지해야 한다.

이때 입력화면에 전달된 Bean객체에 input태그에 값을 주입하면 된다.

<input_data.jsp>

<%@ taglib prefix="form" ....>

<form:form action="input_pro" method="post" modelAttribute="dataBean1">
	data1: <form:input type="text" path="data1" />
    		<form:errors path="data1" />
    data2: <form:input type="text" path="data2" />
    		<form:erros path="data2" />
    <form:button type="submit">확인</form:button>
</form:form>


===============================================================

<%@ taglib prefix="spring"....>
<%@ taglib prefix="c" ....>

<form action="input_pro" method="post" modelAttribute="dataBean1">
		data1 : <input type="text" name="data1"/>
		<spring:hasBindErrors name="dataBean1">
		<c:if test="${errors.hasFieldErrors('data1') }">
			<spring:message code="${errors.getFieldError('data1').codes[0]}" />
		</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]}" />
			${errors.getFieldError('data2').defaultMessage }<br/>
		</c:if>
		</spring:hasBindErrors>
		<button type="submit">확인</button>
</form>

<복잡환 과정>

jsp의 경우, error가 난다면 error에 대한 정보를 출력하고 싶다. taglib중에 cspring을 이용하면 길다.

spring에서 hasBindErros를 사용하여 if문으로 검사 뒤, message로 출력한다.

 

<간편한 과정>

이것을 쉽게 할 수 있는 것은 taglib중에 form:errors을 이용하는 것이다. form:errors path="data1"만 사용하면 해당 값이 자동으로 아래 정의한 모든 과정을 수행하게 된다.

 

 

	<TestController.java>
    
	@GetMapping("/input_data")
	public String input_data(DataBean1 dataBean1) {
		return "input_data";
	}
    
	@PostMapping("/input_pro")
	public String input_data(@Valid DataBean1 dataBean1, BindingResult result) {
		if(result.hasErrors()) {
			return "input_data";
		}
		return "input_success";
	}

1. ("/input_data")

  만약, input_data를 처음에 로그인 한다면, default 값이 정해져 있지 않으므로 modelAttribute의 dataBean1은 null이다. 따라서 오류가 나기 때문에 Controller의 매개변수에 Databean1을 넣는다. 그래야 자동으로 request에 DataBean1의 내용이 저장되고 jsp에서 modelAttribute로 출력이 가능하다.

 

@Valid가 없으므로 유효성 검사를 위한 것이 아닌, 주입받은 Bean을 input_data.jsp에 표시하기 위함이다.

 

2. ("/input_pro")

파라미터에서 주입받은 DataBean1 객체 dataBean1은 request에 저장되므로 자연스럽게 input_data와 input_success에 모두 사용 가능하다. (생략되었지만 @ModelAttribute를 자동으로 주입받고 또한 requst에 저장된다는 의미)

 

(*보통 사용자 입장에서는 submit전에 해당 영역에 값이 잘 들어갔는지 바로바로 체크해 주는게 더 편하지 않을까?)

 

(properties + form custom태그 라이브러리 + message 등록)

반응형

'Spring > Spring MVC 5' 카테고리의 다른 글

Validator 커스터마이징  (0) 2020.05.27
JSR-303 / JSR-383  (0) 2020.05.27
유효성 검사  (0) 2020.05.27
Properties / Message  (0) 2020.05.27
RequestScope 빈 주입  (0) 2020.05.26