From ddf8c9b43271a69e3c74d2210a0e9eff93b707a6 Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Tue, 12 Aug 2025 14:07:46 +0900 Subject: [PATCH 01/15] =?UTF-8?q?feat:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=B3=80=EA=B2=BD=20DTO=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../siteuser/dto/PasswordUpdateRequest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java diff --git a/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java b/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java new file mode 100644 index 000000000..e59f99ffb --- /dev/null +++ b/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java @@ -0,0 +1,17 @@ +package com.example.solidconnection.siteuser.dto; + +import jakarta.validation.constraints.NotBlank; + +public record PasswordUpdateRequest( + @NotBlank(message = "현재 비밀번호를 입력해주세요.") + String currentPassword, + + @NotBlank(message = "새 비밀번호를 입력해주세요.") + // @Password // todo: #435 merge 후 + String newPassword, + + @NotBlank(message = "새 비밀번호를 다시 한번 입력해주세요.") + String confirmNewPassword +) { + +} From a191838ba03b0138a098b153369ea8c119962116 Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Tue, 12 Aug 2025 14:37:25 +0900 Subject: [PATCH 02/15] =?UTF-8?q?feat:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=B3=80=EA=B2=BD=20=EA=B2=80=EC=A6=9D=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/exception/ErrorCode.java | 3 ++ .../siteuser/dto/PasswordUpdateRequest.java | 2 + .../dto/validation/PasswordConfirmation.java | 17 +++++++ .../PasswordConfirmationValidator.java | 45 +++++++++++++++++++ 4 files changed, 67 insertions(+) create mode 100644 src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmation.java create mode 100644 src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidator.java diff --git a/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java b/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java index b0b04829b..39f23f8fc 100644 --- a/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java +++ b/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java @@ -56,6 +56,9 @@ public enum ErrorCode { ACCESS_TOKEN_EXPIRED(HttpStatus.UNAUTHORIZED.value(), "액세스 토큰이 만료되었습니다. 재발급 api를 호출해주세요."), REFRESH_TOKEN_EXPIRED(HttpStatus.UNAUTHORIZED.value(), "리프레시 토큰이 만료되었습니다. 다시 로그인을 진행해주세요."), ACCESS_DENIED(HttpStatus.FORBIDDEN.value(), "접근 권한이 없습니다."), + PASSWORD_MISMATCH(HttpStatus.BAD_REQUEST.value(), "비밀번호가 일치하지 않습니다."), + PASSWORD_NOT_CHANGED(HttpStatus.BAD_REQUEST.value(), "현재 비밀번호와 새 비밀번호가 동일합니다."), + PASSWORD_NOT_CONFIRMED(HttpStatus.BAD_REQUEST.value(), "새 비밀번호가 일치하지 않습니다."), // s3 S3_SERVICE_EXCEPTION(HttpStatus.BAD_REQUEST.value(), "S3 서비스 에러 발생"), diff --git a/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java b/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java index e59f99ffb..3b66eae02 100644 --- a/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java +++ b/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java @@ -1,7 +1,9 @@ package com.example.solidconnection.siteuser.dto; +import com.example.solidconnection.siteuser.dto.validation.PasswordConfirmation; import jakarta.validation.constraints.NotBlank; +@PasswordConfirmation public record PasswordUpdateRequest( @NotBlank(message = "현재 비밀번호를 입력해주세요.") String currentPassword, diff --git a/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmation.java b/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmation.java new file mode 100644 index 000000000..c55efda5c --- /dev/null +++ b/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmation.java @@ -0,0 +1,17 @@ +package com.example.solidconnection.siteuser.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; + +@Constraint(validatedBy = PasswordConfirmationValidator.class) +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface PasswordConfirmation { + String message() default "비밀번호 변경 과정에서 오류가 발생했습니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git a/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidator.java b/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidator.java new file mode 100644 index 000000000..fc60a7c7a --- /dev/null +++ b/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidator.java @@ -0,0 +1,45 @@ +package com.example.solidconnection.siteuser.dto.validation; + +import static com.example.solidconnection.common.exception.ErrorCode.PASSWORD_NOT_CHANGED; +import static com.example.solidconnection.common.exception.ErrorCode.PASSWORD_NOT_CONFIRMED; + +import com.example.solidconnection.siteuser.dto.PasswordUpdateRequest; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import java.util.Objects; + +public class PasswordConfirmationValidator implements ConstraintValidator { + + @Override + public boolean isValid(PasswordUpdateRequest request, ConstraintValidatorContext context) { + context.disableDefaultConstraintViolation(); + + if (isNewPasswordNotConfirmed(request)) { + addConstraintViolation(context, PASSWORD_NOT_CONFIRMED.getMessage(), "confirmNewPassword"); + + return false; + } + + if (isPasswordUnchanged(request)) { + addConstraintViolation(context, PASSWORD_NOT_CHANGED.getMessage(), "newPassword"); + + return false; + } + + return true; + } + + private boolean isNewPasswordNotConfirmed(PasswordUpdateRequest request) { + return !Objects.equals(request.newPassword(), request.confirmNewPassword()); + } + + private boolean isPasswordUnchanged(PasswordUpdateRequest request) { + return Objects.equals(request.currentPassword(), request.newPassword()); + } + + private void addConstraintViolation(ConstraintValidatorContext context, String message, String propertyName) { + context.buildConstraintViolationWithTemplate(message) + .addPropertyNode(propertyName) + .addConstraintViolation(); + } +} From 7edef0c506c241e9e77e0387b65cada82b7cc028 Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Tue, 12 Aug 2025 15:00:17 +0900 Subject: [PATCH 03/15] =?UTF-8?q?feat:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=B3=80=EA=B2=BD=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../siteuser/controller/MyPageController.java | 12 +++++++++++ .../siteuser/domain/SiteUser.java | 4 ++++ .../siteuser/service/MyPageService.java | 21 +++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/src/main/java/com/example/solidconnection/siteuser/controller/MyPageController.java b/src/main/java/com/example/solidconnection/siteuser/controller/MyPageController.java index 39dcda29a..534b6c361 100644 --- a/src/main/java/com/example/solidconnection/siteuser/controller/MyPageController.java +++ b/src/main/java/com/example/solidconnection/siteuser/controller/MyPageController.java @@ -3,11 +3,14 @@ import com.example.solidconnection.common.resolver.AuthorizedUser; import com.example.solidconnection.siteuser.dto.MyPageResponse; +import com.example.solidconnection.siteuser.dto.PasswordUpdateRequest; import com.example.solidconnection.siteuser.service.MyPageService; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -37,4 +40,13 @@ public ResponseEntity updateMyPageInfo( myPageService.updateMyPageInfo(siteUserId, imageFile, nickname); return ResponseEntity.ok().build(); } + + @PatchMapping("/password") + public ResponseEntity updatePassword( + @AuthorizedUser long siteUserId, + @RequestBody @Valid PasswordUpdateRequest request + ) { + myPageService.updatePassword(siteUserId, request); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java index 0a15317c1..bc8009b8f 100644 --- a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java +++ b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java @@ -115,4 +115,8 @@ public SiteUser( this.authType = authType; this.password = password; } + + public void updatePassword(String newPassword) { + this.password = newPassword; + } } diff --git a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java index 7b85bd411..475d29718 100644 --- a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java +++ b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java @@ -2,6 +2,7 @@ import static com.example.solidconnection.common.exception.ErrorCode.CAN_NOT_CHANGE_NICKNAME_YET; import static com.example.solidconnection.common.exception.ErrorCode.NICKNAME_ALREADY_EXISTED; +import static com.example.solidconnection.common.exception.ErrorCode.PASSWORD_MISMATCH; import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; import com.example.solidconnection.common.exception.CustomException; @@ -10,11 +11,13 @@ import com.example.solidconnection.s3.service.S3Service; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.dto.MyPageResponse; +import com.example.solidconnection.siteuser.dto.PasswordUpdateRequest; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.university.repository.LikedUnivApplyInfoRepository; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -26,6 +29,7 @@ public class MyPageService { public static final int MIN_DAYS_BETWEEN_NICKNAME_CHANGES = 7; public static final DateTimeFormatter NICKNAME_LAST_CHANGE_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + private final PasswordEncoder passwordEncoder; private final SiteUserRepository siteUserRepository; private final LikedUnivApplyInfoRepository likedUnivApplyInfoRepository; private final S3Service s3Service; @@ -87,4 +91,21 @@ private boolean isDefaultProfileImage(String profileImageUrl) { String prefix = "profile/"; return profileImageUrl == null || !profileImageUrl.startsWith(prefix); } + + @Transactional + public void updatePassword(long siteUserId, PasswordUpdateRequest request) { + SiteUser user = siteUserRepository.findById(siteUserId) + .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + + // 사용자의 비밀번호와 request의 currentPassword가 동일한지 검증 + validateCurrentPasswordSame(user.getPassword(), request.currentPassword()); + + user.updatePassword(passwordEncoder.encode(request.newPassword())); + } + + private void validateCurrentPasswordSame(String userPassword, String currentPassword) { + if (!passwordEncoder.matches(userPassword, currentPassword)) { + throw new CustomException(PASSWORD_MISMATCH); + } + } } From 8b0f39b2e448b049d3ff5f4bca748a940339fa20 Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Tue, 12 Aug 2025 15:54:13 +0900 Subject: [PATCH 04/15] =?UTF-8?q?test:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=B3=80=EA=B2=BD=20=EA=B4=80=EB=A0=A8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PasswordConfirmationValidatorTest.java | 74 +++++++++++++++++++ .../siteuser/service/MyPageServiceTest.java | 52 ++++++++++++- 2 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java diff --git a/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java b/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java new file mode 100644 index 000000000..9edae4cf2 --- /dev/null +++ b/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java @@ -0,0 +1,74 @@ +package com.example.solidconnection.siteuser.dto.validation; + +import static com.example.solidconnection.common.exception.ErrorCode.PASSWORD_NOT_CHANGED; +import static com.example.solidconnection.common.exception.ErrorCode.PASSWORD_NOT_CONFIRMED; +import static org.assertj.core.api.Assertions.assertThat; + +import com.example.solidconnection.siteuser.dto.PasswordUpdateRequest; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import java.util.Set; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +@DisplayName("비밀번호 변경 유효성 검사 테스트") +class PasswordConfirmationValidatorTest { + + private Validator validator; + + @BeforeEach + void setUp() { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + validator = factory.getValidator(); + } + + @Test + void 유효한_비밀번호_변경_요청은_검증을_통과한다() { + // given + PasswordUpdateRequest request = new PasswordUpdateRequest("currentPassword123", "newPassword123!", "newPassword123!"); + + // when + Set> violations = validator.validate(request); + + // then + assertThat(violations).isEmpty(); + } + + @Nested + class 유효하지_않은_비밀번호_변경_테스트 { + + @Test + void 새로운_비밀번호와_확인_비밀번호가_일치하지_않으면_검증에_실패한다() { + // given + PasswordUpdateRequest request = new PasswordUpdateRequest("currentPassword123", "newPassword123!", "differentPassword123!"); + + // when + Set> violations = validator.validate(request); + + // then + assertThat(violations).hasSize(1); + ConstraintViolation violation = violations.iterator().next(); + assertThat(violation.getMessage()).isEqualTo(PASSWORD_NOT_CONFIRMED.getMessage()); + assertThat(violation.getPropertyPath().toString()).isEqualTo("confirmNewPassword"); + } + + @Test + void 현재_비밀번호와_새로운_비밀번호가_같으면_검증에_실패한다() { + // given + PasswordUpdateRequest request = new PasswordUpdateRequest("currentPassword123", "currentPassword123", "currentPassword123"); + + // when + Set> violations = validator.validate(request); + + // then + assertThat(violations).hasSize(1); + ConstraintViolation violation = violations.iterator().next(); + assertThat(violation.getMessage()).isEqualTo(PASSWORD_NOT_CHANGED.getMessage()); + assertThat(violation.getPropertyPath().toString()).isEqualTo("newPassword"); + } + } +} diff --git a/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java b/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java index 0358f8024..3348d9d54 100644 --- a/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java +++ b/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java @@ -1,10 +1,13 @@ package com.example.solidconnection.siteuser.service; import static com.example.solidconnection.common.exception.ErrorCode.CAN_NOT_CHANGE_NICKNAME_YET; +import static com.example.solidconnection.common.exception.ErrorCode.PASSWORD_MISMATCH; import static com.example.solidconnection.siteuser.service.MyPageService.MIN_DAYS_BETWEEN_NICKNAME_CHANGES; import static com.example.solidconnection.siteuser.service.MyPageService.NICKNAME_LAST_CHANGE_DATE_FORMAT; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.BDDMockito.any; import static org.mockito.BDDMockito.eq; import static org.mockito.BDDMockito.given; @@ -19,6 +22,7 @@ import com.example.solidconnection.siteuser.domain.Role; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.dto.MyPageResponse; +import com.example.solidconnection.siteuser.dto.PasswordUpdateRequest; import com.example.solidconnection.siteuser.fixture.SiteUserFixture; import com.example.solidconnection.siteuser.fixture.SiteUserFixtureBuilder; import com.example.solidconnection.siteuser.repository.SiteUserRepository; @@ -27,7 +31,6 @@ import com.example.solidconnection.university.fixture.UnivApplyInfoFixture; import com.example.solidconnection.university.repository.LikedUnivApplyInfoRepository; import java.time.LocalDateTime; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -35,6 +38,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mock.web.MockMultipartFile; +import org.springframework.security.crypto.password.PasswordEncoder; @TestContainerSpringBootTest @DisplayName("마이페이지 서비스 테스트") @@ -61,6 +65,9 @@ class MyPageServiceTest { @Autowired private SiteUserFixtureBuilder siteUserFixtureBuilder; + @Autowired + private PasswordEncoder passwordEncoder; + private SiteUser user; @BeforeEach @@ -77,7 +84,7 @@ void setUp() { MyPageResponse response = myPageService.getMyPageInfo(user.getId()); // then - Assertions.assertAll( + assertAll( () -> assertThat(response.nickname()).isEqualTo(user.getNickname()), () -> assertThat(response.profileImageUrl()).isEqualTo(user.getProfileImageUrl()), () -> assertThat(response.role()).isEqualTo(user.getRole()), @@ -176,6 +183,47 @@ void setUp() { } } + @Nested + class 비밀번호_변경_테스트 { + + private String currentPassword; + private String newPassword; + + @BeforeEach + void setUp() { + currentPassword = passwordEncoder.encode(user.getPassword()); + newPassword = "newPassword123"; + } + + @Test + void 비밀번호를_성공적으로_변경한다() { + // given + PasswordUpdateRequest request = new PasswordUpdateRequest(currentPassword, newPassword, newPassword); + + // when + myPageService.updatePassword(user.getId(), request); + + // then + SiteUser updatedUser = siteUserRepository.findById(user.getId()).get(); + assertAll( + () -> assertThat(passwordEncoder.matches(newPassword, updatedUser.getPassword())).isTrue(), + () -> assertThat(passwordEncoder.matches(currentPassword, updatedUser.getPassword())).isFalse() + ); + } + + @Test + void 현재_비밀번호가_일치하지_않으면_예외가_발생한다() { + // given + String wrongPassword = "wrongPassword"; + PasswordUpdateRequest request = new PasswordUpdateRequest(wrongPassword, newPassword, newPassword); + + // when & then + assertThatThrownBy(() -> myPageService.updatePassword(user.getId(), request)) + .isInstanceOf(CustomException.class) + .hasMessage(PASSWORD_MISMATCH.getMessage()); + } + } + private int createLikedUnivApplyInfos(SiteUser testUser) { LikedUnivApplyInfo likedUnivApplyInfo1 = new LikedUnivApplyInfo(null, univApplyInfoFixture.괌대학_A_지원_정보().getId(), testUser.getId()); LikedUnivApplyInfo likedUnivApplyInfo2 = new LikedUnivApplyInfo(null, univApplyInfoFixture.메이지대학_지원_정보().getId(), testUser.getId()); From aa5cbcf203893f9a8c43b5800a029c8d238245f1 Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Tue, 12 Aug 2025 15:54:49 +0900 Subject: [PATCH 05/15] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8F=AC=EB=A7=A4=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../siteuser/dto/validation/PasswordConfirmation.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmation.java b/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmation.java index c55efda5c..cfc34638f 100644 --- a/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmation.java +++ b/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmation.java @@ -11,7 +11,10 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface PasswordConfirmation { + String message() default "비밀번호 변경 과정에서 오류가 발생했습니다."; + Class[] groups() default {}; + Class[] payload() default {}; } From b6daeb3ee556248d28be88c6178b7e9111a2eb6f Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Tue, 12 Aug 2025 18:26:09 +0900 Subject: [PATCH 06/15] =?UTF-8?q?test:=20=EA=B2=80=EC=A6=9D=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PasswordConfirmationValidatorTest.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java b/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java index 9edae4cf2..87f413628 100644 --- a/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java +++ b/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java @@ -3,6 +3,7 @@ import static com.example.solidconnection.common.exception.ErrorCode.PASSWORD_NOT_CHANGED; import static com.example.solidconnection.common.exception.ErrorCode.PASSWORD_NOT_CONFIRMED; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; import com.example.solidconnection.siteuser.dto.PasswordUpdateRequest; import jakarta.validation.ConstraintViolation; @@ -50,10 +51,15 @@ class 유효하지_않은_비밀번호_변경_테스트 { Set> violations = validator.validate(request); // then - assertThat(violations).hasSize(1); - ConstraintViolation violation = violations.iterator().next(); - assertThat(violation.getMessage()).isEqualTo(PASSWORD_NOT_CONFIRMED.getMessage()); - assertThat(violation.getPropertyPath().toString()).isEqualTo("confirmNewPassword"); + assertAll( + () -> assertThat(violations) + .isNotEmpty() + .extracting("message") + .contains(PASSWORD_NOT_CONFIRMED.getMessage()), + () -> assertThat(violations) + .extracting(v -> v.getPropertyPath().toString()) + .containsExactly("confirmNewPassword") + ); } @Test @@ -65,10 +71,15 @@ class 유효하지_않은_비밀번호_변경_테스트 { Set> violations = validator.validate(request); // then - assertThat(violations).hasSize(1); - ConstraintViolation violation = violations.iterator().next(); - assertThat(violation.getMessage()).isEqualTo(PASSWORD_NOT_CHANGED.getMessage()); - assertThat(violation.getPropertyPath().toString()).isEqualTo("newPassword"); + assertAll( + () -> assertThat(violations) + .isNotEmpty() + .extracting("message") + .contains(PASSWORD_NOT_CHANGED.getMessage()), + () -> assertThat(violations) + .extracting(v -> v.getPropertyPath().toString()) + .containsExactly("newPassword") + ); } } } From 03b08fad64b632e2f0af73b31df423e42fc8a9c2 Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Wed, 13 Aug 2025 13:05:26 +0900 Subject: [PATCH 07/15] =?UTF-8?q?chore:=20Password=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solidconnection/siteuser/dto/PasswordUpdateRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java b/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java index 3b66eae02..fe8a26ec5 100644 --- a/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java +++ b/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java @@ -9,7 +9,7 @@ public record PasswordUpdateRequest( String currentPassword, @NotBlank(message = "새 비밀번호를 입력해주세요.") - // @Password // todo: #435 merge 후 + @Password String newPassword, @NotBlank(message = "새 비밀번호를 다시 한번 입력해주세요.") From 24170c839d3a2ec2def4f5256ee3423ca8844823 Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Wed, 13 Aug 2025 13:12:17 +0900 Subject: [PATCH 08/15] =?UTF-8?q?chore:=20=EB=AA=85=ED=99=95=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EC=9D=98=EB=AF=B8=20=EC=A0=84=EB=8B=AC=EC=9D=B4=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=ED=95=9C=20=EB=B3=80=EC=88=98=EB=AA=85?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/solidconnection/siteuser/domain/SiteUser.java | 4 ++-- .../solidconnection/siteuser/dto/PasswordUpdateRequest.java | 2 +- .../dto/validation/PasswordConfirmationValidator.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java index bc8009b8f..9f4f7ef0f 100644 --- a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java +++ b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java @@ -116,7 +116,7 @@ public SiteUser( this.password = password; } - public void updatePassword(String newPassword) { - this.password = newPassword; + public void updatePassword(String newEncodedPassword) { + this.password = newEncodedPassword; } } diff --git a/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java b/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java index fe8a26ec5..d7868de6f 100644 --- a/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java +++ b/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java @@ -13,7 +13,7 @@ public record PasswordUpdateRequest( String newPassword, @NotBlank(message = "새 비밀번호를 다시 한번 입력해주세요.") - String confirmNewPassword + String newPasswordConfirmation ) { } diff --git a/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidator.java b/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidator.java index fc60a7c7a..7524e4505 100644 --- a/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidator.java +++ b/src/main/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidator.java @@ -15,7 +15,7 @@ public boolean isValid(PasswordUpdateRequest request, ConstraintValidatorContext context.disableDefaultConstraintViolation(); if (isNewPasswordNotConfirmed(request)) { - addConstraintViolation(context, PASSWORD_NOT_CONFIRMED.getMessage(), "confirmNewPassword"); + addConstraintViolation(context, PASSWORD_NOT_CONFIRMED.getMessage(), "newPasswordConfirmation"); return false; } @@ -30,7 +30,7 @@ public boolean isValid(PasswordUpdateRequest request, ConstraintValidatorContext } private boolean isNewPasswordNotConfirmed(PasswordUpdateRequest request) { - return !Objects.equals(request.newPassword(), request.confirmNewPassword()); + return !Objects.equals(request.newPassword(), request.newPasswordConfirmation()); } private boolean isPasswordUnchanged(PasswordUpdateRequest request) { From 2f0675f57c9aab5a48b37be540db710663021f54 Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Wed, 13 Aug 2025 13:16:38 +0900 Subject: [PATCH 09/15] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PasswordConfirmationValidatorTest.java | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java b/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java index 87f413628..c3c69f8fc 100644 --- a/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java +++ b/src/test/java/com/example/solidconnection/siteuser/dto/validation/PasswordConfirmationValidatorTest.java @@ -3,7 +3,6 @@ import static com.example.solidconnection.common.exception.ErrorCode.PASSWORD_NOT_CHANGED; import static com.example.solidconnection.common.exception.ErrorCode.PASSWORD_NOT_CONFIRMED; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; import com.example.solidconnection.siteuser.dto.PasswordUpdateRequest; import jakarta.validation.ConstraintViolation; @@ -19,6 +18,8 @@ @DisplayName("비밀번호 변경 유효성 검사 테스트") class PasswordConfirmationValidatorTest { + private static final String MESSAGE = "message"; + private Validator validator; @BeforeEach @@ -51,15 +52,10 @@ class 유효하지_않은_비밀번호_변경_테스트 { Set> violations = validator.validate(request); // then - assertAll( - () -> assertThat(violations) - .isNotEmpty() - .extracting("message") - .contains(PASSWORD_NOT_CONFIRMED.getMessage()), - () -> assertThat(violations) - .extracting(v -> v.getPropertyPath().toString()) - .containsExactly("confirmNewPassword") - ); + assertThat(violations) + .isNotEmpty() + .extracting(MESSAGE) + .contains(PASSWORD_NOT_CONFIRMED.getMessage()); } @Test @@ -71,15 +67,10 @@ class 유효하지_않은_비밀번호_변경_테스트 { Set> violations = validator.validate(request); // then - assertAll( - () -> assertThat(violations) - .isNotEmpty() - .extracting("message") - .contains(PASSWORD_NOT_CHANGED.getMessage()), - () -> assertThat(violations) - .extracting(v -> v.getPropertyPath().toString()) - .containsExactly("newPassword") - ); + assertThat(violations) + .isNotEmpty() + .extracting(MESSAGE) + .contains(PASSWORD_NOT_CHANGED.getMessage()); } } } From cb212d90346a1642b771c528e47e48a964b49b4b Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Wed, 13 Aug 2025 13:27:52 +0900 Subject: [PATCH 10/15] =?UTF-8?q?test:=20=EC=8B=A4=EC=A0=9C=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20=EB=B3=80=EA=B2=BD=20=ED=94=8C?= =?UTF-8?q?=EB=A1=9C=EC=9A=B0=EC=97=90=20=EB=A7=9E=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solidconnection/siteuser/service/MyPageServiceTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java b/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java index 3348d9d54..8bed32667 100644 --- a/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java +++ b/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java @@ -191,8 +191,11 @@ class 비밀번호_변경_테스트 { @BeforeEach void setUp() { - currentPassword = passwordEncoder.encode(user.getPassword()); + currentPassword = passwordEncoder.encode("currentPassword123"); newPassword = "newPassword123"; + + user.updatePassword(currentPassword); + siteUserRepository.save(user); } @Test From c1403c3eb7e535f8dc7e552b77072c274706e925 Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Wed, 13 Aug 2025 13:28:48 +0900 Subject: [PATCH 11/15] =?UTF-8?q?chore:=20matches=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=A0=95=EC=9D=98=EC=97=90=20=EB=A7=9E=EA=B2=8C=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solidconnection/siteuser/service/MyPageService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java index 475d29718..fe7da1838 100644 --- a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java +++ b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java @@ -98,13 +98,13 @@ public void updatePassword(long siteUserId, PasswordUpdateRequest request) { .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); // 사용자의 비밀번호와 request의 currentPassword가 동일한지 검증 - validateCurrentPasswordSame(user.getPassword(), request.currentPassword()); + validateCurrentPasswordSame(request.currentPassword(), user.getPassword()); user.updatePassword(passwordEncoder.encode(request.newPassword())); } - private void validateCurrentPasswordSame(String userPassword, String currentPassword) { - if (!passwordEncoder.matches(userPassword, currentPassword)) { + private void validateCurrentPasswordSame(String currentPassword, String userPassword) { + if (!passwordEncoder.matches(currentPassword, userPassword)) { throw new CustomException(PASSWORD_MISMATCH); } } From d0f6df0088984dfaebba14c6947891f001a900ca Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Wed, 13 Aug 2025 13:31:07 +0900 Subject: [PATCH 12/15] =?UTF-8?q?chore:=20=EC=97=AD=ED=95=A0=EC=9D=84=20?= =?UTF-8?q?=EB=8D=94=20=EC=9E=98=20=EB=93=9C=EB=9F=AC=EB=82=B4=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EA=B2=80=EC=A6=9D=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solidconnection/siteuser/service/MyPageService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java index fe7da1838..1800df32b 100644 --- a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java +++ b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java @@ -98,12 +98,12 @@ public void updatePassword(long siteUserId, PasswordUpdateRequest request) { .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); // 사용자의 비밀번호와 request의 currentPassword가 동일한지 검증 - validateCurrentPasswordSame(request.currentPassword(), user.getPassword()); + validatePasswordMatch(request.currentPassword(), user.getPassword()); user.updatePassword(passwordEncoder.encode(request.newPassword())); } - private void validateCurrentPasswordSame(String currentPassword, String userPassword) { + private void validatePasswordMatch(String currentPassword, String userPassword) { if (!passwordEncoder.matches(currentPassword, userPassword)) { throw new CustomException(PASSWORD_MISMATCH); } From a1888c2c97dd58a75b67e0a0a9dc61146f13c66c Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 Date: Sun, 10 Aug 2025 01:06:32 +0900 Subject: [PATCH 13/15] =?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 99a1f6d41778d557a0fb06e2180cb026217c13de Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Wed, 13 Aug 2025 13:41:26 +0900 Subject: [PATCH 14/15] =?UTF-8?q?fix:=20Password=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20import=EB=AC=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solidconnection/siteuser/dto/PasswordUpdateRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java b/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java index d7868de6f..3f3d7b077 100644 --- a/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java +++ b/src/main/java/com/example/solidconnection/siteuser/dto/PasswordUpdateRequest.java @@ -1,5 +1,6 @@ package com.example.solidconnection.siteuser.dto; +import com.example.solidconnection.auth.dto.validation.Password; import com.example.solidconnection.siteuser.dto.validation.PasswordConfirmation; import jakarta.validation.constraints.NotBlank; From a58199ed9b347e5284b47d1146b8d93f8945cdc0 Mon Sep 17 00:00:00 2001 From: seonghyeok Date: Wed, 13 Aug 2025 14:06:09 +0900 Subject: [PATCH 15/15] =?UTF-8?q?fix:=20currentPassword=EA=B0=80=20?= =?UTF-8?q?=EC=9D=B8=EC=BD=94=EB=94=A9=EB=90=98=EC=97=88=EB=8D=98=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solidconnection/siteuser/service/MyPageServiceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java b/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java index 8bed32667..f470e9cfc 100644 --- a/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java +++ b/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java @@ -191,10 +191,10 @@ class 비밀번호_변경_테스트 { @BeforeEach void setUp() { - currentPassword = passwordEncoder.encode("currentPassword123"); + currentPassword = "currentPassword123"; newPassword = "newPassword123"; - user.updatePassword(currentPassword); + user.updatePassword(passwordEncoder.encode(currentPassword)); siteUserRepository.save(user); }