πŸ“Œ νšŒμ›κ°€μž…

πŸ” Controller

@PostMapping("/join")
public ResponseEntity<Void> join(@Valid @RequestBody RequestJoin requestJoin){
    boolean check = userService.create(requestJoin);

    return (check) ?
            ResponseEntity.status(HttpStatus.OK).body(null) :
            ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}

UserService의 create ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  결과에 따라 200 λ˜λŠ” 400의 status codeλ₯Ό λ°˜ν™˜

@Valid μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄ μœ νš¨μ„± 검사 처리

πŸ” build.gradle

implementation 'org.springframework.boot:spring-boot-starter-validation'

μ΄μ „μ—λŠ” spring-boot-starter-web μ˜μ‘΄μ„± 내뢀에 validation이 μžˆμ—ˆμ§€λ§Œ,

spring boot 2.3 version μ΄μƒλΆ€ν„°λŠ” μ•„μ˜ˆ λͺ¨λ“ˆλ‘œ λΉ μ Έ validation μ˜μ‘΄μ„±μ„ λ”°λ‘œ μΆ”κ°€ν•΄μ€˜μ•Ό μ‚¬μš©κ°€λŠ₯

πŸ” RequestJoin DTO

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class RequestJoin {

    @NotEmpty(message = "아이디 μž…λ ₯은 ν•„μˆ˜ μž…λ‹ˆλ‹€.")
    @Size(min =  4, max = 12, message = "μ•„μ΄λ””λŠ” μ΅œμ†Œ 4μžμ΄μƒ 12자 μ΄ν•˜μž…λ‹ˆλ‹€.")
    private String username;

    @NotEmpty(message = "λΉ„λ°€λ²ˆν˜Έ μž…λ ₯은 ν•„μˆ˜ μž…λ‹ˆλ‹€.")
    @Size(min =  8, max = 16, message = "λΉ„λ°€λ²ˆν˜ΈλŠ” μ΅œμ†Œ 8μžμ΄μƒ 16자 μ΄ν•˜μž…λ‹ˆλ‹€.")
    private String password;

    @NotEmpty(message = "λ‹‰λ„€μž„ μž…λ ₯은 ν•„μˆ˜ μž…λ‹ˆλ‹€.")
    private String nickname;

    @NotEmpty(message = "μ „ν™”λ²ˆν˜Έ μž…λ ₯은 ν•„μˆ˜ μž…λ‹ˆλ‹€.")
    private String telephone;

    @NotEmpty(message = "이메일 μž…λ ₯은 ν•„μˆ˜ μž…λ‹ˆλ‹€.")
    @Pattern(regexp = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,6}$", message = "이메일 ν˜•μ‹μ— λ§žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
    private String email;

    @NotEmpty(message = "μ£Όμ†Œ μž…λ ₯은 ν•„μˆ˜ μž…λ‹ˆλ‹€.")
    private String address;

    public User toEntity(String password) {

        return User.builder()
                .id(null)
                .username(username)
                .nickname(nickname)
                .password(password)
                .telephone(telephone)
                .email(email)
                .address(address)
                .authority(Authority.USER)
                .build();
    }
}

ν”„λ‘ νŠΈμ—”λ“œμ—μ„œλ„ μœ νš¨μ„± 검사λ₯Ό ν•˜μ§€λ§Œ 그건 μ‚¬μš©μžμ˜ νŽΈμ˜μ„± 츑면이고 잘λͺ»λœ 데이터가 DB에 λ°˜μ˜λ˜μ§€ μ•Šλ„λ‘ λ°±μ—”λ“œμ—μ„œλ„ μœ νš¨μ„±κ²€μ‚¬ μž‘μ—…μ€ ν•„μˆ˜μ μœΌλ‘œ ν•΄μ€˜μ•Όν•¨

πŸ” Service

@Override
public boolean create(RequestJoin requestJoin) {
    // username 쀑볡 확인
    boolean check_user = checkUsername(requestJoin.getUsername());
    boolean check_telephone = checkTelephone(requestJoin.getTelephone());
    boolean check_email = checkEmail(requestJoin.getEmail());

    if (check_user || check_telephone || check_email) {
        return false;
    }

    User user = requestJoin.toEntity(bCryptPasswordEncoder.encode(requestJoin.getPassword()));

    User created_user = userRepository.save(user);

    return !created_user.getUsername().isEmpty();
}

ν˜„μž¬ DB에 ν•΄λ‹Ή 아이디, μ „ν™”λ²ˆν˜Έ, 이메일이 쑴재 ν•˜λŠ”μ§€ 쀑볡검사

μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ RequestJoin Dtoλ₯Ό Entity둜 λ³€ν™˜, λΉ„λ°€λ²ˆν˜ΈλŠ” BCryptPasswordEncoderλ₯Ό μ‚¬μš©ν•΄

μ•”ν˜Έν™”

Spring Data Jpa의 save ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ˜μ†ν™” μ‹œμΌœ DB에 μ €μž₯ν•˜κ³  trueλ₯Ό λ°˜ν™˜

@Override
public boolean checkUsername(String username) {
    return userRepository.existsByUsername(username);
}

@Override
public boolean checkTelephone(String telephone) {
    return userRepository.existsByTelephone(telephone);
}

@Override
public boolean checkEmail(String email) {
    return userRepository.existsByEmail(email);
}

μ€‘λ³΅κ²€μ‚¬ν•˜λŠ”λ° 쓰인 checkUsername , checkTelephone, checkEmailν•¨μˆ˜λŠ” Spring Data Jpa의 λ¬Έλ²•μœΌλ‘œ μž‘μ„±ν•œ existsByUsername, existsByTelephone, existsByEmail ν•¨μˆ˜λ₯Ό 각각 μ‚¬μš©