diff --git a/src/main/java/com/retrip/auth/application/config/CustomUserDetails.java b/src/main/java/com/retrip/auth/application/config/CustomUserDetails.java index 30b17a8..3442065 100644 --- a/src/main/java/com/retrip/auth/application/config/CustomUserDetails.java +++ b/src/main/java/com/retrip/auth/application/config/CustomUserDetails.java @@ -63,8 +63,8 @@ public String getGender() { return member.getGender(); } - public Integer getAge() { - return member.getAge(); + public String getBirthDate() { + return member.getBirthDate(); } // ============================================================= @@ -85,4 +85,4 @@ public String getName() { @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } -} \ No newline at end of file +} diff --git a/src/main/java/com/retrip/auth/application/config/JwtProvider.java b/src/main/java/com/retrip/auth/application/config/JwtProvider.java index 0752033..28d4154 100644 --- a/src/main/java/com/retrip/auth/application/config/JwtProvider.java +++ b/src/main/java/com/retrip/auth/application/config/JwtProvider.java @@ -38,7 +38,7 @@ public LoginResponse.TokenResponse generateTokens(Authentication authentication) String email = ""; String name = ""; String gender = null; - Integer age = null; + String birthDate = null; Object principal = authentication.getPrincipal(); if (principal instanceof CustomUserDetails userDetails) { @@ -46,18 +46,18 @@ public LoginResponse.TokenResponse generateTokens(Authentication authentication) email = userDetails.getEmail(); name = userDetails.getRealName(); gender = userDetails.getGender(); - age = userDetails.getAge(); + birthDate = userDetails.getBirthDate(); } else { memberId = authentication.getName(); } - String accessToken = createToken(memberId, email, name, gender, age, authorities, now, jwtConfig.getAccess().getExpireMin()); - String refreshToken = createToken(memberId, email, name, gender, age, authorities, now, jwtConfig.getRefresh().getExpireMin()); + String accessToken = createToken(memberId, email, name, gender, birthDate, authorities, now, jwtConfig.getAccess().getExpireMin()); + String refreshToken = createToken(memberId, email, name, gender, birthDate, authorities, now, jwtConfig.getRefresh().getExpireMin()); return new LoginResponse.TokenResponse(accessToken, refreshToken); } - private String createToken(String subject, String email, String name, String gender, Integer age, + private String createToken(String subject, String email, String name, String gender, String birthDate, String authorities, Instant issuedAt, long expirationMinutes) { try { PrivateKey privateKey = getPrivateKey(jwtConfig.getPrivateKey()); @@ -70,7 +70,7 @@ private String createToken(String subject, String email, String name, String gen .claim("authorities", authorities); // 권한이 없으면 빈 문자열 ""이 들어감 if (gender != null) builder.claim("gender", gender); - if (age != null) builder.claim("age", age); + if (birthDate != null) builder.claim("birthDate", birthDate); return builder .issuedAt(Date.from(issuedAt)) @@ -97,7 +97,7 @@ public Authentication getAuthentication(String token) { String name = claims.get("name", String.class); String authoritiesStr = claims.get("authorities", String.class); String gender = claims.get("gender", String.class); - Integer age = claims.get("age", Integer.class); + String birthDate = claims.get("birthDate", String.class); // 2. 권한 목록 생성 [수정된 부분: 빈 문자열 처리 추가] List authorities = new ArrayList<>(); @@ -115,7 +115,7 @@ public Authentication getAuthentication(String token) { .email(new MemberEmail(email)) .name(new MemberName(name)) .gender(gender) - .age(age) + .birthDate(birthDate) .password(null) .build(); @@ -174,4 +174,4 @@ private List getAuthorities(Authentication authentication) { .map(GrantedAuthority::getAuthority) .toList(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/retrip/auth/application/dto/response/ProfileResponse.java b/src/main/java/com/retrip/auth/application/dto/response/ProfileResponse.java index fbd98cb..de1c2fb 100644 --- a/src/main/java/com/retrip/auth/application/dto/response/ProfileResponse.java +++ b/src/main/java/com/retrip/auth/application/dto/response/ProfileResponse.java @@ -12,7 +12,7 @@ public class ProfileResponse { private String email; private String name; private String gender; - private Integer age; + private String birthDate; private Boolean isVerified; private String profileImageUrl; private String bio; @@ -25,7 +25,7 @@ public static ProfileResponse from(Member member, List travelStyles) { .email(member.getEmailValue()) .name(member.getNameValue()) .gender(member.getGender()) - .age(member.getAge()) + .birthDate(member.getBirthDate()) .isVerified(member.isVerified()) .profileImageUrl(member.getProfileImageUrl()) .bio(member.getBio()) diff --git a/src/main/java/com/retrip/auth/application/dto/response/VerifyIdentityResponse.java b/src/main/java/com/retrip/auth/application/dto/response/VerifyIdentityResponse.java index f030f26..c45c780 100644 --- a/src/main/java/com/retrip/auth/application/dto/response/VerifyIdentityResponse.java +++ b/src/main/java/com/retrip/auth/application/dto/response/VerifyIdentityResponse.java @@ -9,14 +9,14 @@ public class VerifyIdentityResponse { private String name; private String gender; - private Integer age; + private String birthDate; private Boolean isVerified; public static VerifyIdentityResponse from(Member member) { return VerifyIdentityResponse.builder() .name(member.getNameValue()) .gender(member.getGender()) - .age(member.getAge()) + .birthDate(member.getBirthDate()) .isVerified(member.isVerified()) .build(); } diff --git a/src/main/java/com/retrip/auth/application/in/MemberService.java b/src/main/java/com/retrip/auth/application/in/MemberService.java index b4dc196..3c50a39 100644 --- a/src/main/java/com/retrip/auth/application/in/MemberService.java +++ b/src/main/java/com/retrip/auth/application/in/MemberService.java @@ -85,7 +85,7 @@ public MemberUpdateResponse updateUser(UUID memberId, MemberUpdateRequest reques request.name(), encodedNewPassword, request.gender(), - request.age() + request.birthDate() ); // Access Token 재발급 diff --git a/src/main/java/com/retrip/auth/application/in/request/MemberCreateRequest.java b/src/main/java/com/retrip/auth/application/in/request/MemberCreateRequest.java index 9a57744..9f02e51 100644 --- a/src/main/java/com/retrip/auth/application/in/request/MemberCreateRequest.java +++ b/src/main/java/com/retrip/auth/application/in/request/MemberCreateRequest.java @@ -3,6 +3,8 @@ import com.retrip.auth.domain.entity.Member; import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; + @Schema(description = "Member 회원가입 Request") public record MemberCreateRequest( @Schema(description = "이메일") @@ -13,20 +15,23 @@ public record MemberCreateRequest( String name, @Schema(description = "성별 (M/F)") String gender, - @Schema(description = "나이") - Integer age + @Schema(description = "생년월일 (YYYY-MM-DD)") + String birthDate, + @Schema(description = "필수 약관 동의") + boolean termsAgreed, + @Schema(description = "마케팅 수신 동의") + boolean marketingAgreed ) { public Member to(String encodePassword) { - return Member.builder() - .email(new com.retrip.auth.domain.vo.MemberEmail(email)) - .password(new com.retrip.auth.domain.vo.MemberPassword(encodePassword)) - .name(new com.retrip.auth.domain.vo.MemberName(name)) - .gender(gender) - .age(age) - .isDeleted(false) - .provider("local") - .isVerified(false) - .id(java.util.UUID.randomUUID()) - .build(); + return Member.create( + name, + email, + encodePassword, + List.of("user"), + gender, + birthDate, + termsAgreed, + marketingAgreed + ); } -} \ No newline at end of file +} diff --git a/src/main/java/com/retrip/auth/application/in/request/MemberUpdateRequest.java b/src/main/java/com/retrip/auth/application/in/request/MemberUpdateRequest.java index 84d6f17..adb65d7 100644 --- a/src/main/java/com/retrip/auth/application/in/request/MemberUpdateRequest.java +++ b/src/main/java/com/retrip/auth/application/in/request/MemberUpdateRequest.java @@ -12,7 +12,7 @@ public record MemberUpdateRequest( String name, @Schema(description = "성별 (M/F)") String gender, - @Schema(description = "나이") - Integer age + @Schema(description = "생년월일 (YYYY-MM-DD)") + String birthDate ) { -} \ No newline at end of file +} diff --git a/src/main/java/com/retrip/auth/application/service/IdentityVerificationService.java b/src/main/java/com/retrip/auth/application/service/IdentityVerificationService.java index f38c861..b6eaea3 100644 --- a/src/main/java/com/retrip/auth/application/service/IdentityVerificationService.java +++ b/src/main/java/com/retrip/auth/application/service/IdentityVerificationService.java @@ -51,8 +51,8 @@ public VerifyIdentityResponse verifyAndSave(String identityVerificationId, Strin // 성별 변환 (MALE -> M, FEMALE -> F) String gender = "MALE".equals(certInfo.getGender()) ? "M" : "F"; - log.info("✅ 회원 본인인증 정보 업데이트 - Name: {}, Gender: {}, Age: {}", - certInfo.getName(), gender, member.calculateAge(certInfo.getBirthday())); + log.info("✅ 회원 본인인증 정보 업데이트 - Name: {}, Gender: {}, BirthDate: {}", + certInfo.getName(), gender, certInfo.getBirthday()); member.updateIdentityVerification( certInfo.getName(), diff --git a/src/main/java/com/retrip/auth/domain/entity/Member.java b/src/main/java/com/retrip/auth/domain/entity/Member.java index 5dd7cdd..20dccc3 100644 --- a/src/main/java/com/retrip/auth/domain/entity/Member.java +++ b/src/main/java/com/retrip/auth/domain/entity/Member.java @@ -60,8 +60,17 @@ public class Member extends BaseEntity { @Column(name = "gender", length = 1) private String gender; - @Column(name = "age") - private Integer age; + @Column(length = 10) + private String birthDate; + + // 약관 동의 + @Column(nullable = false) + @Builder.Default + private boolean termsAgreed = false; + + @Column(nullable = false) + @Builder.Default + private boolean marketingAgreed = false; // 프로필 관련 @Column(length = 500) @@ -90,7 +99,7 @@ public String getNameValue() { return this.name != null ? this.name.getValue() : null; } - public static Member create(String name, String email, String password, List authorities, String gender, Integer age) { + public static Member create(String name, String email, String password, List authorities, String gender, String birthDate, boolean termsAgreed, boolean marketingAgreed) { Member member = Member.builder() .id(UUID.randomUUID()) .name(new MemberName(name)) @@ -100,7 +109,9 @@ public static Member create(String name, String email, String password, List getTestToken() { + log.warn("🚨 테스트 토큰 발급 - 개발 환경 전용 API"); + + UUID testUserId = UUID.fromString("00000000-0000-0000-0000-000000000000"); + String testEmail = "test@test.com"; + + // 1. 기존 테스트 사용자 조회 (이메일로) + Member testMember = memberRepository.findByEmail_Value(testEmail) + .filter(m -> !m.getIsDeleted()) // 탈퇴하지 않은 사용자만 + .orElseGet(() -> { + log.info("🔨 테스트 사용자 생성 중..."); + + // 2. Member.create() 사용 + Member newMember = Member.create( + "테스트유저", + testEmail, + passwordEncoder.encode("test1234"), + List.of("user"), + "M", + "1995-01-01", + true, // termsAgreed + true // marketingAgreed + ); + + // 3. DB 저장 + return memberRepository.save(newMember); + }); + + log.info("✅ 테스트 사용자 확인 - UUID: {}, Email: {}", + testMember.getId(), testMember.getEmailValue()); + + // CustomUserDetails로 감싸기 + CustomUserDetails userDetails = new CustomUserDetails(testMember); + + // Authentication 객체 생성 + Authentication authentication = new UsernamePasswordAuthenticationToken( + userDetails, + null, + List.of(new SimpleGrantedAuthority("ROLE_USER")) + ); + + // JWT 토큰 생성 + LoginResponse.TokenResponse tokens = jwtProvider.generateTokens(authentication); + + log.info("✅ 테스트 토큰 발급 완료"); + + return ApiResponse.ok(tokens.accessToken()); } }