gi_dor

Regex를 활용한 입력 유효성 검사 본문

Back_End/SpringBoot

Regex를 활용한 입력 유효성 검사

기돌 2024. 4. 9. 17:30

Regular Expression - 정규 표현식

정규표현식은 특정한 규칙을 가진 문자열의 집합을 사용하기 위해 쓰이는 형식이다

주 사용처는 전화번호 , 주민번호 , 이메일에 특정한 형식 검증
요청한 데이터가 어떤 특정 형태 및 조건을 충족하는지를 확인

회원가입을 예로들면

회원가입을 진행할때 이메일 입력칸에 "a@aver.com" 이라고 입력하고 회원가입을 했다면
사용자는 이메일로 임시 비밀번호를 발급받을수가 없다.

  • ^ : 문자열의 시작
  • $ : 문자열의 종료
  • . : 임의의 한 문자
  • * : 앞 문자가 없거나 무한정 많음
  • + : 앞 문자가 하나 이상
  • ? : 앞 문자가 업거나 하나 존재
  • [,] : 문자의 집합이나 범위, 두 문자 사이는 ~ 기호로 범위 표현
  • {, } : 횟수 또는 범위
  • (, ) : 괄호 안의 문자를 하나의 문자로 인식
  • | : 패턴 안에서 OR 연산을 수행
  • \ : 정규식에서 역슬래시는 확장문자로 취급하고, 역슬래시 다음에 특수문자가 오면 문자로 인식
  • \b : 단어의 경계
  • \B : 단어가 아닌 것에 대한 경계
  • \A : 입력의 시작 부분
  • \G : 이전 매치의 끝
  • \Z : 종결자가 있는 경우 입력의 끝
  • \z : 입력의 끝
  • \s : 공백 문자
  • \S : 공백 문자가 아닌 나머지 문자(^\s와 동일)
  • \w : 알파벳이나 숫자
  • \W : 알파벳이나 숫자가 아닌 문자(^\w와 동일)
  • \d : 숫자 [0-9]와 동일하게 취급
  • \D : 숫자를 제외한 모든 문자(^0-9와 동일)

@Valid 어노테이션를 활용한 검사

스프링부트에서는 Regex (정규 표현식)을 쉽게 사용할 수 있도로 기능을 제공해다
User.vo 클래스에 정규 표현식 조건을 작성해주면,
Controller 에서 @Valid 어노테이션과 함께 유효성 검사를 할 수 있다.

프로젝트에서 사용하게될 회원가입 진행시에 어떻게 백엔드에서 검증 처리를 하는지 다루려고 한다..

@Valid 는 기본적으로 Controller(컨트롤러)에서만 동작하며, 다른 계층(service)에서 사용하기 위해서는
@Validated 어노테이션과 결합해서 사용해야한다

@Valid는 Java 에서 지원해주는 어노테이션
@Validated는 Spring에서 지원해주는 어노테이션이다

입력 파라미터의 유효성 검증은 컨트롤러에서 최대한 처리하고 넘겨주는 것이 좋다.
하지만 개발을 하다보면 불가피하게 다른 곳에서 파라미터를 검증해야 할 수 있는데
.
Spring에서는 이를 위해 AOP 기반으로 메소드의 요청을 가로채서 유효성 검증을 진행해주는 @Validated를 제공한다. @Validated는 JSR 표준 기술이며 Spring 프레임워크에서 제공하는 어노테이션 및 기능입니다.

@Validated@Valid의 기능을 포함하고 있고, 유효성을 검토할 그룹을 지정할 수 있는 추가 기능이 있습니다.

아마 Controller 에서만 사용할 예정이다.


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

    private Long userNO;

    @NotBlank(message = "ID는 필수 입력값 입니다")
    @Pattern(regexp = "^[a-z0-9]{5,20}$", message = "아이디는 영어 소문자와 숫자만 사용하여 5~20자리여야 합니다.")
    private String userId;

    @NotBlank(message= "비밀번호는 필수 입력 값 입니디")
    @Size (min = 8 , message = "비밀번호는 8글자 이상 입니다")
    @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[~!@#$%^&*()+|=])[A-Za-z\\d~!@#$%^&*()+|=]{8,16}$", message = "비밀번호는 8~16자 영문 대 소문자, 숫자, 특수문자를 사용하세요.")
    private String userPassword;

    // @Pattern(regexp = "$expression") 정규식검증
    @NotBlank(message = "이름은 필수 입력 값입니다")
    @Pattern(regexp="^[가-힣]{2,}$", message = "이름은 한글 2글자 이상")
    private String userName;

    @NotBlank(message="이메일은 필수 입력 값입니다")
    @Email(message = "유효한 이메일 형식이 아닙니다")
    private String Email;

    private LocalDateTime userCreatedDate;
    private LocalDateTime userUpdatedDate;

    @NotBlank(message = "전화번호는 필수 입력 값입니다")
    @Pattern(regexp="^\\d{2,3}-\\d{3,4}-\\d{4}$" , message = "유효한 전화번호 형식이 아닙니다")
    private String userTel;

    private String userZipCode;
    private String userAddress;
    private String userAddressDetail;
    private String userDelYn;
}
 @Email(message = "유효한 이메일 형식이 아닙니다")

@Email 어노테이션을 사용하면 별도의 정규식을 작성하지 않고 이메일 주소의 형식을 간단하게 유효성 검사할수 있다
이메일 주소의 형식이 복잡해 정규식으로 정확히 표현하기 어렵기 때문이라고 한다


.

@Pattern(regexp = "^[a-z0-9]{5,20}$", message = "아이디는 영어 소문자와 숫자만 사용하여 5~20자리여야 합니다.")

^: 문자열의 시작 , 패턴의 시작
[a-z0-9]: 소문자 알파벳(a-z) 또는 숫자(0-9) 중 하나를 뜻한다
{5,20}: 이전에 나온 패턴이 5부터 20번 반복될 수 있음을 나타낸다
$: 문자열의 끝 , 패턴의 종료 나타낸다

Ex. asdf1232 ,qwer77


@Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[~!@#$%^&*()+|=])[A-Za-z\\d~!@#$%^&*()+|=]{8,16}$", 
            message = "비밀번호는 8~16자 영문 대 소문자, 숫자, 특수문자를 사용하세요.")

^: 문자열의 시작 , 패턴의 시작
(?=.*[A-Za-z]): 최소한 한 개의 알파벳이 포함
(?=.*\\d): 최소한 한 개의 숫자
(?=.*[!@#$%^&*()+|=]): 최소한 한 개의 특수문자
[A-Za-z\\d
!@#$%^&*()+|=]{8,16}: 소문자, 대문자, 숫자, 특수문자
$: 문자열의 끝 , 패턴의 종료 나타낸다

Ex. Password123! , HelloWorld123$#
"password", "12345678", "abcde"와 같은 문자열은 알맞지 않다.


728x90