프로젝트[종료]

12.회원가입 기능 만들기(2)

알렉스 페레이라 2023. 4. 27. 21:14

이전게시글에서는  HTML까지 다 만들었다.

 

이제 가장 중요한 Validation을 적용할 차례이다. 내가 검증할 사항은 다음과 같다.

  • 이미 가입된 아이디로는 가입하지 못한다.
  • 모든 필드는 필수입력이다.
  • Email은 형식에 따라 작성한다.

크게는 이렇게 세가지인데, lombok이 제공하는 Bean Validation을 사용하여 아래와 같이 손 쉽게 검증이 가능하다.

package com.project.domain.signup;

import com.project.domain.user.SexType;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
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.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SignUpForm {
    @NotBlank(message = "아이디는 필수입력 입니다.")
    private String loginId;

    @NotBlank(message = "사용자 이름을 입력해주세요.")
    private String userName;

    @NotBlank
    @Pattern(regexp="^(?=.*[a-zA-Z])(?=.*\\d)(?=.*\\W).{8,20}$", message = "비밀번호는 영어와 숫자로 포함해서 8~20자리 이내로 입력해주세요.")
    private String password;

    @NotBlank
    @Pattern(regexp="^(?=.*[a-zA-Z])(?=.*\\d)(?=.*\\W).{8,20}$", message = "비밀번호는 영어와 숫자로 포함해서 8~20자리 이내로 입력해주세요.")
    private String passwordCheck;

    @Email(message = "유효하지 않은 이메일입니다.")
    @NotBlank(message = "이메일을 입력해주세요.")
    private String email;

    @NotBlank(message = "전화번호를 입력해 주세요.")
    private String phone;

    @NotBlank(message = "주소를 입력해 주세요.")
    private String address;

    @NotNull(message = "성별을 선택해주세요.")
    @Enumerated(value = EnumType.STRING)
    private SexType sex;
}

 

어노테이션에 대한 설명은 다음 블로그를 참조하도록.

https://hyeran-story.tistory.com/81

 

Spring Validation Annotation 총정리

 @Valid를 통해 데이터의 유효성 검사를 수행할 수 있는 javax.validation와 org.hibernate.validation 패키지가 제공하는 Validation Annotation들을 총 정리한 글입니다. 맨 아래에 사용 예시와 테스트 코드가 있

hyeran-story.tistory.com

 

 

이제 Bean Validation에대한 준비는 끝났으니 Controller단에서의 소스를 추가해 보자.

 

1.회원가입에 대한 POST요청을 Mapping한다.

    @PostMapping
    public String addSignUp(@Validated @ModelAttribute SignUpForm signUpForm, BindingResult bindingResult) {
        // Field에대한 에러가 있을시 메세지와 함께 회원가입창으로 보낸다.
        if (bindingResult.hasErrors()) {
            return "/login/signUp";
        }

        //이미 가입된 아이디 일시 메세지와 함께 회원가입창으로 보낸다.
        if (signUpService.findUser(signUpForm.getLoginId())) {
            bindingResult.addError(new FieldError("signUpForm", "loginId", "이미 존재하는 사용자 입니다."));
            return "/login/signUp";
        }

        signUpService.signUp(signUpForm);
        return "redirect:/";
    }

 

사용법

  • Spring Boot는 spring-boot-starter-validation 라이브러리를 추가하면 Bean Validator를 인식하고 Spring에 통합한다.
  • 메소드의 파라미터로 @Validated를 추가하여 Bean Validation을 사용한다.
  • 검증을 원하는 객체 (여기서는 SignUpForm)뒤에 BindingResult파라미터로 해당 객체에 대한 검증 결과를 받는다.

 

이외의 로직은 요구사항에 맞게 정의한다. 나같은 경우에는 아래 글을 참고하여 findBy~메소드를 사용하였다.

https://leonjk3.tistory.com/21

 

10. JpaRepository<T, Id>인터페이스 상속받기

저번에는 MariaDB를 연동하고, @Entity어노테이션을 사용하여 ORM을 처음 사용해봤다. 로그인 기능을 사용하기 위해간단하게 두가지 기능이 필요하다. 회원가입 로그인을하기위한 사용자 조회 이뿐

leonjk3.tistory.com

@Transactional
    public boolean findUser(String loginId) {
        Optional<User> findUser = userRepository.findByLoginId(loginId);
        return findUser.isPresent();
    }
  • loginId로 값을 가져와 이미 사용된 아이디인지 판단하여 참/거짓값을 return한다.

 

2.서버를 기동하여 검증을 확인한다.

성공!!

 

이미 존재하는 사용자에대한 검증도 성공!

 

 

정상적으로 회원가입에 성공한 모습이다.

 

이외에도 e-Mail인증, 주소 API, 비밀번호 확인 Check에대한 Validation을 추가로 진행할 예정이다.