일반적으로 클라이언트로부터 입력되는 데이터에 대한 validation은 프론트엔드에서 먼저 처리됩니다. 하지만 악의적인 의도로 프론트를 거치지 않고 유효성에 대한 검사가 이뤄지지 않은 데이터를 서버에 직접 보내게 된다면 문제가 발생할 수 있는데요. 때문에 서버 역시 들어오는 데이터에 대한 validation 처리가 필요한 것입니다.
1. 정규표현식(Regular Expression)이란?
정규식은 프로젝트 개발에 있어서 빠지지 않고 사용되는 부분으로 "특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어"라고도 표현되는데요. 정규표현식은 이메일, 휴대폰 번호, 주민번호 등의 형식이나 비밀번호 같이 입력값이 정해진 형식에 맞는지 검증해야 할 때 유용하게 사용됩니다.
정규표현식을 사용할 때 이해를 하고 사용하기보다는 그냥 필요한 정규식을 찾아서 복사 붙여 넣기 하여 사용하는 경우가 많은데요.
앞서 이야기한 것처럼 개발에 있어서 빠지지 않고 사용되는 부분이기 때문에 한 번쯤 제대로 이해해두고 사용하면 수정이 필요할 때나 정규식 관련 오류가 발생했을 때 원인을 빠르게 파악하여 수정할 수 있습니다.
이어지는 내용에서는 정규표현식의 문법에 대한 내용과 정규식의 간단한 예시 및 실제로 사용되는 정규표현식에 대해서 알아보겠습니다.
2. 정규표현식 문법
Regular Expression | Description |
^ | 문자열의 시작 |
$ | 문자열의 끝 |
. | 임의의 문자 1개를 의미 |
* | 문자가 0번 이상 반복 |
+ | 문자가 1번 이상 반복 |
? | 문자가 0번 혹은 1번 |
Regular Expression | Description |
[ ] | 문자의 집합 범위를 의미 |
[0-9] | 숫자 0부터 9 |
[a-z] | 알파벳 a부터 z |
[a-zA-Z] | 알파벳 a부터 z + 알파벳 A부터 Z |
[a-zA-Z0-9] | 알파벳 a부터 z + 알파벳 A부터 Z + 숫자 0부터 9 |
[^a-z] | 알파벳 a부터 z가 아닌 것 |
(앞에 ^ 가 붙어있을 경우 not을 의미) |
Regular Expression | Description |
{ } | 문자가 나오는 횟수를 의미 |
{x} | 앞의 문자가 정확히 x번 나옴 |
{x, } | 앞의 문자가 적어도 x번 나옴 |
{x,y} | 앞의 문자가 최소 x번 나오고, 최대 y번 까지 나옴 |
Regular Expression | Description |
( ) | 소괄호 안의 문자를 하나의 문자로 인식(Grouping) |
| | or 조건 |
\ | 확장문자 (*아래 추가 설명 참고) |
Regular Expression | Description |
\b | 단어의 경계 |
\B | 단어가 아닌 것의 경계 |
\s | 공백문자(whitespace) |
\S | 공백문자가 아닌 나머지 문자 (whitespace를 제외한 문자) |
\w | 알파벳이나 숫자, 언더바(_) 기호 |
\W | 알파벳이나 숫자, 언더바(_) 기호를 제외한 문자 |
\d | 숫자 ([0-9]와 동일) |
\D | 숫자를 제외한 모든 문자 |
*/
정규표현식에서 역슬래시(\)는 확장 문자를 의미하는데요.
역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고, 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미합니다.
예를 들어서 알파벳이나 숫자를 나타내는 \w 같은 경우 Java에서 \ 자체를 특수문자로 취급하기 때문에 \\w와 같이 작성해야 합니다.
/*
(해당 부분은 아래 예시에서도 한번 더 언급하겠습니다.)
3. 간단한 예시 및 실제로 사용되는 정규표현식
^[0-9]*$ // 숫자가 0번 이상 반복
=> ^는 문자열의 시작, [0-9]는 숫자, *는 0번 이상 반복, $는 문자열의 끝
^[a-zA-Z]*$ // 영문자가 0번 이상 반복
=> ^는 문자열의 시작, [a-zA-Z]는 영문자, *는 0번 이상 반복, $는 문자열의 끝
^([a-z]+[0-9]*)$ // 영어 소문자가 꼭 포함되어야 하며, 숫자가 있어도 된다.
=> ^는 문자열의 시작, [a-z]는 소문자, +는 1번 이상 반복, [0-9]는 숫자, *는 0번 이상 반복, $는 문자열의 끝
^([a-z]+[0-9]{0,3})$ // 영어 소문자가 꼭 포함되어야 하며, 숫자는 최소 0번에서 최대 3번까지 나올 수 있다.
=> 나머지 동일 + {0,3}는 최소 0번에서 최대 3번 까지 반복
(간단한 예시)
^\w+@\w+\.\w+(\.\w+)?$
// 이메일
^\d{2,3}-\d{3,4}-\d{4}$
// 전화번호 (ex 02-1234-5678)
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$
// 휴대폰번호 (ex 010-1234-5678 | 011-123-4567)
^\d{6}\-[1-4]\d{6}$
// 주민번호
^\d{3}-\d{2}$
// 우편번호 (ex 123-45)
(실제로 사용되는 정규식)
^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$
// 최소 8자리에 숫자, 문자, 특수문자 각 1개 이상 포함
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$
// 최소 8자리에 대문자, 소문자, 숫자 각 1개 이상 포함
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}
// 최소 8자리에 대문자, 소문자, 숫자, 특수문자 각 1개 이상 포함
// ?= 는 전방 탐색 기호로 (?=.*[a-z]) 소문자가 1개 이상 들어갔는지 확인하는 부분
(실제로 사용되는 비밀번호 정규식)
/*
한번 더 언급하자면 자바에서는 역슬래시(\) 자체를 특수문자로 취급하기 때문에 \d, \w로 쓰이는 부분이 java 내부에서는 \\d, \\w 가 되어야 정상적으로 동작합니다.
*/
4. Java 정규표현식 사용 예시
자바에서 정규표현식을 작성하여 확인하기 위해서는 java.util.regex 패키지에 있는 Pattern 클래스 또는 Matcher 클래스를 사용하게 되는데요. Matcher 클래스는 Patten 클래스와 비슷하지만 더 많은 비교 관련 메서드를 제공한다는 특징이 있습니다.
+ requestDto에서 @Pattern 어노테이션을 통한 정규식 확인도 가능합니다.
(내용이 길어져 Pattern, Matcher 클래스에 대해서는 간단한 사용 예시만 첨부해놓았습니다.)
String str = "abcdef9!@#";
if (!Pattern.matches("^[a-zA-Z]*$", str)) {
System.out.println("no match!");
}
(Pattern Class)
Pattern pattern = Pattern.compile("^[a-zA-Z]*$");
String str = "abcd";
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.find()); // true
(Matcher Class)
< 참고 자료 >
'Programming > Java' 카테고리의 다른 글
JPA @OneToOne 일대일 연관 관계 정리 및 LazyLoding 이슈 (2) | 2022.10.02 |
---|---|
Java Enum 활용하기1 - AttributeConverter (1) | 2022.10.01 |
LocalDate 해당 월의 마지막 날짜 구하는 방법 (0) | 2022.09.04 |
Java - BigDecimal 사용하는 이유 (feat.부동소수점의 부정확성) (0) | 2022.08.18 |
Java 위도 경도에 따른 거리 계산(내 주변 반경) (2) | 2022.08.03 |