🌿 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);
	}