0106 | 스프링의 정석 :: 2-31 (local Validator 실습)

0104 | 스프링의 정석 :: 2-31 (Validator) 1229 | 스프링의 정석 :: 2-30 (데이터 변환기능) 1228 | 스프링의 정석 :: 2-30 (데이터 변환기능) 데이터의 변환과 검증(1) 1. WebDataBinder : 브라우저를 통해서 요청 받

ala-nueva.tistory.com

 

Global Validator 등록하기

 

1. localValidator였던 userValidator.java를 복사하여 GlobalValidator로 변경해주기

public class GlobalValidator implements Validator {
	@Override
	public boolean supports(Class<?> clazz) {
		return User.class.isAssignableFrom(clazz); // clazz가 User 또는 그 자손인지 확인
	}

	@Override
	public void validate(Object target, Errors errors) { 
		System.out.println("GlobalValidator.validate() is called");

 

2. 로컬과 글로벌이 동시에 적용될 수 있도록 컨트롤러에 addValidators 작성

//binder.setValidator(new UserValidator()); // userValidator를 webDataBinder의 local Validator로 등록 (local validator는 컨트롤러 내에서만 사용 가능)
binder.addValidators(new UserValidator()); // addValidators로 바꾸어서 global에 UserValidator를 추가로 등록

 

 

3. servelt-context.xml에 globalValidator등록하기

 

등록 전에는 userdata하나만 반환

 

servlet-context.xml 내에 globalValidator를 작성하고 annotaion태그 속성에 등록

 

등록 후에는 두개 다 반환됨을 볼 수 있다

👉 이때 똑같은 내용을 두번 검증하므로 errors개수에는 2배로 잡힌다.

 

 


* 여기서 servlet-context.xml 관련 정리

찾으려고 할때 위치 생각안나면 당황스러움

 

✔.xml 파일 개념정리

webapp
	ㄴWEB-INF
    		ㄴSpring
        		ㄴappServlet
            			ㄴservelt-context.xml : 서블릿 영역 설정
          		ㄴroot-context.xml : 프로젝트의 어플리케이션 영역 설정 //모든 서블릿들이 공유하는 자원
        	ㄴviews
        		ㄴweb.xml : 서버 시작 지점

target
	ㄴpom.xml : 메이븐 관리

 

✔구동 순서 정리

1. web.xml : 클라이언트의 요청을 받아들인다

2. web.xml > dispatcherServlet (클라이언트 요청 핸들링) > servlet-context.xml (HandlerMapping Controller를 검색, 처리 가능 컨트롤러를 찾아 요청 처리)

 

이때 dispatcherServlet의 작동원리는 위와 같다

request from Client > dispatcherServlet이 Handler에게 요청 > Handler는 해당하는 Controller에게 요청 > Controller는 view 이름 반환 > DispatcherServlet이 viewResolver에게 요청 > viewResolver가 해당하는 jsp 반환 > client에게 반환

 

👇참고한 블로그: 순서 외에도 로그분석이 잘 되어있어서  도움이 되었다

 

spring xml파일 설정

mvc,servlet의존성 추가를 하고 진행..http://weejw.tistory.com/113 나는 spring을 처음 접하면서 제일 어려웠던게 대체 페이지가 어떤 경로로 열리는것인가? 였는데 jsp할때는 그냥 뚝딱 넣어두면 그이름으

weejw.tistory.com

 


 

8. MessageSource

: 다양한 리소스(파일, 배열)에서 메세지를 읽어오기 위한 인터페이스

public interface MessageSource{
	//  args = 메세지에 사용될 값. new String[]{"5","11"} > 아이디의 길이는 5~11사이어야 합니다.로 대입됨
	String getMessage(String code, Object[] args, String deefaultMessage, Locale locale); // locale은 지역
    String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;
    String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
}

 

 

: 프로퍼티 파일을 메세지 소스로 하는 ResourceBundleMessageSource를 등록 (servlet-context.xml 에 path를 bean으로 등록)

 

 

: 위 소스 중 에러메세지 위치 안에 에러메세지 프로퍼티를 등록해야 함 (/src/main/resources/error_message.properties)

[error_message.properties] // error_message 이름이 다 같아야 함. & 하기 세줄은 메세지코드 = 실제 나타나는 메세지. (맵 형태로 되어있음 K=V)

public interface Errors{
	void reject(String errorCode);
    void rejectValue(String field, String errorCode); // 여기서 field는 id, errorCode는 required
} // 에러코드의 required는 메세지코드의 required와 일치해야 연결될 수 있다. (찾을때는 객체이름, 필드이름, 타입까지 조합해서 서치함)

[error_message.properties]
required=필수항목입니다.
required.user.pwd = 사용자 비밀번호는 필수 항목 입니다.
invalidLength.id=아이디의 길이는 {1}~{2}사이어야 합니다.

error_message.properties > default 값. 

error_message_kr.properties

error_message_en.properties 이런식으로 지역마다 메세지 추가 생성 가능. 

 

 

메세지는 UTF-8로 작성되어야 하기때문에 인코딩 업데이트를 해준다. UPDATE-APPLY AND CLOSE 클릭
쌤은 resources에서 우클릭, new-untitled Text FIle이 있는데 난 없어서 당황. others에서 검색하니 나왔다.
에러 메세지 입력 후 저장
인코딩이 제대로 안돼서 뜨는 거라기에, 다시 재설정해도 안돼서 sts껐다 다시켜서 save as utf-8로 했더니 졸지에 모든 소스의 인코딩이 깨졌다....하............

 

 

9. 검증 메세지 출력

: 지금까지는 검증결과가 콘솔에 출력됐으나, 이제 jsp 뷰에 출력되도록 하는 작업.

: 스프링이 제공하는 커스텀 태그 라이브러리 사용

// 스프링이 제공하는 태그 라이브러리. 접두사가 form이고 jsp에 넣어줘야 함
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

//<form> 대신 태그라이브러리의 접두사 <form:form>사용
<form:form modelAttribute="user"> // user에는 검증할 객체가 들어감

// 이렇게 변경됨
<form id="user" action="/ch2/register/add" method="post"> // RegisterController의 save()맵핑을 @PostMapping("/add")로 변경

// <form:errors>로 에러를 출력. path에 에러 발생 필드를 지정. (*은 모든 필드의 에러)
<form:errors path="id" cssClass="msg"/>

// 이렇게 변경됨
<span id="id.errors" class="msg">필수 입력 항목입니다.</span>

 

+ Recent posts