Validation API(유효성 체크) 👉 사용자가 입력한 데이터에 대한 유효성 체크
// User Class
import lombok.AllArgsConstructor;
import lombok.Data;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import java.util.Date;
@Data
@AllArgsConstructor
public class User {
private Integer id;
@Size(min=2) // 최소 길이 2개 이상
private String name;
@Past // 미래 데이터를 사용할 수 없다는 제약 조건
private Date joinDate;
}
// UserController Class
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody User user){
User savedUser = service.save(user);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}") //반환 값은 가변 변수 id
.buildAndExpand(savedUser.getId()) //저장된 user 값의 id 값을 지정
.toUri(); //URI로 반환
return ResponseEntity.created(location).build();
//서버로부터 적절한 상태 코드를 보내주는 것이 좋은 api임
}
👉 상태 코드는 400 Bad Request 다만, body에 예외 내용 전달은 X
예외가 발생했을 때 메시지를 출력하기 위해 ExceptionResponse에 예외를 작성한다.
다음과 같이 handleMethodArgumentNotValid 메서드를 재정의 한다.
// CustomizedResponseEntityExceptionHandler Class
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(),
ex.getMessage(), ex.getBindingResult().toString());
return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
}
👉 상태 코드는 400 Bad Request 동일, body에 예외 내용 전달 O
// CustomizedResponseEntityExceptionHandler Class 👉 수정
ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(),
"Validation Failed", ex.getBindingResult().toString());
// User Class 👉 수정
@Size(min=2, message = "Name은 2글자 이상 입력해 주세요.") // 최소 길이 2개 이상
private String name;
👉 Body의 예외 message, details 내용이 수정한 대로 전달된다.
다국어 처리를 위한 Internationalization 구현
다국어 처리 : 하나의 출력값을 여러 가지 언어로 표시 해주는 기능
(제공하고자 하는 언어별로 지역 코드, 언어 설정에 따라 적절하게 표시)
특정 Controller에 한해서가 아니라 Project 전반적으로 적용
@SpringBootApplication
public class RestfulWebServiceApplication {
public static void main(String[] args) {
SpringApplication.run(RestfulWebServiceApplication.class, args);
}
@Bean
public LocaleResolver localeResolver() { // 웹 요청과 관련해서 Locale을 추출하고 이 Locale 객체를 이용해서 알맞은 언어의 메시지를 선택
SessionLocaleResolver localeResolver = new SessionLocaleResolver(); // Session에 Locale 정보를 넣고 이를 통해 다국어를 처리해 주는 역할
localeResolver.setDefaultLocale(Locale.KOREA);
return localeResolver;
}
}
application.yml에 사용할 다국어 파일 등록
Resource에 다국어 파일(properties) 생성
// Controller
@Autowired
private MessageSource messageSource;
@GetMapping(path = "/hello-world-internationalized")
public String helloWorldInternationalized(
@RequestHeader(name = "Accept-Language", required=false) Locale locale) {
return messageSource.getMessage("greeting.message", null, locale);
}
locale 값을 지정하지 않았을 때는 👉 default_locale값인 한국어 리턴
ex) Headers에 KEY(Accept-Language) VALUE(fr) 👉 프랑스어 리턴