본문 바로가기

Spring

[Spring/JPA] @DynamicUpdate, Validation 동시 적용 시 Validation 에러 해결

728x90
반응형

문제

  • User update 로직 내 원하는 필드만 업데이트 시도 시, 제약조건 걸린 컬럼의 에러 발생

상황

User Entity Class

  • 클래스 상단에 @DynamicUpdate 어노테이션이 붙여진 상태이다.

    @DynamicUpdate 어노테이션
    : 전체 컬럼이 아닌 바뀐 값만 Update 한다.

[PATCH] /users - Body 값

  • id를 키값으로 갖고, name, password만 수정될 값으로 매핑하여 받았다.

User Service Class - update 로직

  • Service의 update 로직 내에서 정상 업데이트 진행 시(save) Id값을 기준으로 수정 컬럼만 업데이트 할 거라고 예상했다.

Validation faild 에러 발생

  • ConstraintViolationException: Validation faild for classes ~ 에러 발생
  • 엔티티에 제약사항이 걸려있는 Email, Role 이 비어있고, Null이어서 익셉션 에러가 났다.

원인 분석

  • 현재 Entity 에 걸려있는 @NotEmpty, @NotNull 은 Bean Validation 체크 이다. 즉 엔티티 컬럼 제약조건이 아닌 "Bean 유효값 검사" 용도이다.
  • user 객체를 업데이트 시도 시 null,빈 값이 들어갔기 때문에 유효값 체크에서 걸려서 에러가 난 것이다.

해결 방안

  • create, update 별 DTO를 생성한다.
  • Bean 유효값 검사 필요 시 DTO 별 필요 항목에 각각 추가한다.

UserReqCreateDto - 필요 필드 별 유효값 검사, 에러 message 작성
create 로직 - @Valid, BindResult, Error 확인 시 로직 추가

Invalid Create Test

유효하지 않은 객체 형태로 입력함
결과 메시지 출력

  • Create 시 필요한 필드를 제대로 입력하지 않은 경우, @Valid 유효성 검사를 통해 컨트롤러 단에서 판단하여 에러 처리를 진행한다.
  • 성공 시 정상 Create 동작

마무리

개발 진행중에 정리하는 내용이라 완전한 코드는 아니지만 Entity와 DTO 분리의 이점을 한 가지 더 알아간 것 같다.


추가적으로 리팩토링할 부분은

  • User Request Update DTO 생성, 테스트 (예정)
  • 에러 처리 모듈 공통화 (추후 진행)
  • Response 객체 공통화 (추후 진행)

정도가 될 것 같다.

728x90
반응형