이 내용은 스프링 부트 쇼핑몰 프로젝트 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. 유효성 검증 결과
- 정상적인 경우 (비밀번호 암호화 적용됨)
- 입력한 데이터에 문제가 있는 경우
'Web & Android > 스프링 부트 쇼핑몰 프로젝트 with JPA' 카테고리의 다른 글
[스프링 부트 쇼핑몰 프로젝트 with JPA] 4. 페이지 권한 설정 (0) | 2023.10.15 |
---|---|
[스프링 부트 쇼핑몰 프로젝트 with JPA] 3. 로그인/로그아웃 (0) | 2023.10.15 |
[스프링 부트 쇼핑몰 프로젝트 with JPA] 2-2. 회원가입 페이지 (0) | 2023.10.15 |
[스프링 부트 쇼핑몰 프로젝트 with JPA] 2-1. 회원가입 로직 (0) | 2023.10.15 |
[스프링 부트 쇼핑몰 프로젝트 with JPA] 1-2. 상품 Repository 설계 (0) | 2023.10.15 |