From f02778023c89622e308fab1f1d37ad5dabef74a6 Mon Sep 17 00:00:00 2001 From: ThinkKat Date: Wed, 25 Feb 2026 14:43:46 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=EC=95=BD=EA=B4=80=20=EB=8F=99?= =?UTF-8?q?=EC=9D=98=20=ED=83=80=EC=9E=84=EC=8A=A4=ED=83=AC=ED=94=84=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=20=E2=80=94=20=EA=B0=9C=EC=9D=B8=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=B3=B4=ED=98=B8=EB=B2=95=20=EC=A0=9C22=EC=A1=B0=20?= =?UTF-8?q?=EB=8C=80=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - User 엔티티에 termsAgreedAt, privacyAgreedAt 필드 추가 - UserRegisterRequest에 동의 타임스탬프 필드 추가 (@NotNull) - UserService.register()에서 동의 시점 저장 --- .../opic/practice/dto/request/UserRegisterRequest.java | 9 +++++++++ src/main/java/me/thinkcat/opic/practice/entity/User.java | 8 ++++++++ .../me/thinkcat/opic/practice/service/UserService.java | 2 ++ 3 files changed, 19 insertions(+) diff --git a/src/main/java/me/thinkcat/opic/practice/dto/request/UserRegisterRequest.java b/src/main/java/me/thinkcat/opic/practice/dto/request/UserRegisterRequest.java index 9edd64c..3a13777 100644 --- a/src/main/java/me/thinkcat/opic/practice/dto/request/UserRegisterRequest.java +++ b/src/main/java/me/thinkcat/opic/practice/dto/request/UserRegisterRequest.java @@ -1,11 +1,14 @@ package me.thinkcat.opic.practice.dto.request; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Getter @NoArgsConstructor @AllArgsConstructor @@ -20,4 +23,10 @@ public class UserRegisterRequest { private String password; private String email; + + @NotNull(message = "Terms agreement timestamp is required") + private LocalDateTime termsAgreedAt; + + @NotNull(message = "Privacy agreement timestamp is required") + private LocalDateTime privacyAgreedAt; } diff --git a/src/main/java/me/thinkcat/opic/practice/entity/User.java b/src/main/java/me/thinkcat/opic/practice/entity/User.java index c33095e..e81f64e 100644 --- a/src/main/java/me/thinkcat/opic/practice/entity/User.java +++ b/src/main/java/me/thinkcat/opic/practice/entity/User.java @@ -6,6 +6,8 @@ import org.hibernate.annotations.Where; import java.sql.Types; +import java.time.LocalDateTime; + @Entity @Table(name = "users") @@ -30,6 +32,12 @@ public class User extends BaseEntity { @Column(unique = true) private String email; + @Column + private LocalDateTime termsAgreedAt; + + @Column + private LocalDateTime privacyAgreedAt; + @JdbcTypeCode(Types.CHAR) @Column(name = "user_role_code", nullable = false, columnDefinition = "char(7)") @Builder.Default diff --git a/src/main/java/me/thinkcat/opic/practice/service/UserService.java b/src/main/java/me/thinkcat/opic/practice/service/UserService.java index 27a249e..b17651d 100644 --- a/src/main/java/me/thinkcat/opic/practice/service/UserService.java +++ b/src/main/java/me/thinkcat/opic/practice/service/UserService.java @@ -42,6 +42,8 @@ public UserResponse register(UserRegisterRequest request) { .username(request.getUsername()) .password(passwordEncoder.encode(request.getPassword())) .email(request.getEmail()) + .termsAgreedAt(request.getTermsAgreedAt()) + .privacyAgreedAt(request.getPrivacyAgreedAt()) .build(); User savedUser = userRepository.save(user); From f6b4127881b8ff704868c2fc7d95307fb3a86359 Mon Sep 17 00:00:00 2001 From: ThinkKat Date: Wed, 25 Feb 2026 14:54:11 +0900 Subject: [PATCH 2/2] =?UTF-8?q?test:=20UserServiceTest=20=E2=80=94=20UserR?= =?UTF-8?q?egisterRequest=20=EC=83=9D=EC=84=B1=EC=9E=90=EC=97=90=20?= =?UTF-8?q?=EB=8F=99=EC=9D=98=20=ED=83=80=EC=9E=84=EC=8A=A4=ED=83=AC?= =?UTF-8?q?=ED=94=84=20=EC=9D=B8=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thinkcat/opic/practice/service/UserServiceTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/java/me/thinkcat/opic/practice/service/UserServiceTest.java b/src/test/java/me/thinkcat/opic/practice/service/UserServiceTest.java index 137ef2d..b0733ea 100644 --- a/src/test/java/me/thinkcat/opic/practice/service/UserServiceTest.java +++ b/src/test/java/me/thinkcat/opic/practice/service/UserServiceTest.java @@ -16,6 +16,8 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.crypto.password.PasswordEncoder; +import java.time.LocalDateTime; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; @@ -43,7 +45,7 @@ class UserServiceTest { given(userRepository.existsByUsername(any())).willReturn(false); assertThatThrownBy(() -> - userService.register(new UserRegisterRequest("user", password, "a@b.com"))) + userService.register(new UserRegisterRequest("user", password, "a@b.com", LocalDateTime.now(), LocalDateTime.now()))) .isInstanceOf(ValidationException.class); } @@ -55,7 +57,7 @@ class UserServiceTest { given(userRepository.save(any(User.class))).willReturn(saved); UserResponse response = userService.register( - new UserRegisterRequest("user", "Password1@", "user@example.com")); + new UserRegisterRequest("user", "Password1@", "user@example.com", LocalDateTime.now(), LocalDateTime.now())); assertThat(response.getUsername()).isEqualTo("user"); } @@ -71,7 +73,7 @@ class UserServiceTest { given(userRepository.existsByUsername(any())).willReturn(false); assertThatThrownBy(() -> - userService.register(new UserRegisterRequest("user", "Password1@", email))) + userService.register(new UserRegisterRequest("user", "Password1@", email, LocalDateTime.now(), LocalDateTime.now()))) .isInstanceOf(ValidationException.class); } }