비밀번호 유효성 검사 : 백엔드, 프론트엔드(js)에서 이중으로 각각 해주기!

 

 

1. 디펜던시 추가

- spring boot ver 2.3 부터 의존성을 따로 추가해줘야한다.

build.gradle

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

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.5.2</version>
</dependency>

 

2. 어노테이션

@Null     // (o):Null 
@NotNull  // (o) : "", " ", (X) : Null 
@NotEmpty  // (o) : " "  (X) : Null, ""
@NotBlank  // (X) : null, "", " "

@Email  // 이메일 형식 검사, "" 가능
@Pattern(regexp = )  // 정규식 검사
@Size(min=, max=)  // 길이 제한

@Max(value = )  
@Min(value = ) 

@Positive  // 양수만
@PositiveOrZero  // 양수와 0만 

@Negative  //  음수만
@NegativeOrZero  // 음수와 0만

 

3. @Valid, @Validated 차이

- @Valid

- @Validated : 그룹 유효성 추가됨

 

https://www.baeldung.com/spring-valid-vs-validated

 

Differences in @Valid and @Validated Annotations in Spring | Baeldung

Explore the key differences between the @Valid and @Validated annotations.

www.baeldung.com

 

4. DTO 

DTO 역할

1)client의 요청 데이터가 dto 클래스로 캡슐화되어 server로 전달 (패스워드 유효성)

2)Controller <-> Service 계층 간 데이터 전달

 

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

@Data
@Getter
@Setter
public class MemberDto {

    @NotBlank(message = "id를 입력하세요.")
    @Size(min = 6, max = 20, message = "id는 최소 6자 , 최대 20자로 생성하세요.")
    private String id;

    @NotBlank(message = "pw를 입력하세요")
    @Pattern(regexp="(?=.*[0-9])(?=.*[a-z])(?=.*\\W)(?=\\S+$).{8,16}",
            message = "8~16 characters consisting of letters(A-Z, a-z), numbers, or special characters.")
    private String pw;

    @Email(message = "이메일 형식에 맞지 않습니다.")
    private String email;

}

 

 

5. controller

import com.myPJ.member.domain.Member;
import com.myPJ.member.dto.MemberDto;
import com.myPJ.member.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.validation.Valid;

@Controller
public class MemberController {

    @Autowired
    MemberService memberService;

    @RequestMapping(value = "/signup")
    public String signUp() {
           return "view/signUp";
       }


    @RequestMapping(value = "/newMember", method = RequestMethod.POST)
    public String newMember(Member member){

        //memberService.test(member);
        memberService.signUp(member);
        return "view/main";
    }

    @PostMapping(value = "signup")
    public String validCheck(@Valid MemberDto memberDto, Errors errors, Model model){
        if(errors.hasErrors()){
        //패스워드 유효성 검사 부적합
            Map<String, String> validatorResult = MemberService.validateHandling(errors);
            for (String key : validatorResult.keySet()) {
                model.addAttribute(key, validatorResult.get(key));
            }

            // 유효성 통과 못한 필드와 메시지를 핸들링

            return "view/singup";
        }
        return "view/main";
    }
}

 

@Valid

- 유효성 체크 어노테이션

 

model.addAttribute("userDto", userDto);​

- 회원가입 실패 시, 입력 정보 유지

 

 

6. Service

 

errors.getFieldErrors() : 유효성 검사 실패 필드 목록 정보
error.getField() : 필드명 
error.getDefaultMessage() : 저장된 메세지 

'JAVA > spring' 카테고리의 다른 글

javax.validation 패키지 | spring-boot-starter-validation  (0) 2022.04.16
lombok(롬복) 설치 및 적용  (0) 2022.03.24
타임리프(Thymeleaf)  (0) 2022.03.23
Spring directory 구조  (0) 2022.03.12
스프링 프로젝트 생성 (이클립스)  (0) 2021.12.24

+ Recent posts