만약, 사용자가 회원가입 페이지에서 회원가입을 진행한다면 입력한 데이터 값이 서버로 전송되기 전에 특정 규칙에 맞게 입력되었는지, 아이디가 이미 존재하는 지 등을 확인하는 검증 단계가 반드시 필요할 것이다. @Valid를 이용해서 유효성 검사와 아이디 중복검사를 확인하는 검증 단계를 구현해보려 한다. 1. build.gradle
이전에는 spring-boot-starter-web 의존성 내부에 validation이 있었지만, spring boot 2.3 version 이상부터는 아예 모듈로 빠져 validation 의존성을 따로 추가해줘야 사용할 수 있다. 2. UserDto
유효성 검사에 필요한 Request 객체에 Validation 어노테이션을 사용했다. Validation 어노테이션의 자세한 설명은 ( 링크 )를 참고하자. 3. Controller
컨트롤러에서 Request 객체 앞에 @Valid 어노테이션을 사용하고, Errors를 통해 유효성 검사 적합 여부를 확인한다. ※ 이때 Errors는 반드시 Request 객체 바로 뒤에 위치해야 한다. (두 개의 객체에 validation 검사를 한다면, 각각 객체 뒤에 Errors를 받도록 한다.) errors.hasErrors() 메서드로 유효성 검사에 실패한 필드가 있는지 확인하고, userDto를 모델에 담아줘서 회원가입 실패 시, 회원가입 페이지에서 입력했던 정보들을 그대로 유지하기 위해 입력받았던 데이터를 그대로 할당해준다. 유효성 검사에 실패한 필드가 있다면, Service 계층으로 Errors 객체를 전달해 비즈니스 로직을 구현하고 모델에 담는다. 4. Service
유효성 검사에 실패한 필드들은 Map 자료구조를 통해 키값과 에러 메시지를 응답한다. Key : valid_{dto 필드명} Message : dto에서 작성한 message 값 유효성 검사에 실패한 필드 목록을 받아 미리 정의된 메시지를 가져와 Map에 넣어준다. 5. Mustache
Service 계층에서 에러 객체의 Key 이름을 valid_%s로 설정해놨기 때문에 {{valid_필드명}}으로 작성한다. 회원가입시 아이디 중복체크Validation 어노테이션으로 대부분의 유효성 검사 처리는 가능하지만, 중복체크 같은 경우는 validation 어노테이션으로 해결이 불가능했다. 그래서 필자는 다음과 같이 만들었다. 1. Repository
Spring Data Jpa에선 해당 데이터가 DB에 존재하는지 확인하기 위해 exists를 사용한다. 해당 데이터가 존재할 경우 true, 존재하지 않을 경우 false가 리턴된다. 2. Service
만약 데이터가 존재한다면 IllegalStateException이 일어나도록 했다. 3. Controller
임시 데이터 동일한 아이디(username)로 회원가입 진행시 다음과 같이 500 에러와 함께 메시지가 전달된다. 이 외에 닉네임과 이메일 또한 같은 결과를 가진다. 이렇게 Service 레이어에서 중복 검사를 구현했지만, 사용자 입장에서 이런 상황을 맞이한다면 좋지못한 UX가 될 것이다. 중복 여부를 회원가입창에서 보여줄 방법은 없을까 고민해봤지만, 이렇다 할 방법을 아직 찾지 못했다. 방법을 찾는다면 수정하도록 할 것이다. 해결 >> ( 포스트 보러가기 ) |