Java - @Valid & @Validated / Error 처리

모모는무지개·2024년 5월 17일

JAVA

목록 보기
9/9

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

  1. @Valid는 자바 표준 스펙이고 @Validated는 스프링에서 제공하는 어노테이션이다.
  2. @Validated를 통해 그룹 유효성 검사나 Controller가 아닌 다른 계층에서
    유효성 검증 가능
  3. @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);
    }
profile
안녕하세요 하하하

0개의 댓글