🌿 Spring
[Spring Boot/RESTful] Validation API와 Internationalization
nitronium102
2022. 2. 18. 21:55
Validation API
사용자가 입력한 데이터에 대한 유효성 체크 -> @Valid annotation 사용
1. dependency 추가
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.7.Final</version>
</dependency>
2. dto에 제약조건 추가
@Data
@AllArgsConstructor
public class User {
private Integer id;
@Size(min=2, message = "Name은 2글자 이상 입력해주세요.")
private String name;
private String password;
@Past // 과거 날짜만 가능한 제약 조건
private Date joinDate;
}
3. controller에 추가
- JDK에 포함된 API와 hibernate library에 포함된 validation 기능
- @Valid : 사용자 추가할 때 validation 검증
- @RequestBody : 현재 variable이 requestBody 형식으로 들어옴을 알림
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @ResponseBody User user){ ... }
4. Exception handler 추가
handleMethodArgumentNotValid 메서드 재정의
- ex.getMessage()가 중복되고 너무 길기 때문에 "Validation Failed"라는 값으로 대체
- ex.getBindingResult.toString() : @Size(message="{메시지}") 값도 포함
@Override // 메소드 구현이 잘못되는 것을 방지
protected ResponseEntity<Object> handleMethodArgumentNotValid
(MethodArgumentNotValidException ex, // 발생한 exception
HttpHeaders headers, // request header
HttpStatus status,
WebRequest request) { // 요청 request
ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(),
"Validation Failed", ex.getBindingResult().toString());
return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
}
다국어 처리를 위한 Internationalization 구현
다국어 처리 : 하나의 출력 값을 여러 언어로 표시해주는 기능(프로젝트 전반적으로 적용)
1. yml 파일에 설정 추가
spring.messages.basename={사용할 properties 파일의 이름}
#다국어 파일 설정
spring:
messages:
basename: messages # 우리가 사용할 message 파일의 이름
2. Resources에 {yml 파일에서 설정한 이름}.properties 생성
다국어 버전으로 여러 개 생성
// message_properties
# properties : 자바의 리소스 번들
# 특정 key값과 value를 저장해 놓고 사용할 수 있는 용도로 사용됨
greeting.message=안녕하세요
// messages_fr.properties
greeting.message=Bonjour
3. @SpringBootApplication에 localeResolver 생성
@SpringBootApplication에 @Bean을 등록하게 되면 Spring Boot가 초기화될 때, 해당 정보에 해당되는 값이 메모리에 올라가서 다른 클래스가 사용할 수 있게 된다.
@Bean
// @SpringBootApplication에 @Bean을 등록하게 되면 Spring Boot가 초기화될 떄,
// 해당 정보에 해당되는 값이 메모리에 올라가서 다른 클래스가 사용할 수 있게 된다.
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.KOREA); // default : 한국어 처리
return localeResolver;
}
4. Controller에 메시지 주입
- Header로 language 값을 받아서 해당 언어에 맞는 메세지를 출력
- @Autowired : spring framework에 등록되어 있는 bean 중 같은 타입을 가진 bean을 자동으로 주입(annotation을 이용한 의존성 주입)
- "Accept-Language" 값이 설정되지 않았을 때는 자동으로 default값인 한국어로 설정(기본 locale 값)
- "Accept-Language" 가 설정되어 있으면 locale에 해당 값을 저장
@Autowired
private MessageSource messageSource;
@GetMapping(path="/hello-world-internationalized")
public String helloWorldInternationalized(
@RequestHeader(name="Accept-Language", required = false) Locale locale) {
// 첫번째 인자: 설정 파일에서의 key 값
// 두번째 인자: 만약 parameter를 가진 가변변수라면 parameter 지정
// 세번째 인자: RequestHeader를 통해 전달받은 locale
return messageSource.getMessage("greeting.message", null, locale);
}