RestAPI에 유효성 검증하기
-> 유저 생성 시, name 입력값으로 빈 값이 들어오거나 birthDate가 현 시점보다 미래인지 검증
1. pom.xml에 의존성 설치하기
2. User 생성 시, 검증해야 하므로 Controller에 @Valid 붙여주기
-> @Valid 붙이면 바인딩이 수행될 때 객체에 정의된 유효성 검증이 자동으로 수행된다
3. User 객체에 검증 조건 정의해주기
@Size(min=2) : 최소 두 글자여야
@Past : 생일이 항상 과거의 날짜로 설정되게 하게끔
4. 어떤 부분이 잘못되었는지도 알려주기 (단순히 400 뿐만 아니라)
-> Customized ResponseEntityExceptionHandler 클래스에
ResponseEntityExceptionHandler 의 handleMethodArgumentNotValid를 오버라이딩해서 이용하기
-> 이러면 원하는 오류 메시지 내용을 담기보단 쓸데없는 내용들을 많이 담는다.
5. User.java에 내가 전달할 오류 메시지 문구 정의하기
6. 5에서 정의한 메시지 뜨도록 문구 수정해주기
방법 1)
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
ErrorDetails errorDetails=new ErrorDetails(LocalDate.now(),ex.getFieldError().getDefaultMessage(), request.getDescription(false)); //커스텀 예외구조 만들고
return new ResponseEntity(errorDetails, HttpStatus.BAD_REQUEST); // 그 예외를 반환
}
-> ex.getFieldError().getDefaultMessage() : 필드와 관련된 첫 번째 에러를 조회하고, 해당 필드에 정의한 메시지 출력한다
방법 2) 반복문 실행하여 두 에러 메시지 다 출력되게 하기
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatusCode;
import org.springframework.web.bind.MethodArgumentNotValidException;
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
ErrorDetails errorDetails=new ErrorDetails(LocalDate.now(),"Total Errors:" + ex.getErrorCount() + " First Error:" + ex.getFieldError().getDefaultMessage(), request.getDescription(false));
return new ResponseEntity(errorDetails, HttpStatus.BAD_REQUEST);
}
포스트맨 실행결과 message에 내가 원하는 게 잘 뜬다
Rest API 정적 필터링, 동적 필터링 구현하기
Json 응답은 User 빈 구조와 일치한다.
but, Jackson 프레임워크가 반환하는 Rest API응답을 커스터마이징 하고 싶은 경우도 있다!
1. 응답의 필드 이름을 커스터마이징 하는 방법
-> @JsonProperty
-> name대신 user_name, birthDate대신 birth_date라고 Json 응답에 표시됨
2. 선택된 필드만 반환하기 (필터링)
- 정적 필터링
: Rest API에 상관없이 항상 특정 필드가 반환되지 않게 차단, 필터링 해야 하는 경우
ex) 비번
- 동적 필터링
: 같은 Bean이라도 RestAPI에 따라 특정 필드가 보이게/안보이게 반환하고 싶은 경
<정적 필터링>
sol 1) 특정 필드에 @JsonIgnore 붙이기
sol 2) 빈에 @JsonIgnoreProperties("프로퍼티 이름") 붙이기
-> sol 1을 추천한다고 한다
<FilteringController>
<SomeBean>
<동적 필터링>
-> 필터링 방식을 Controller에 정의하기
-> MappingJacksonValue를 사용해 필터를 설정해 직렬화하기
-> 직렬화 로직을 사용하려면 filter 사용하기
마지막으로 Bean에 @JsonFilter("필터이름") 붙여주어 해당 빈에 필터링 작동하게 하기
<과정>
1. 필터 실행하기 위해 MappingJacksonValue 이용하고 MappingJacksonValue 값을 반환
2. 직렬화 로직을 추가하기 위해 filter 정의하기 (어떤 값들만 응답으로 반환할지)
3. filter를 정의하는 FilterProvider 생성하기
4. 준비된 필터를 MappingJacksonValue에 넘겨준다
<빈>
<리스트>
-> mappingJacksonValue.setFilters(filters) : 빈 뿐만 아니라 직렬화 로직까지 넘겨주게 된다.
'백 > spring boot' 카테고리의 다른 글
Spring Boot와 함께 하는 Spring AOP배우기 (0) | 2024.04.10 |
---|---|
Spring Boot와 Spring Framework, Hibernate로 Java RestAPI 생성하기 -3 (159~173강) (0) | 2024.03.29 |
Spring Boot와 Spring Framework, Hibernate로 Java RestAPI 생성하기 -1 (~143강) & 예외처리 (0) | 2024.03.26 |
스프링부트 112강~ (0) | 2024.03.24 |
스프링부트 스터디-7 (91강~) (0) | 2024.03.20 |