From 2eadb5e526d283de1d3ec952df9786fc93b426e7 Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 Date: Sun, 10 Aug 2025 01:06:32 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EA=B2=80=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 비밀번호는 영문, 숫자, 특수문자를 포함한 8자리 이상 --- .../auth/dto/EmailSignInRequest.java | 2 ++ .../auth/dto/EmailSignUpTokenRequest.java | 2 ++ .../auth/dto/validation/Password.java | 20 +++++++++++++++++++ .../dto/validation/PasswordValidator.java | 17 ++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 src/main/java/com/example/solidconnection/auth/dto/validation/Password.java create mode 100644 src/main/java/com/example/solidconnection/auth/dto/validation/PasswordValidator.java diff --git a/src/main/java/com/example/solidconnection/auth/dto/EmailSignInRequest.java b/src/main/java/com/example/solidconnection/auth/dto/EmailSignInRequest.java index 925fb62cd..7627e1632 100644 --- a/src/main/java/com/example/solidconnection/auth/dto/EmailSignInRequest.java +++ b/src/main/java/com/example/solidconnection/auth/dto/EmailSignInRequest.java @@ -1,5 +1,6 @@ package com.example.solidconnection.auth.dto; +import com.example.solidconnection.auth.dto.validation.Password; import jakarta.validation.constraints.NotBlank; public record EmailSignInRequest( @@ -7,6 +8,7 @@ public record EmailSignInRequest( @NotBlank(message = "이메일을 입력해주세요.") String email, + @Password @NotBlank(message = "비밀번호를 입력해주세요.") String password ) { diff --git a/src/main/java/com/example/solidconnection/auth/dto/EmailSignUpTokenRequest.java b/src/main/java/com/example/solidconnection/auth/dto/EmailSignUpTokenRequest.java index 52e50e5b2..a3e129f4d 100644 --- a/src/main/java/com/example/solidconnection/auth/dto/EmailSignUpTokenRequest.java +++ b/src/main/java/com/example/solidconnection/auth/dto/EmailSignUpTokenRequest.java @@ -1,5 +1,6 @@ package com.example.solidconnection.auth.dto; +import com.example.solidconnection.auth.dto.validation.Password; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; @@ -8,6 +9,7 @@ public record EmailSignUpTokenRequest( @Email(message = "이메일을 입력해주세요.") String email, + @Password @NotBlank(message = "비밀번호를 입력해주세요.") String password ) { diff --git a/src/main/java/com/example/solidconnection/auth/dto/validation/Password.java b/src/main/java/com/example/solidconnection/auth/dto/validation/Password.java new file mode 100644 index 000000000..a896b5724 --- /dev/null +++ b/src/main/java/com/example/solidconnection/auth/dto/validation/Password.java @@ -0,0 +1,20 @@ +package com.example.solidconnection.auth.dto.validation; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD, ElementType.RECORD_COMPONENT}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = PasswordValidator.class) +public @interface Password { + + String message() default "비밀번호는 영문, 숫자, 특수문자를 포함한 8자리 이상이어야 합니다."; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/src/main/java/com/example/solidconnection/auth/dto/validation/PasswordValidator.java b/src/main/java/com/example/solidconnection/auth/dto/validation/PasswordValidator.java new file mode 100644 index 000000000..f2b654a6f --- /dev/null +++ b/src/main/java/com/example/solidconnection/auth/dto/validation/PasswordValidator.java @@ -0,0 +1,17 @@ +package com.example.solidconnection.auth.dto.validation; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + + +public class PasswordValidator implements ConstraintValidator { + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (value == null || value.isBlank()) { + return true; + } + + return value.matches("^(?=.*[A-Za-z])(?=.*\\d)(?=.*[!@#$%^&*()_+\\-={}\\[\\]|:;\"'<>,.?/`~])\\S{8,}$"); + } +} From b11035939f13a2bd3ea102301145b7c227ffe046 Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 Date: Sun, 10 Aug 2025 01:06:43 +0900 Subject: [PATCH 2/4] =?UTF-8?q?test:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EA=B2=80=EC=A6=9D=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/validation/PasswordValidatorTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/test/java/com/example/solidconnection/auth/dto/validation/PasswordValidatorTest.java diff --git a/src/test/java/com/example/solidconnection/auth/dto/validation/PasswordValidatorTest.java b/src/test/java/com/example/solidconnection/auth/dto/validation/PasswordValidatorTest.java new file mode 100644 index 000000000..8beb4c99e --- /dev/null +++ b/src/test/java/com/example/solidconnection/auth/dto/validation/PasswordValidatorTest.java @@ -0,0 +1,42 @@ +package com.example.solidconnection.auth.dto.validation; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("비밀번호 유효성 검사 테스트") +class PasswordValidatorTest { + + private final PasswordValidator validator = new PasswordValidator(); + + @Test + void 정상_패턴이면_true를_반환한다() { + assertThat(validator.isValid("abcd123!", null)).isTrue(); + } + + @Test + void 숫자가_없으면_false를_반환한다() { + assertThat(validator.isValid("abcdefg!", null)).isFalse(); + } + + @Test + void 영문자가_없으면_false를_반환한다() { + assertThat(validator.isValid("1234567!", null)).isFalse(); + } + + @Test + void 특수문자가_없으면_false를_반환한다() { + assertThat(validator.isValid("abcd1234", null)).isFalse(); + } + + @Test + void 공백을_포함하면_false를_반환한다() { + assertThat(validator.isValid("abcd123! ", null)).isFalse(); + } + + @Test + void 길이가_8자_미만이면_false를_반환한다() { + assertThat(validator.isValid("ab1!ab", null)).isFalse(); + } +} From 96a494fcffd16ff2d2b2ae0f466ab127aebf628d Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 Date: Sun, 10 Aug 2025 19:15:52 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - @NotBlank와 @Email을 함께 사용하도록 --- .../example/solidconnection/auth/dto/EmailSignInRequest.java | 2 ++ .../solidconnection/auth/dto/EmailSignUpTokenRequest.java | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/solidconnection/auth/dto/EmailSignInRequest.java b/src/main/java/com/example/solidconnection/auth/dto/EmailSignInRequest.java index 7627e1632..3987bc508 100644 --- a/src/main/java/com/example/solidconnection/auth/dto/EmailSignInRequest.java +++ b/src/main/java/com/example/solidconnection/auth/dto/EmailSignInRequest.java @@ -1,11 +1,13 @@ package com.example.solidconnection.auth.dto; import com.example.solidconnection.auth.dto.validation.Password; +import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; public record EmailSignInRequest( @NotBlank(message = "이메일을 입력해주세요.") + @Email(message = "유효한 이메일 주소를 입력해주세요.") String email, @Password diff --git a/src/main/java/com/example/solidconnection/auth/dto/EmailSignUpTokenRequest.java b/src/main/java/com/example/solidconnection/auth/dto/EmailSignUpTokenRequest.java index a3e129f4d..ffafa222d 100644 --- a/src/main/java/com/example/solidconnection/auth/dto/EmailSignUpTokenRequest.java +++ b/src/main/java/com/example/solidconnection/auth/dto/EmailSignUpTokenRequest.java @@ -6,7 +6,8 @@ public record EmailSignUpTokenRequest( - @Email(message = "이메일을 입력해주세요.") + @NotBlank(message = "이메일을 입력해주세요.") + @Email(message = "유효한 이메일 주소를 입력해주세요.") String email, @Password From ccc659e09eb81bdfd8e94c6c271cd8fe332b5892 Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 Date: Mon, 11 Aug 2025 22:52:01 +0900 Subject: [PATCH 4/4] =?UTF-8?q?style:=20=EA=B0=9C=ED=96=89=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solidconnection/auth/dto/validation/PasswordValidator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/example/solidconnection/auth/dto/validation/PasswordValidator.java b/src/main/java/com/example/solidconnection/auth/dto/validation/PasswordValidator.java index f2b654a6f..77f8da213 100644 --- a/src/main/java/com/example/solidconnection/auth/dto/validation/PasswordValidator.java +++ b/src/main/java/com/example/solidconnection/auth/dto/validation/PasswordValidator.java @@ -3,7 +3,6 @@ import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; - public class PasswordValidator implements ConstraintValidator { @Override