본문 바로가기

백/spring boot

Spring Boot와 Spring Framework, Hibernate로 Java RestAPI 생성하기 -2 (144~160강)

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) : 빈 뿐만 아니라 직렬화 로직까지 넘겨주게 된다.