희디비
[Spring] 메시지, 검증 (Validation) 본문
💡 메시지
화면에 상품명 : "상품명" 으로 나타내는 뷰가 있습니다.
만약, 기획자가 상품명을 "상품 이름" 으로 바꿔 달라고 한다면 어떻게 해야 할까요?
또한, 이 상품명이 10개 페이지에서 사용 된다면 개발자는 하드코딩 된 상품명을 모두 일일이 고쳐야 합니다.
이럴때 필요한 기능이 한번에 값을 고칠수 있는 메시지 입니다.
🙄 메시지 기능 어떻게 사용하나요?
간단히 스프링에 MessageSource를 빈으로 등록 하면 됩니다.
하지만 스프링 부트는 MessageSource를 자동으로 등록 해주기 때문에 빈 등록을 안해도 사용 가능 합니다.
메시지 경로는 resources 이며,
기본 basename = messages로 설정 됩니다.
추가 등록은 application.properties 에서 위 그림과 같이 추가 해주면 됩니다.
messages.properties
messages에 코드명에 맞는 값을 할당 하고, 뷰에서 그 값을 호출 하면 됩니다.
💡 검증
상황 : 사용자로 부터 Item을 등록합니다.
검증 조건 : 상품명은 필수 , 수량 * 가격은 최대 만원 이상 이여야 합니다.
발전 과정
📝 1. Map < 에러명, 메시지 >
Map 자료형에 검증 조건을 만족 못할시 에러명, 검증 실패 메시지를 담아 주었습니다.
이방식은 문제가 있습니다.
-> item.price에 String 값이 들어올 경우 화이트 에러 페이지로 갑니다.
📝 2. BindingResult
📍 BindingResult 란?
- 검증 실패 했을때 그 정보를 BindingResult 에 담는 역할 + 메시지 기능 활용
( 사용자, spring 둘 다 담을수 있습니다. )
- item.price에 String 값이 들어온다면,
Map = 화이트 에러 페이지로 보냅니다.
BindingResult = spring이 BindingResult에 검증 실패 결과를 담고 컨트롤러를 호출 해줍니다.
BindingResult 사용법
검증 하고자 하는 객체 바로 뒤 파라미터로 꼭 작성 해야 합니다.
BindingResult 에러 종류
⭐️ FieldError
파라미터
- "item" : 객체명
- "itemName" : 객체 필드명
- item.getItemName() : 거부된 값
-> 사용자가 검증에 실패한 값을 뷰에서 다시 보여 주기 위해서 필요 합니다.
- bindingFaliure: 바인딩 실패 여부
- codes: 메시지 기능
-> new String[] {"required.item.itemName", "required.itemName} : 메시지에서 찾을 우선순위
-> 메시지 기능을 사용 하여 오류에 대한 메시지를 보여 줄 수 있습니다.
- arguments : 메시지에 넣을 파라미터 값
- defaultMessage : 메시지에 없을 경우 기본 메시지
⭐️ Object Error
파라미터
필드가 없으므로 필드명, 거부된 값 이외는 Filed Error와 같습니다.
에러 생성 방식이 복잡 하다고 느껴 지는데 파라미터를 더 줄일 수 있는 방법이 있습니다
BindingResult 가 검증 객체 뒤에 있다는 점 ( target ) 으로 error 파라미터를 더 줄인 메서드가 있습니다.
⭐️ rejectValue ( Field Error )
- 생략된 값
- 객체 명 : target 명
- 거부된 값 : target.field를 통해 유추 가능 합니다.
- codes : messagecodesResolver를 통해 우선순위를 알수 있습니다. ( 뒤 설명 )
⭐️ reject ( Object Error )
- 생략된 값
- 객체 명 : target 명
- codes : messagecodesResolver를 통해 우선순위를 알수 있습니다.
💡 messagecodesResolver
📍 messagecodesResolver 란?
- target 객체와 field , 에러 코드를 통해 메시지 에서 우선순위를 선택 합니다.
예시 ) 에러코드 max, 객체 : item, 필드 price
⭐️ rejectValue
1. max.item.price ( 에러코드 + 객체 + 필드 )
2. max.price ( 에러코드 + 필드 )
3. max.java.lang.Integer ( 에러코드 + 타입 )
4. max ( 에러코드 )
순서대로 우선순위를 가지며 메시지에서 찾습니다.
errors.properties
max.item.price = 아이템 가격은 최대 10000원만 입력 됩니다.
max = 최대 10000원만 입력 됩니다.
만약 errors.properties에 max만 있다면,
검증 실패 메시지 = 최대 10000원만 입력 됩니다.
⭐️ reject
1. max.item ( 에러코드 + 객체 )
2. max ( 에러코드 )
🤔 검증 클래스 분리 하기
컨트롤러에 검증 기능을 두게 되면 실제 로직을 알아보기 힘듭니다.
그레서 spring의 Validator를 상속 받아 따로 검증 클래스를 분류 하고 검증기를 도입 할 수 있습니다.
Validator를 분리 하고 컨트롤러에서 검증기를 등록 하였습니다.
컨트롤러에서 @Vaild 어노테이션이 붙는 경우 검증기가 동작 하여
supports 메서드가 Item 객체인지 판단하고 검증 로직을 실행 하게 됩니다.
검증기를 분리 함으로써 컨트롤러의 기능이 뚜렷하게 보이게 되었지만
검증기를 만들고 등록 하는 방식이 개발자를 조금 힘들게 하는 부분이 있습니다.
이부분을 해결 한 것이 빈 검증 ( Bean Validation ) 입니다.
⭐️다음 글에서 뵈요!
해당 정리글은 영한님 mvc2를 보고 요약한 내용입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
'Spring' 카테고리의 다른 글
[Spring] @ExceptionHandler API 에러 핸들링 (3) | 2024.09.06 |
---|---|
[Spring] 필터, 인터셉터 (Interceptor) (0) | 2024.09.05 |
[Spring] 쿠키, 세션 (Cookie, Session) (0) | 2024.09.04 |
[Spring] 빈 검증 ( Bean Validation ) (0) | 2024.09.03 |
[Spring] 싱글톤 컨테이너 (0) | 2024.05.01 |