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등록하기
👉 이때 똑같은 내용을 두번 검증하므로 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를 검색, 처리 가능 컨트롤러를 찾아 요청 처리)
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 이런식으로 지역마다 메세지 추가 생성 가능.
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>
'🔥 Vamos > Spring' 카테고리의 다른 글
0109 | 스프링의 정석 :: 3-1 (Property & config.txt활용) (0) | 2023.01.10 |
---|---|
0108 | 스프링의 정석 :: 2-32~2-35 (인텔리제이 시작 & 에러와의 긴 사투) (0) | 2023.01.08 |
0106 | 스프링의 정석 :: 2-31 (local Validator 실습) (0) | 2023.01.07 |
0104 | 스프링의 정석 :: 2-31 (Validator) (0) | 2023.01.04 |
1229 | 스프링의 정석 :: 2-30 (데이터 변환기능) (0) | 2022.12.29 |