MemberDTO 코드
package com.example.shoppingmall.member;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
@Getter
@Setter
public class MemberDTO {
@JsonProperty("user_id")
@NotBlank
String userId;
@NotBlank
String pw;
@NotBlank
String name;
@NotBlank
@Email
String email;
@NotBlank
@Pattern(regexp = "^\\d{3}-\\d{3,4}-\\d{4}$")
String contact;
public Member convertToEntity(MemberDTO memberDTO){
return new Member(
memberDTO.getUserId(),
memberDTO.getPw(),
memberDTO.getName(),
memberDTO.getEmail(),
memberDTO.getContact()
);
}
}
MemberController 코드
@PostMapping("/join/api/result") // After
public ApiUtils.ApiResult<String> joinByApiResult(@RequestBody @Valid MemberDTO memberDTO) {
if(isDuplicateId(memberDTO))
return error("아이디 중복", HttpStatus.CONFLICT);
Member requestMember = memberDTO.convertToEntity(memberDTO);
String userId = memberService.join(requestMember);
return success(userId);
}
@Valid 와 @Validated
- @Valid는 자바 표준 스펙이고 @Validated는 스프링에서 제공하는 어노테이션이다.
- @Validated를 통해 그룹 유효성 검사나 Controller가 아닌 다른 계층에서
유효성 검증 가능
- @Valid는 MethodArgumentNotValidException 예외를
@Validated는 ConstraintViolationException 예외를 발생시킨다.
Errors 인터페이스를 활용한 에러처리
@PostMapping("/join/api/result") // After
public ApiUtils.ApiResult<String> joinByApiResult(@RequestBody @Valid MemberDTO memberDTO,Errors errors) {
if (errors.hasErrors()) {
String result = "[유효성 검사 실패]";
Map<String, String> validatorResult = new HashMap<>();
for (FieldError error : errors.getFieldErrors()) {
String validKeyName = error.getField();
validatorResult.put(validKeyName, error.getDefaultMessage());
}
return error(result + validatorResult, HttpStatus.BAD_REQUEST);
}
if(isDuplicateId(memberDTO))
return error("아이디 중복", HttpStatus.CONFLICT);
Member requestMember = memberDTO.convertToEntity(memberDTO);
String userId = memberService.join(requestMember);
return success(userId);
}