Jin's Dev Story

[스프링 부트 쇼핑몰 프로젝트 with JPA] 2-3. 회원가입 검증 본문

Web & Android/스프링 부트 쇼핑몰 프로젝트 with JPA

[스프링 부트 쇼핑몰 프로젝트 with JPA] 2-3. 회원가입 검증

woojin._. 2023. 10. 15. 10:13
이 내용은 스프링 부트 쇼핑몰 프로젝트 with JPA 책을 학습한 내용입니다.

 

Validation 참고

1. 회원가입 검증

// gradle 추가
implementation 'org.springframework.boot:spring-boot-starter-validation:3.0.1'

회원가입 기능 구현

  • 유효한 값인지 판단하는 소스가 여러 군데 흩어지면 관리하기가 힘듦
  • → 자바 빈 벨리데이션을 이용하면 객체의 값을 효율적 검증 가능

2. validation 어노테이션

3. 회원가입 DTO 유효성 검증

package kr.spring.member.dto;
// 회원가입 화면으로부터 넘어오는 가입정보를 담을 Dto
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.validator.constraints.Length;

@Getter
@Setter
@ToString
public class MemberFormDto {

    @NotBlank(message = "이름은 필수 항목입니다.")
    private String name;

    @NotEmpty(message = "이메일은 필수 항목입니다.")
    @Email(message = "이메일 형식으로 입력하세요.")
    private String email;

    @NotEmpty(message = "비밀번호는 필수 항목입니다.")
    @Length(min = 4, max = 12, message = "최소 4자, 최대 12자를 입력하세요.")
    private String password;

    @NotEmpty(message = "주소는 필수 항목입니다.")
    private String address;

}

4. 유효성 검증 결과에 따른 Controller

  • 검증하려는 객체 앞에 @Value 어노테이션 지정
  • 검증 결과를 받을 BindingResult 매개변수 추가
  • 입력한 회원가입 데이터에 문제가 있으면 다시 회원가입 페이지로 돌아감
  • 중복된 회원가입이면 지정된 예외가 발생하고 해당 에러 메시지를 다시 회원가입 페이지로 넘김
  • 문제가 없으면 메인페이지로 redirect
package kr.spring.member.controller;

import jakarta.validation.Valid;
import kr.spring.member.dto.MemberFormDto;
import kr.spring.member.entity.Member;
import kr.spring.member.service.MemberService;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@Log4j2
@RequestMapping("/member")
public class MemberController {

    @Autowired
    MemberService memberService;

    @Autowired
    PasswordEncoder passwordEncoder;

    @GetMapping("/new")
    public String memberForm(Model model) {
        model.addAttribute("memberFormDto", new MemberFormDto());
        return "member/memberForm";
    }

    @PostMapping("/new")
    public String memberForm(@Valid MemberFormDto memberFormDto, // @Valid 자동으로 체크해주는 어노테이션
                             BindingResult bindingResult, Model model) {  // 에러에 대한 결과를 받아옴
        // annotation에서 에러가 있으면 다시 memberform으로 돌아간다 -> 바인딩 에러 시 처리
        if(bindingResult.hasErrors()) {  // bindingResult가 하나라도 에러인 경우
            return "member/memberForm";
        }

        try { //회원가입을 처리하는 구문
            Member member = Member.createMember(memberFormDto, passwordEncoder);
            memberService.saveMember(member);
        } catch (IllegalStateException e) { //회원가입 처리 시 문제가 생기면 에러메세지 띄우기
            model.addAttribute("errerMessage", e.getMessage());
            //문제가 있으면 회원가입으로 돌아감
            return "member/memberForm";
        }
        return "redirect:/";
    }
}

5. 유효성 검증 결과

  • 정상적인 경우 (비밀번호 암호화 적용됨)

  • 입력한 데이터에 문제가 있는 경우