diff --git a/account-service/.gitignore b/account-service/.gitignore index 14af79c..3508af4 100644 --- a/account-service/.gitignore +++ b/account-service/.gitignore @@ -37,3 +37,4 @@ out/ .vscode/ **/security/* +**/generated/* \ No newline at end of file diff --git a/account-service/account-service-api/.gitignore b/account-service/account-service-api/.gitignore new file mode 100644 index 0000000..c2065bc --- /dev/null +++ b/account-service/account-service-api/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/account-service/account-service-api/build.gradle b/account-service/account-service-api/build.gradle new file mode 100644 index 0000000..69a4897 --- /dev/null +++ b/account-service/account-service-api/build.gradle @@ -0,0 +1,15 @@ +repositories { + mavenCentral() +} + +dependencies { + +} + +tasks.named('test') { + useJUnitPlatform() +} + +bootJar { + enabled = false +} diff --git a/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/TokenResult.java b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/TokenResult.java new file mode 100644 index 0000000..27cb132 --- /dev/null +++ b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/TokenResult.java @@ -0,0 +1,10 @@ +package com.synapse.account_service_api.dto; + +import java.time.Instant; + +public record TokenResult( + String token, + Instant expiresAt +) { + +} diff --git a/account-service/src/main/java/com/synapse/account_service/dto/request/LoginRequest.java b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/request/LoginRequest.java similarity index 88% rename from account-service/src/main/java/com/synapse/account_service/dto/request/LoginRequest.java rename to account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/request/LoginRequest.java index 03ac247..de4c553 100644 --- a/account-service/src/main/java/com/synapse/account_service/dto/request/LoginRequest.java +++ b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/request/LoginRequest.java @@ -1,4 +1,4 @@ -package com.synapse.account_service.dto.request; +package com.synapse.account_service_api.dto.request; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; diff --git a/account-service/src/main/java/com/synapse/account_service/dto/request/SignUpRequest.java b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/request/SignUpRequest.java similarity index 92% rename from account-service/src/main/java/com/synapse/account_service/dto/request/SignUpRequest.java rename to account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/request/SignUpRequest.java index 453fa3f..fa6dcde 100644 --- a/account-service/src/main/java/com/synapse/account_service/dto/request/SignUpRequest.java +++ b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/request/SignUpRequest.java @@ -1,4 +1,4 @@ -package com.synapse.account_service.dto.request; +package com.synapse.account_service_api.dto.request; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; diff --git a/account-service/src/main/java/com/synapse/account_service/dto/AccessTokenResponse.java b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/AccessTokenResponse.java similarity index 78% rename from account-service/src/main/java/com/synapse/account_service/dto/AccessTokenResponse.java rename to account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/AccessTokenResponse.java index 4c37894..8874b66 100644 --- a/account-service/src/main/java/com/synapse/account_service/dto/AccessTokenResponse.java +++ b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/AccessTokenResponse.java @@ -1,6 +1,7 @@ -package com.synapse.account_service.dto; +package com.synapse.account_service_api.dto.response; import com.fasterxml.jackson.annotation.JsonProperty; +import com.synapse.account_service_api.dto.TokenResult; public record AccessTokenResponse( @JsonProperty("accessToken") String token, @@ -12,3 +13,4 @@ public static AccessTokenResponse from(TokenResult tokenResult) { tokenResult.expiresAt().toEpochMilli()); } } + diff --git a/account-service/src/main/java/com/synapse/account_service/dto/RefreshTokenResponse.java b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/RefreshTokenResponse.java similarity index 74% rename from account-service/src/main/java/com/synapse/account_service/dto/RefreshTokenResponse.java rename to account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/RefreshTokenResponse.java index f69ec60..487a727 100644 --- a/account-service/src/main/java/com/synapse/account_service/dto/RefreshTokenResponse.java +++ b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/RefreshTokenResponse.java @@ -1,4 +1,4 @@ -package com.synapse.account_service.dto; +package com.synapse.account_service_api.dto.response; import org.springframework.http.ResponseCookie; diff --git a/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/SignUpResponse.java b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/SignUpResponse.java new file mode 100644 index 0000000..68514b9 --- /dev/null +++ b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/SignUpResponse.java @@ -0,0 +1,13 @@ +package com.synapse.account_service_api.dto.response; + +import java.util.UUID; + +public record SignUpResponse( + UUID id, + String email, + String username, + String role +) { + +} + diff --git a/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/TokenResponse.java b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/TokenResponse.java new file mode 100644 index 0000000..8805e01 --- /dev/null +++ b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/dto/response/TokenResponse.java @@ -0,0 +1,10 @@ +package com.synapse.account_service_api.dto.response; + +import com.synapse.account_service_api.dto.TokenResult; + +public record TokenResponse( + TokenResult accessToken, + TokenResult refreshToken +) { + +} diff --git a/account-service/account-service-api/src/main/java/com/synapse/account_service_api/event/MemberDomainEvent.java b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/event/MemberDomainEvent.java new file mode 100644 index 0000000..4cb83f0 --- /dev/null +++ b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/event/MemberDomainEvent.java @@ -0,0 +1,7 @@ +package com.synapse.account_service_api.event; + +import io.eventuate.tram.events.common.DomainEvent; + +public interface MemberDomainEvent extends DomainEvent { + +} diff --git a/account-service/account-service-api/src/main/java/com/synapse/account_service_api/event/MemberRegisteredEvent.java b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/event/MemberRegisteredEvent.java new file mode 100644 index 0000000..b5c3d2d --- /dev/null +++ b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/event/MemberRegisteredEvent.java @@ -0,0 +1,36 @@ +package com.synapse.account_service_api.event; + +import java.util.UUID; + +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PUBLIC) +public class MemberRegisteredEvent implements MemberDomainEvent { + private UUID userId; + private String email; + private String username; + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @Override + public boolean equals(Object o) { + return EqualsBuilder.reflectionEquals(this, o); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } +} diff --git a/account-service/account-service-api/src/main/java/com/synapse/account_service_api/event/SocialAccountLinkedEvent.java b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/event/SocialAccountLinkedEvent.java new file mode 100644 index 0000000..1fe2031 --- /dev/null +++ b/account-service/account-service-api/src/main/java/com/synapse/account_service_api/event/SocialAccountLinkedEvent.java @@ -0,0 +1,33 @@ +package com.synapse.account_service_api.event; + +import java.util.UUID; + +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + +import lombok.*; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PUBLIC) +public class SocialAccountLinkedEvent implements MemberDomainEvent{ + private UUID userId; + private String providerId; + private String registrationId; + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @Override + public boolean equals(Object o) { + return EqualsBuilder.reflectionEquals(this, o); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } +} diff --git a/account-service/account-service/.gitignore b/account-service/account-service/.gitignore new file mode 100644 index 0000000..14af79c --- /dev/null +++ b/account-service/account-service/.gitignore @@ -0,0 +1,39 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +**/security/* diff --git a/account-service/account-service/build.gradle b/account-service/account-service/build.gradle new file mode 100644 index 0000000..84f58e4 --- /dev/null +++ b/account-service/account-service/build.gradle @@ -0,0 +1,25 @@ +repositories { + mavenCentral() +} + +dependencies { + implementation project(':account-service-api') +} + +def generated = 'src/main/generated' + +tasks.withType(JavaCompile) { + options.getGeneratedSourceOutputDirectory().set(file(generated)) +} + +sourceSets { + main.java.srcDirs += [ generated ] +} + +clean { + delete file(generated) +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/account-service/src/main/java/com/synapse/account_service/AccountServiceApplication.java b/account-service/account-service/src/main/java/com/synapse/account_service/AccountServiceApplication.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/AccountServiceApplication.java rename to account-service/account-service/src/main/java/com/synapse/account_service/AccountServiceApplication.java diff --git a/account-service/account-service/src/main/java/com/synapse/account_service/AccountServiceConfig.java b/account-service/account-service/src/main/java/com/synapse/account_service/AccountServiceConfig.java new file mode 100644 index 0000000..b1065a5 --- /dev/null +++ b/account-service/account-service/src/main/java/com/synapse/account_service/AccountServiceConfig.java @@ -0,0 +1,12 @@ +package com.synapse.account_service; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@EnableJpaAuditing +@ComponentScan +@EnableAutoConfiguration +public class AccountServiceConfig { + +} diff --git a/account-service/src/main/java/com/synapse/account_service/config/ObjectMapperConfig.java b/account-service/account-service/src/main/java/com/synapse/account_service/configuration/ObjectMapperConfig.java similarity index 90% rename from account-service/src/main/java/com/synapse/account_service/config/ObjectMapperConfig.java rename to account-service/account-service/src/main/java/com/synapse/account_service/configuration/ObjectMapperConfig.java index 31381fc..621b94b 100644 --- a/account-service/src/main/java/com/synapse/account_service/config/ObjectMapperConfig.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/configuration/ObjectMapperConfig.java @@ -1,4 +1,4 @@ -package com.synapse.account_service.config; +package com.synapse.account_service.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/account-service/src/main/java/com/synapse/account_service/config/PasswordEncoderConfig.java b/account-service/account-service/src/main/java/com/synapse/account_service/configuration/PasswordEncoderConfig.java similarity index 88% rename from account-service/src/main/java/com/synapse/account_service/config/PasswordEncoderConfig.java rename to account-service/account-service/src/main/java/com/synapse/account_service/configuration/PasswordEncoderConfig.java index 768e58d..873f2ae 100644 --- a/account-service/src/main/java/com/synapse/account_service/config/PasswordEncoderConfig.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/configuration/PasswordEncoderConfig.java @@ -1,4 +1,4 @@ -package com.synapse.account_service.config; +package com.synapse.account_service.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -11,4 +11,4 @@ public class PasswordEncoderConfig { public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } -} \ No newline at end of file +} diff --git a/account-service/src/main/java/com/synapse/account_service/config/ResourceServerConfig.java b/account-service/account-service/src/main/java/com/synapse/account_service/configuration/ResourceServerConfig.java similarity index 95% rename from account-service/src/main/java/com/synapse/account_service/config/ResourceServerConfig.java rename to account-service/account-service/src/main/java/com/synapse/account_service/configuration/ResourceServerConfig.java index 6da8f9b..097b968 100644 --- a/account-service/src/main/java/com/synapse/account_service/config/ResourceServerConfig.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/configuration/ResourceServerConfig.java @@ -1,6 +1,4 @@ -package com.synapse.account_service.config; - -import static org.springframework.security.config.Customizer.withDefaults; +package com.synapse.account_service.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -10,6 +8,8 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.SecurityFilterChain; +import static org.springframework.security.config.Customizer.withDefaults; + @Configuration(proxyBeanMethods = false) @EnableMethodSecurity public class ResourceServerConfig { @@ -25,4 +25,4 @@ public SecurityFilterChain securityResourceServerFilterChain(HttpSecurity http) .oauth2ResourceServer(oauth2 -> oauth2.jwt(withDefaults())); return http.build(); } -} \ No newline at end of file +} diff --git a/account-service/src/main/java/com/synapse/account_service/config/SecurityConfig.java b/account-service/account-service/src/main/java/com/synapse/account_service/configuration/SecurityConfig.java similarity index 94% rename from account-service/src/main/java/com/synapse/account_service/config/SecurityConfig.java rename to account-service/account-service/src/main/java/com/synapse/account_service/configuration/SecurityConfig.java index c26a096..f514a5a 100644 --- a/account-service/src/main/java/com/synapse/account_service/config/SecurityConfig.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/configuration/SecurityConfig.java @@ -1,4 +1,4 @@ -package com.synapse.account_service.config; +package com.synapse.account_service.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -38,6 +38,7 @@ public class SecurityConfig { private final ObjectMapper objectMapper; private final PasswordEncoder passwordEncoder; + @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtAuthenticationFilter jwtAuthenticationFilter) throws Exception { http.csrf(csrf -> csrf.disable()) @@ -62,16 +63,17 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtAuthenticat .addFilterAt(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) .exceptionHandling( - exceptionHandlingConfigurer -> exceptionHandlingConfigurer.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"))); + exceptionHandlingConfigurer -> exceptionHandlingConfigurer.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login")) + ); return http.build(); } @Bean - public DaoAuthenticationProvider authenticationProvider() { + public DaoAuthenticationProvider authenticationProvider(GrantedAuthoritiesMapper grantedAuthoritiesMapper) { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(customUserDetailsService); authProvider.setPasswordEncoder(passwordEncoder); - authProvider.setAuthoritiesMapper(customAuthorityMapper()); + authProvider.setAuthoritiesMapper(grantedAuthoritiesMapper); return authProvider; } diff --git a/account-service/src/main/java/com/synapse/account_service/controller/AccountController.java b/account-service/account-service/src/main/java/com/synapse/account_service/controller/AccountController.java similarity index 87% rename from account-service/src/main/java/com/synapse/account_service/controller/AccountController.java rename to account-service/account-service/src/main/java/com/synapse/account_service/controller/AccountController.java index 0e823e3..1509e4d 100644 --- a/account-service/src/main/java/com/synapse/account_service/controller/AccountController.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/controller/AccountController.java @@ -1,20 +1,20 @@ package com.synapse.account_service.controller; +import static org.springframework.http.HttpStatus.CREATED; + import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.synapse.account_service.dto.request.SignUpRequest; -import com.synapse.account_service.dto.response.SignUpResponse; import com.synapse.account_service.service.AccountService; +import com.synapse.account_service_api.dto.request.SignUpRequest; +import com.synapse.account_service_api.dto.response.SignUpResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import static org.springframework.http.HttpStatus.CREATED; - @RestController @RequestMapping("/api/accounts") @RequiredArgsConstructor diff --git a/account-service/src/main/java/com/synapse/account_service/controller/TokenReissueController.java b/account-service/account-service/src/main/java/com/synapse/account_service/controller/TokenReissueController.java similarity index 85% rename from account-service/src/main/java/com/synapse/account_service/controller/TokenReissueController.java rename to account-service/account-service/src/main/java/com/synapse/account_service/controller/TokenReissueController.java index 72050d8..5a17871 100644 --- a/account-service/src/main/java/com/synapse/account_service/controller/TokenReissueController.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/controller/TokenReissueController.java @@ -7,10 +7,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.synapse.account_service.dto.RefreshTokenResponse; -import com.synapse.account_service.dto.response.TokenResponse; import com.synapse.account_service.service.TokenManagementService; -import com.synapse.account_service.util.AuthResponseWriter; +import com.synapse.account_service.utils.AuthResponseWriter; +import com.synapse.account_service_api.dto.response.RefreshTokenResponse; +import com.synapse.account_service_api.dto.response.TokenResponse; import lombok.RequiredArgsConstructor; diff --git a/account-service/src/main/java/com/synapse/account_service/convert/DelegatingProviderUserConverter.java b/account-service/account-service/src/main/java/com/synapse/account_service/convert/DelegatingProviderUserConverter.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/convert/DelegatingProviderUserConverter.java rename to account-service/account-service/src/main/java/com/synapse/account_service/convert/DelegatingProviderUserConverter.java diff --git a/account-service/src/main/java/com/synapse/account_service/convert/OAuth2GoogleProviderUserConverter.java b/account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2GoogleProviderUserConverter.java similarity index 79% rename from account-service/src/main/java/com/synapse/account_service/convert/OAuth2GoogleProviderUserConverter.java rename to account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2GoogleProviderUserConverter.java index 91a2f96..7f24cb4 100644 --- a/account-service/src/main/java/com/synapse/account_service/convert/OAuth2GoogleProviderUserConverter.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2GoogleProviderUserConverter.java @@ -1,16 +1,16 @@ package com.synapse.account_service.convert; import com.synapse.account_service.domain.ProviderUser; -import com.synapse.account_service.domain.enums.OAuth2Config; +import com.synapse.account_service.domain.enums.OAuth2Type; import com.synapse.account_service.domain.socials.GoogleUser; -import com.synapse.account_service.util.OAuth2Utils; +import com.synapse.account_service.utils.OAuth2Utils; public final class OAuth2GoogleProviderUserConverter implements ProviderUserConverter { @Override public ProviderUser convert(ProviderUserRequest providerUserRequest) { - if (!providerUserRequest.clientRegistration().getRegistrationId().equals(OAuth2Config.SocialType.GOOGLE.getSocialName())) { + if (!providerUserRequest.clientRegistration().getRegistrationId().equals(OAuth2Type.GOOGLE.getSocialName())) { return null; } diff --git a/account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoOidcProviderUserConverter.java b/account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoOidcProviderUserConverter.java similarity index 83% rename from account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoOidcProviderUserConverter.java rename to account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoOidcProviderUserConverter.java index 8d65b5d..6f0a1e6 100644 --- a/account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoOidcProviderUserConverter.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoOidcProviderUserConverter.java @@ -3,16 +3,16 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser; import com.synapse.account_service.domain.ProviderUser; -import com.synapse.account_service.domain.enums.OAuth2Config; +import com.synapse.account_service.domain.enums.OAuth2Type; import com.synapse.account_service.domain.socials.KakaoOidcUser; -import com.synapse.account_service.util.OAuth2Utils; +import com.synapse.account_service.utils.OAuth2Utils; public final class OAuth2KakaoOidcProviderUserConverter implements ProviderUserConverter { @Override public ProviderUser convert(ProviderUserRequest providerUserRequest) { - if (!providerUserRequest.clientRegistration().getRegistrationId().equals(OAuth2Config.SocialType.KAKAO.getSocialName())) { + if (!providerUserRequest.clientRegistration().getRegistrationId().equals(OAuth2Type.KAKAO.getSocialName())) { return null; } diff --git a/account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoProviderUserConverter.java b/account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoProviderUserConverter.java similarity index 83% rename from account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoProviderUserConverter.java rename to account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoProviderUserConverter.java index 48f7e81..a5655db 100644 --- a/account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoProviderUserConverter.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2KakaoProviderUserConverter.java @@ -3,16 +3,16 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser; import com.synapse.account_service.domain.ProviderUser; -import com.synapse.account_service.domain.enums.OAuth2Config; +import com.synapse.account_service.domain.enums.OAuth2Type; import com.synapse.account_service.domain.socials.KakaoUser; -import com.synapse.account_service.util.OAuth2Utils; +import com.synapse.account_service.utils.OAuth2Utils; public final class OAuth2KakaoProviderUserConverter implements ProviderUserConverter { @Override public ProviderUser convert(ProviderUserRequest providerUserRequest) { - if (!providerUserRequest.clientRegistration().getRegistrationId().equals(OAuth2Config.SocialType.KAKAO.getSocialName())) { + if (!providerUserRequest.clientRegistration().getRegistrationId().equals(OAuth2Type.KAKAO.getSocialName())) { return null; } diff --git a/account-service/src/main/java/com/synapse/account_service/convert/OAuth2NaverProviderUserConverter.java b/account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2NaverProviderUserConverter.java similarity index 79% rename from account-service/src/main/java/com/synapse/account_service/convert/OAuth2NaverProviderUserConverter.java rename to account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2NaverProviderUserConverter.java index 11945a4..887b4ad 100644 --- a/account-service/src/main/java/com/synapse/account_service/convert/OAuth2NaverProviderUserConverter.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/convert/OAuth2NaverProviderUserConverter.java @@ -1,16 +1,16 @@ package com.synapse.account_service.convert; import com.synapse.account_service.domain.ProviderUser; -import com.synapse.account_service.domain.enums.OAuth2Config; +import com.synapse.account_service.domain.enums.OAuth2Type; import com.synapse.account_service.domain.socials.NaverUser; -import com.synapse.account_service.util.OAuth2Utils; +import com.synapse.account_service.utils.OAuth2Utils; public final class OAuth2NaverProviderUserConverter implements ProviderUserConverter { @Override public ProviderUser convert(ProviderUserRequest providerUserRequest) { - if (!providerUserRequest.clientRegistration().getRegistrationId().equals(OAuth2Config.SocialType.NAVER.getSocialName())) { + if (!providerUserRequest.clientRegistration().getRegistrationId().equals(OAuth2Type.NAVER.getSocialName())) { return null; } diff --git a/account-service/src/main/java/com/synapse/account_service/convert/ProviderUserConverter.java b/account-service/account-service/src/main/java/com/synapse/account_service/convert/ProviderUserConverter.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/convert/ProviderUserConverter.java rename to account-service/account-service/src/main/java/com/synapse/account_service/convert/ProviderUserConverter.java diff --git a/account-service/src/main/java/com/synapse/account_service/convert/ProviderUserRequest.java b/account-service/account-service/src/main/java/com/synapse/account_service/convert/ProviderUserRequest.java similarity index 90% rename from account-service/src/main/java/com/synapse/account_service/convert/ProviderUserRequest.java rename to account-service/account-service/src/main/java/com/synapse/account_service/convert/ProviderUserRequest.java index c5f2e3e..bdf0b5c 100644 --- a/account-service/src/main/java/com/synapse/account_service/convert/ProviderUserRequest.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/convert/ProviderUserRequest.java @@ -3,7 +3,7 @@ import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.core.user.OAuth2User; -import com.synapse.account_service.domain.Member; +import com.synapse.account_service.domain.entity.Member; public record ProviderUserRequest(ClientRegistration clientRegistration, OAuth2User oAuth2User, Member member) { public ProviderUserRequest(ClientRegistration clientRegistration, OAuth2User oAuth2User) { diff --git a/account-service/src/main/java/com/synapse/account_service/convert/UserDetailsProviderUserConverter.java b/account-service/account-service/src/main/java/com/synapse/account_service/convert/UserDetailsProviderUserConverter.java similarity index 93% rename from account-service/src/main/java/com/synapse/account_service/convert/UserDetailsProviderUserConverter.java rename to account-service/account-service/src/main/java/com/synapse/account_service/convert/UserDetailsProviderUserConverter.java index 2c2be19..44cdac5 100644 --- a/account-service/src/main/java/com/synapse/account_service/convert/UserDetailsProviderUserConverter.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/convert/UserDetailsProviderUserConverter.java @@ -1,7 +1,7 @@ package com.synapse.account_service.convert; -import com.synapse.account_service.domain.Member; import com.synapse.account_service.domain.ProviderUser; +import com.synapse.account_service.domain.entity.Member; import com.synapse.account_service.domain.forms.FormUser; public final class UserDetailsProviderUserConverter implements ProviderUserConverter { diff --git a/account-service/src/main/java/com/synapse/account_service/convert/authority/CustomAuthorityMapper.java b/account-service/account-service/src/main/java/com/synapse/account_service/convert/authority/CustomAuthorityMapper.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/convert/authority/CustomAuthorityMapper.java rename to account-service/account-service/src/main/java/com/synapse/account_service/convert/authority/CustomAuthorityMapper.java diff --git a/account-service/src/main/java/com/synapse/account_service/domain/Attributes.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/Attributes.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/domain/Attributes.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/Attributes.java diff --git a/account-service/src/main/java/com/synapse/account_service/domain/PrincipalUser.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/PrincipalUser.java similarity index 97% rename from account-service/src/main/java/com/synapse/account_service/domain/PrincipalUser.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/PrincipalUser.java index a978373..b1ee199 100644 --- a/account-service/src/main/java/com/synapse/account_service/domain/PrincipalUser.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/PrincipalUser.java @@ -9,6 +9,8 @@ import org.springframework.security.oauth2.core.oidc.OidcUserInfo; import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import com.synapse.account_service.domain.entity.Member; + public record PrincipalUser(ProviderUser providerUser, Member member) implements UserDetails, OidcUser { public PrincipalUser(ProviderUser providerUser) { diff --git a/account-service/src/main/java/com/synapse/account_service/domain/ProviderUser.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/ProviderUser.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/domain/ProviderUser.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/ProviderUser.java diff --git a/account-service/src/main/java/com/synapse/account_service/common/BaseEntity.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/common/BaseEntity.java similarity index 73% rename from account-service/src/main/java/com/synapse/account_service/common/BaseEntity.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/common/BaseEntity.java index 5e25426..1f3db80 100644 --- a/account-service/src/main/java/com/synapse/account_service/common/BaseEntity.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/common/BaseEntity.java @@ -1,10 +1,12 @@ -package com.synapse.account_service.common; +package com.synapse.account_service.domain.common; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; import lombok.Getter; @Getter diff --git a/account-service/src/main/java/com/synapse/account_service/common/BaseTimeEntity.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/common/BaseTimeEntity.java similarity index 74% rename from account-service/src/main/java/com/synapse/account_service/common/BaseTimeEntity.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/common/BaseTimeEntity.java index d6b36b2..91eb681 100644 --- a/account-service/src/main/java/com/synapse/account_service/common/BaseTimeEntity.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/common/BaseTimeEntity.java @@ -1,4 +1,4 @@ -package com.synapse.account_service.common; +package com.synapse.account_service.domain.common; import java.time.LocalDateTime; @@ -6,7 +6,9 @@ import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; import lombok.Getter; @Getter diff --git a/account-service/src/main/java/com/synapse/account_service/domain/Member.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/entity/Member.java similarity index 53% rename from account-service/src/main/java/com/synapse/account_service/domain/Member.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/entity/Member.java index 6b719a8..ece378c 100644 --- a/account-service/src/main/java/com/synapse/account_service/domain/Member.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/entity/Member.java @@ -1,26 +1,27 @@ -package com.synapse.account_service.domain; +package com.synapse.account_service.domain.entity; import java.util.UUID; import org.springframework.security.crypto.password.PasswordEncoder; -import com.synapse.account_service.common.BaseEntity; +import com.synapse.account_service.domain.common.BaseEntity; import com.synapse.account_service.domain.enums.MemberRole; +import com.synapse.account_service_api.event.MemberDomainEvent; +import com.synapse.account_service_api.event.MemberRegisteredEvent; +import com.synapse.account_service_api.event.SocialAccountLinkedEvent; +import io.eventuate.tram.events.aggregates.ResultWithDomainEvents; import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "members") public class Member extends BaseEntity { + @Id - @GeneratedValue(strategy = GenerationType.UUID) - @Column(name = "member_id") + @Column(name = "member_id", columnDefinition = "uuid") private UUID id; @Column(name = "username", nullable = false) @@ -43,7 +44,7 @@ public class Member extends BaseEntity { @Enumerated(EnumType.STRING) @Column(nullable = false) - private MemberRole role; + private MemberRole role = MemberRole.USER; @OneToOne(mappedBy = "member", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) private Subscription subscription; @@ -60,6 +61,39 @@ public Member(UUID id, String username, String password, String email, String pr this.role = role; } + public static ResultWithDomainEvents register( + UUID userId, String email, String username, String encodedPassword, String provider, String registrationId + ) { + Member member = Member.builder() + .id(userId) + .email(email) + .username(username) + .password(encodedPassword) + .provider(provider) + .registrationId(registrationId) + .role(MemberRole.USER) + .build(); + + MemberRegisteredEvent event = new MemberRegisteredEvent(userId, email, username); + + return new ResultWithDomainEvents<>(member, event); + } + + public static ResultWithDomainEvents linkSocialAccount( + UUID userId, String provider, String registrationId + ) { + Member member = Member.builder() + .id(userId) + .provider(provider) + .registrationId(registrationId) + .role(MemberRole.USER) + .build(); + + SocialAccountLinkedEvent event = new SocialAccountLinkedEvent(userId, provider, registrationId); + + return new ResultWithDomainEvents<>(member, event); + } + public void setSubscription(Subscription subscription) { this.subscription = subscription; if (subscription != null) { diff --git a/account-service/src/main/java/com/synapse/account_service/domain/RefreshToken.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/entity/RefreshToken.java similarity index 73% rename from account-service/src/main/java/com/synapse/account_service/domain/RefreshToken.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/entity/RefreshToken.java index 4c516e1..61e34eb 100644 --- a/account-service/src/main/java/com/synapse/account_service/domain/RefreshToken.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/entity/RefreshToken.java @@ -1,14 +1,11 @@ -package com.synapse.account_service.domain; +package com.synapse.account_service.domain.entity; import java.util.UUID; -import com.synapse.account_service.common.BaseTimeEntity; +import com.synapse.account_service.domain.common.BaseTimeEntity; import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @Entity @Getter diff --git a/account-service/src/main/java/com/synapse/account_service/domain/Subscription.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/entity/Subscription.java similarity index 83% rename from account-service/src/main/java/com/synapse/account_service/domain/Subscription.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/entity/Subscription.java index d1abab0..5dbe665 100644 --- a/account-service/src/main/java/com/synapse/account_service/domain/Subscription.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/entity/Subscription.java @@ -1,13 +1,16 @@ -package com.synapse.account_service.domain; +package com.synapse.account_service.domain.entity; import java.time.ZonedDateTime; import java.util.UUID; -import com.synapse.account_service.common.BaseTimeEntity; +import com.synapse.account_service.domain.common.BaseTimeEntity; import com.synapse.account_service.domain.enums.SubscriptionTier; import jakarta.persistence.*; -import lombok.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @Entity diff --git a/account-service/src/main/java/com/synapse/account_service/domain/enums/MemberRole.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/enums/MemberRole.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/domain/enums/MemberRole.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/enums/MemberRole.java diff --git a/account-service/account-service/src/main/java/com/synapse/account_service/domain/enums/OAuth2Type.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/enums/OAuth2Type.java new file mode 100644 index 0000000..108bacb --- /dev/null +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/enums/OAuth2Type.java @@ -0,0 +1,18 @@ +package com.synapse.account_service.domain.enums; + +public enum OAuth2Type { + GOOGLE("google"), + KAKAO("kakao"), + NAVER("naver") + ; + + private final String socialName; + + private OAuth2Type(String socialName) { + this.socialName = socialName; + } + + public String getSocialName() { + return socialName; + } +} diff --git a/account-service/src/main/java/com/synapse/account_service/domain/enums/SubscriptionTier.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/enums/SubscriptionTier.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/domain/enums/SubscriptionTier.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/enums/SubscriptionTier.java diff --git a/account-service/src/main/java/com/synapse/account_service/domain/forms/FormUser.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/forms/FormUser.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/domain/forms/FormUser.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/forms/FormUser.java diff --git a/account-service/src/main/java/com/synapse/account_service/repository/MemberRepository.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/repository/MemberRepository.java similarity index 90% rename from account-service/src/main/java/com/synapse/account_service/repository/MemberRepository.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/repository/MemberRepository.java index 0a197a7..f4ba06d 100644 --- a/account-service/src/main/java/com/synapse/account_service/repository/MemberRepository.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/repository/MemberRepository.java @@ -1,4 +1,4 @@ -package com.synapse.account_service.repository; +package com.synapse.account_service.domain.repository; import java.util.Optional; import java.util.UUID; @@ -7,7 +7,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import com.synapse.account_service.domain.Member; +import com.synapse.account_service.domain.entity.Member; public interface MemberRepository extends JpaRepository { Optional findByEmail(String email); diff --git a/account-service/src/main/java/com/synapse/account_service/repository/RefreshTokenRepository.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/repository/RefreshTokenRepository.java similarity index 59% rename from account-service/src/main/java/com/synapse/account_service/repository/RefreshTokenRepository.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/repository/RefreshTokenRepository.java index a8e0536..afc9c30 100644 --- a/account-service/src/main/java/com/synapse/account_service/repository/RefreshTokenRepository.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/repository/RefreshTokenRepository.java @@ -1,10 +1,10 @@ -package com.synapse.account_service.repository; +package com.synapse.account_service.domain.repository; import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; -import com.synapse.account_service.domain.RefreshToken; +import com.synapse.account_service.domain.entity.RefreshToken; public interface RefreshTokenRepository extends JpaRepository { diff --git a/account-service/src/main/java/com/synapse/account_service/repository/SubscriptionRepository.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/repository/SubscriptionRepository.java similarity index 58% rename from account-service/src/main/java/com/synapse/account_service/repository/SubscriptionRepository.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/repository/SubscriptionRepository.java index 7a444c0..7660784 100644 --- a/account-service/src/main/java/com/synapse/account_service/repository/SubscriptionRepository.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/repository/SubscriptionRepository.java @@ -1,10 +1,11 @@ -package com.synapse.account_service.repository; +package com.synapse.account_service.domain.repository; import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; -import com.synapse.account_service.domain.Subscription; +import com.synapse.account_service.domain.entity.Subscription; public interface SubscriptionRepository extends JpaRepository { + } diff --git a/account-service/src/main/java/com/synapse/account_service/domain/socials/GoogleUser.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/GoogleUser.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/domain/socials/GoogleUser.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/GoogleUser.java diff --git a/account-service/src/main/java/com/synapse/account_service/domain/socials/KakaoOidcUser.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/KakaoOidcUser.java similarity index 99% rename from account-service/src/main/java/com/synapse/account_service/domain/socials/KakaoOidcUser.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/KakaoOidcUser.java index 1304d5b..3bb3832 100644 --- a/account-service/src/main/java/com/synapse/account_service/domain/socials/KakaoOidcUser.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/KakaoOidcUser.java @@ -25,4 +25,4 @@ public String getUsername() { public String getPicture() { return (String) getAttributes().get("profile_image_url"); } -} \ No newline at end of file +} diff --git a/account-service/src/main/java/com/synapse/account_service/domain/socials/KakaoUser.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/KakaoUser.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/domain/socials/KakaoUser.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/KakaoUser.java diff --git a/account-service/src/main/java/com/synapse/account_service/domain/socials/NaverUser.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/NaverUser.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/domain/socials/NaverUser.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/NaverUser.java diff --git a/account-service/src/main/java/com/synapse/account_service/domain/socials/OAuth2ProviderUser.java b/account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/OAuth2ProviderUser.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/domain/socials/OAuth2ProviderUser.java rename to account-service/account-service/src/main/java/com/synapse/account_service/domain/socials/OAuth2ProviderUser.java diff --git a/account-service/account-service/src/main/java/com/synapse/account_service/eventuate/configuration/EventuateConfig.java b/account-service/account-service/src/main/java/com/synapse/account_service/eventuate/configuration/EventuateConfig.java new file mode 100644 index 0000000..802a896 --- /dev/null +++ b/account-service/account-service/src/main/java/com/synapse/account_service/eventuate/configuration/EventuateConfig.java @@ -0,0 +1,19 @@ +package com.synapse.account_service.eventuate.configuration; + +import io.eventuate.tram.events.publisher.DomainEventPublisher; +import io.eventuate.tram.spring.events.publisher.TramEventsPublisherConfiguration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +// import com.synapse.account_service.eventuate.publisher.MemberDomainEventPublisher; + +// @Configuration +// @Import(TramEventsPublisherConfiguration.class) +// public class EventuateConfig { +// @Bean +// public MemberDomainEventPublisher memberDomainEventPublisher(DomainEventPublisher eventPublisher) { +// return new MemberDomainEventPublisher(eventPublisher); +// } +// } diff --git a/account-service/account-service/src/main/java/com/synapse/account_service/eventuate/publisher/MemberDomainEventPublisher.java b/account-service/account-service/src/main/java/com/synapse/account_service/eventuate/publisher/MemberDomainEventPublisher.java new file mode 100644 index 0000000..8f4ceea --- /dev/null +++ b/account-service/account-service/src/main/java/com/synapse/account_service/eventuate/publisher/MemberDomainEventPublisher.java @@ -0,0 +1,14 @@ +package com.synapse.account_service.eventuate.publisher; + +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service_api.event.MemberDomainEvent; + +import io.eventuate.tram.events.aggregates.AbstractAggregateDomainEventPublisher; +import io.eventuate.tram.events.publisher.DomainEventPublisher; + +// public class MemberDomainEventPublisher extends AbstractAggregateDomainEventPublisher { + +// public MemberDomainEventPublisher(DomainEventPublisher eventPublisher) { +// super(eventPublisher, Member.class, Member::getId); +// } +// } diff --git a/account-service/src/main/java/com/synapse/account_service/exception/AccountServiceException.java b/account-service/account-service/src/main/java/com/synapse/account_service/exception/AccountServiceException.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/exception/AccountServiceException.java rename to account-service/account-service/src/main/java/com/synapse/account_service/exception/AccountServiceException.java diff --git a/account-service/src/main/java/com/synapse/account_service/exception/DuplicatedException.java b/account-service/account-service/src/main/java/com/synapse/account_service/exception/DuplicatedException.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/exception/DuplicatedException.java rename to account-service/account-service/src/main/java/com/synapse/account_service/exception/DuplicatedException.java diff --git a/account-service/src/main/java/com/synapse/account_service/exception/dto/ExceptionResponse.java b/account-service/account-service/src/main/java/com/synapse/account_service/exception/ExceptionResponse.java similarity index 68% rename from account-service/src/main/java/com/synapse/account_service/exception/dto/ExceptionResponse.java rename to account-service/account-service/src/main/java/com/synapse/account_service/exception/ExceptionResponse.java index 0337fe0..48a61bb 100644 --- a/account-service/src/main/java/com/synapse/account_service/exception/dto/ExceptionResponse.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/exception/ExceptionResponse.java @@ -1,7 +1,4 @@ -package com.synapse.account_service.exception.dto; - -import com.synapse.account_service.exception.AccountServiceException; -import com.synapse.account_service.exception.ExceptionType; +package com.synapse.account_service.exception; public record ExceptionResponse( String code, @@ -15,3 +12,4 @@ public static ExceptionResponse from(ExceptionType exceptionType) { return new ExceptionResponse(exceptionType.getCode(), exceptionType.getMessage()); } } + diff --git a/account-service/src/main/java/com/synapse/account_service/exception/ExceptionType.java b/account-service/account-service/src/main/java/com/synapse/account_service/exception/ExceptionType.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/exception/ExceptionType.java rename to account-service/account-service/src/main/java/com/synapse/account_service/exception/ExceptionType.java index 5c6ca01..968bae4 100644 --- a/account-service/src/main/java/com/synapse/account_service/exception/ExceptionType.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/exception/ExceptionType.java @@ -1,16 +1,16 @@ package com.synapse.account_service.exception; +import static org.springframework.http.HttpStatus.CONFLICT; +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; +import static org.springframework.http.HttpStatus.NOT_FOUND; +import static org.springframework.http.HttpStatus.UNAUTHORIZED; + import org.springframework.http.HttpStatus; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; -import static org.springframework.http.HttpStatus.CONFLICT; -import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; -import static org.springframework.http.HttpStatus.NOT_FOUND; -import static org.springframework.http.HttpStatus.UNAUTHORIZED; - @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum ExceptionType { diff --git a/account-service/src/main/java/com/synapse/account_service/exception/GlobalExceptionHandler.java b/account-service/account-service/src/main/java/com/synapse/account_service/exception/GlobalExceptionHandler.java similarity index 97% rename from account-service/src/main/java/com/synapse/account_service/exception/GlobalExceptionHandler.java rename to account-service/account-service/src/main/java/com/synapse/account_service/exception/GlobalExceptionHandler.java index ce28acf..6c16bde 100644 --- a/account-service/src/main/java/com/synapse/account_service/exception/GlobalExceptionHandler.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/exception/GlobalExceptionHandler.java @@ -7,8 +7,6 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; -import com.synapse.account_service.exception.dto.ExceptionResponse; - import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; diff --git a/account-service/src/main/java/com/synapse/account_service/exception/JWTTokenExpiredException.java b/account-service/account-service/src/main/java/com/synapse/account_service/exception/JWTTokenExpiredException.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/exception/JWTTokenExpiredException.java rename to account-service/account-service/src/main/java/com/synapse/account_service/exception/JWTTokenExpiredException.java diff --git a/account-service/src/main/java/com/synapse/account_service/exception/JWTValidationException.java b/account-service/account-service/src/main/java/com/synapse/account_service/exception/JWTValidationException.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/exception/JWTValidationException.java rename to account-service/account-service/src/main/java/com/synapse/account_service/exception/JWTValidationException.java diff --git a/account-service/src/main/java/com/synapse/account_service/exception/NotFoundException.java b/account-service/account-service/src/main/java/com/synapse/account_service/exception/NotFoundException.java similarity index 100% rename from account-service/src/main/java/com/synapse/account_service/exception/NotFoundException.java rename to account-service/account-service/src/main/java/com/synapse/account_service/exception/NotFoundException.java diff --git a/account-service/src/main/java/com/synapse/account_service/filter/JwtAuthenticationFilter.java b/account-service/account-service/src/main/java/com/synapse/account_service/filter/JwtAuthenticationFilter.java similarity index 96% rename from account-service/src/main/java/com/synapse/account_service/filter/JwtAuthenticationFilter.java rename to account-service/account-service/src/main/java/com/synapse/account_service/filter/JwtAuthenticationFilter.java index 46ccc48..7314c11 100644 --- a/account-service/src/main/java/com/synapse/account_service/filter/JwtAuthenticationFilter.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/filter/JwtAuthenticationFilter.java @@ -10,7 +10,7 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import com.fasterxml.jackson.databind.ObjectMapper; -import com.synapse.account_service.dto.request.LoginRequest; +import com.synapse.account_service_api.dto.request.LoginRequest; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; diff --git a/account-service/src/main/java/com/synapse/account_service/service/AbstractOAuth2UserService.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/AbstractOAuth2UserService.java similarity index 90% rename from account-service/src/main/java/com/synapse/account_service/service/AbstractOAuth2UserService.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/AbstractOAuth2UserService.java index d07fc94..62cac61 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/AbstractOAuth2UserService.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/AbstractOAuth2UserService.java @@ -7,9 +7,9 @@ import com.synapse.account_service.convert.ProviderUserConverter; import com.synapse.account_service.convert.ProviderUserRequest; -import com.synapse.account_service.domain.Member; import com.synapse.account_service.domain.ProviderUser; -import com.synapse.account_service.repository.MemberRepository; +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service.domain.repository.MemberRepository; @Service public abstract class AbstractOAuth2UserService { diff --git a/account-service/src/main/java/com/synapse/account_service/service/AccountService.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/AccountService.java similarity index 57% rename from account-service/src/main/java/com/synapse/account_service/service/AccountService.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/AccountService.java index 1cdf086..9732e94 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/AccountService.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/AccountService.java @@ -3,21 +3,24 @@ import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.UUID; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.synapse.account_service.domain.Member; -import com.synapse.account_service.domain.Subscription; -import com.synapse.account_service.domain.enums.MemberRole; +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service.domain.entity.Subscription; import com.synapse.account_service.domain.enums.SubscriptionTier; -import com.synapse.account_service.dto.request.SignUpRequest; -import com.synapse.account_service.dto.response.SignUpResponse; +import com.synapse.account_service.domain.repository.MemberRepository; +// import com.synapse.account_service.eventuate.publisher.MemberDomainEventPublisher; import com.synapse.account_service.exception.DuplicatedException; import com.synapse.account_service.exception.ExceptionType; -import com.synapse.account_service.repository.MemberRepository; +import com.synapse.account_service_api.dto.request.SignUpRequest; +import com.synapse.account_service_api.dto.response.SignUpResponse; +import com.synapse.account_service_api.event.MemberDomainEvent; +import io.eventuate.tram.events.aggregates.ResultWithDomainEvents; import lombok.RequiredArgsConstructor; @Transactional(readOnly = true) @@ -29,13 +32,19 @@ public class AccountService { private final MemberRepository memberRepository; private final PasswordEncoder passwordEncoder; + // private final MemberDomainEventPublisher memberDomainEventPublisher; @Transactional public SignUpResponse registerMember(SignUpRequest request) { String encodedPassword = passwordEncoder.encode(request.password()); - Member savedMember = createAndSaveNewMember( + memberRepository.findByUsernameAndEmail(request.username(), request.email()).ifPresent(m -> { + throw new DuplicatedException(ExceptionType.DUPLICATED_USERNAME_AND_EMAIL); + }); + + ResultWithDomainEvents memberAndEvents = Member.register( + UUID.randomUUID(), request.email(), request.username(), encodedPassword, @@ -43,26 +52,20 @@ public SignUpResponse registerMember(SignUpRequest request) { DEFAULT_REGISTRATION_ID ); - return SignUpResponse.from(savedMember); - } + Member memberResult = memberAndEvents.result; - private Member createAndSaveNewMember(String email, String username, String password, String provider, String registrationId) { - // 중복 검사 - memberRepository.findByUsernameAndEmail(username, email).ifPresent(m -> { - throw new DuplicatedException(ExceptionType.DUPLICATED_USERNAME_AND_EMAIL); - }); + createAndSetDefaultSubscription(memberResult); - Member member = Member.builder() - .email(email) - .password(password) - .username(username) - .role(MemberRole.USER) - .provider(provider) - .registrationId(registrationId) - .build(); - - createAndSetDefaultSubscription(member); // 기본 구독 설정 - return memberRepository.save(member); + memberRepository.save(memberResult); + + // memberDomainEventPublisher.publish(memberResult, memberAndEvents.events); + + return new SignUpResponse( + memberResult.getId(), + memberResult.getEmail(), + memberResult.getUsername(), + memberResult.getRole().name() + ); } private void createAndSetDefaultSubscription(Member member) { diff --git a/account-service/src/main/java/com/synapse/account_service/service/CustomOAuth2UserService.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/CustomOAuth2UserService.java similarity index 97% rename from account-service/src/main/java/com/synapse/account_service/service/CustomOAuth2UserService.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/CustomOAuth2UserService.java index 98bf8ff..ebabcff 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/CustomOAuth2UserService.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/CustomOAuth2UserService.java @@ -9,9 +9,9 @@ import org.springframework.stereotype.Service; import com.synapse.account_service.convert.ProviderUserRequest; -import com.synapse.account_service.domain.Member; import com.synapse.account_service.domain.PrincipalUser; import com.synapse.account_service.domain.ProviderUser; +import com.synapse.account_service.domain.entity.Member; @Service public class CustomOAuth2UserService extends AbstractOAuth2UserService implements OAuth2UserService{ diff --git a/account-service/src/main/java/com/synapse/account_service/service/CustomOidcUserService.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/CustomOidcUserService.java similarity index 97% rename from account-service/src/main/java/com/synapse/account_service/service/CustomOidcUserService.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/CustomOidcUserService.java index 087b3cb..71bee6b 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/CustomOidcUserService.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/CustomOidcUserService.java @@ -9,9 +9,9 @@ import org.springframework.stereotype.Service; import com.synapse.account_service.convert.ProviderUserRequest; -import com.synapse.account_service.domain.Member; import com.synapse.account_service.domain.PrincipalUser; import com.synapse.account_service.domain.ProviderUser; +import com.synapse.account_service.domain.entity.Member; @Service public class CustomOidcUserService extends AbstractOAuth2UserService implements OAuth2UserService { @@ -48,5 +48,4 @@ public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2Authenticatio return new PrincipalUser(providerUser, member); } - } diff --git a/account-service/src/main/java/com/synapse/account_service/service/CustomUserDetailsService.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/CustomUserDetailsService.java similarity index 95% rename from account-service/src/main/java/com/synapse/account_service/service/CustomUserDetailsService.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/CustomUserDetailsService.java index f28daa1..bff117b 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/CustomUserDetailsService.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/CustomUserDetailsService.java @@ -6,9 +6,9 @@ import org.springframework.stereotype.Service; import com.synapse.account_service.convert.ProviderUserRequest; -import com.synapse.account_service.domain.Member; import com.synapse.account_service.domain.PrincipalUser; import com.synapse.account_service.domain.ProviderUser; +import com.synapse.account_service.domain.entity.Member; import com.synapse.account_service.exception.ExceptionType; import com.synapse.account_service.exception.NotFoundException; diff --git a/account-service/src/main/java/com/synapse/account_service/service/JwtTokenService.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/JwtTokenService.java similarity index 94% rename from account-service/src/main/java/com/synapse/account_service/service/JwtTokenService.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/JwtTokenService.java index 57b19e3..acb03db 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/JwtTokenService.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/JwtTokenService.java @@ -9,11 +9,11 @@ import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.exceptions.TokenExpiredException; import com.auth0.jwt.interfaces.DecodedJWT; -import com.synapse.account_service.dto.TokenResult; -import com.synapse.account_service.dto.response.TokenResponse; import com.synapse.account_service.exception.ExceptionType; import com.synapse.account_service.exception.JWTTokenExpiredException; import com.synapse.account_service.exception.JWTValidationException; +import com.synapse.account_service_api.dto.TokenResult; +import com.synapse.account_service_api.dto.response.TokenResponse; import lombok.RequiredArgsConstructor; @@ -52,4 +52,4 @@ public UUID getMemberIdFrom(String token) { public String createExpiredTokenForTest(String subject) { return jwtTokenTemplate.createExpiredTokenForTest(subject); } -} +} diff --git a/account-service/src/main/java/com/synapse/account_service/service/JwtTokenTemplate.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/JwtTokenTemplate.java similarity index 97% rename from account-service/src/main/java/com/synapse/account_service/service/JwtTokenTemplate.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/JwtTokenTemplate.java index 3fd0ef2..103c911 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/JwtTokenTemplate.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/JwtTokenTemplate.java @@ -13,7 +13,7 @@ import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.interfaces.DecodedJWT; -import com.synapse.account_service.dto.TokenResult; +import com.synapse.account_service_api.dto.TokenResult; @Component public class JwtTokenTemplate { diff --git a/account-service/src/main/java/com/synapse/account_service/service/MemberRegistrationService.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/MemberRegistrationService.java similarity index 67% rename from account-service/src/main/java/com/synapse/account_service/service/MemberRegistrationService.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/MemberRegistrationService.java index 5664c5b..f884510 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/MemberRegistrationService.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/MemberRegistrationService.java @@ -4,17 +4,20 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Optional; +import java.util.UUID; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.synapse.account_service.domain.Member; import com.synapse.account_service.domain.ProviderUser; -import com.synapse.account_service.domain.Subscription; -import com.synapse.account_service.domain.enums.MemberRole; +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service.domain.entity.Subscription; import com.synapse.account_service.domain.enums.SubscriptionTier; -import com.synapse.account_service.repository.MemberRepository; +import com.synapse.account_service.domain.repository.MemberRepository; +// import com.synapse.account_service.eventuate.publisher.MemberDomainEventPublisher; +import com.synapse.account_service_api.event.MemberDomainEvent; +import io.eventuate.tram.events.aggregates.ResultWithDomainEvents; import lombok.RequiredArgsConstructor; @Service @@ -23,6 +26,7 @@ public class MemberRegistrationService { private final MemberRepository memberRepository; + // private final MemberDomainEventPublisher memberDomainEventPublisher; @Transactional public Member registerOauthUser(String provider, ProviderUser providerUser) { @@ -38,28 +42,24 @@ public Member registerOauthUser(String provider, ProviderUser providerUser) { return existingMember; } - // 신규 회원 생성 - return createAndSaveNewMember( + ResultWithDomainEvents memberAndEvents = Member.register( + UUID.randomUUID(), providerUser.getEmail(), providerUser.getUsername(), providerUser.getPassword(), provider, providerUser.getId() ); - } - private Member createAndSaveNewMember(String email, String username, String password, String provider, String registrationId) { - Member member = Member.builder() - .email(email) - .password(password) - .username(username) - .role(MemberRole.USER) - .provider(provider) - .registrationId(registrationId) - .build(); - - createAndSetDefaultSubscription(member); // 기본 구독 설정 - return memberRepository.save(member); + Member memberResult = memberAndEvents.result; + + createAndSetDefaultSubscription(memberResult); + + memberRepository.save(memberResult); + + // memberDomainEventPublisher.publish(memberResult, memberAndEvents.events); + + return memberResult; } private void createAndSetDefaultSubscription(Member member) { diff --git a/account-service/src/main/java/com/synapse/account_service/service/TokenManagementService.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/TokenManagementService.java similarity index 85% rename from account-service/src/main/java/com/synapse/account_service/service/TokenManagementService.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/TokenManagementService.java index 2a23bc4..bd648f6 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/TokenManagementService.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/TokenManagementService.java @@ -5,15 +5,15 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.synapse.account_service.domain.Member; -import com.synapse.account_service.domain.RefreshToken; -import com.synapse.account_service.dto.TokenResult; -import com.synapse.account_service.dto.response.TokenResponse; +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service.domain.entity.RefreshToken; +import com.synapse.account_service.domain.repository.MemberRepository; +import com.synapse.account_service.domain.repository.RefreshTokenRepository; import com.synapse.account_service.exception.ExceptionType; import com.synapse.account_service.exception.JWTValidationException; import com.synapse.account_service.exception.NotFoundException; -import com.synapse.account_service.repository.MemberRepository; -import com.synapse.account_service.repository.RefreshTokenRepository; +import com.synapse.account_service_api.dto.TokenResult; +import com.synapse.account_service_api.dto.response.TokenResponse; import lombok.RequiredArgsConstructor; diff --git a/account-service/src/main/java/com/synapse/account_service/service/handler/LoginFailureHandler.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/handler/LoginFailureHandler.java similarity index 95% rename from account-service/src/main/java/com/synapse/account_service/service/handler/LoginFailureHandler.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/handler/LoginFailureHandler.java index 54d035b..b43df9c 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/handler/LoginFailureHandler.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/handler/LoginFailureHandler.java @@ -1,5 +1,7 @@ package com.synapse.account_service.service.handler; +import static com.synapse.account_service.exception.ExceptionType.FAIL_LOGIN; + import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -9,15 +11,13 @@ import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; -import com.synapse.account_service.exception.dto.ExceptionResponse; +import com.synapse.account_service.exception.ExceptionResponse; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; -import static com.synapse.account_service.exception.ExceptionType.FAIL_LOGIN; - @RequiredArgsConstructor @Component public class LoginFailureHandler implements AuthenticationFailureHandler { diff --git a/account-service/src/main/java/com/synapse/account_service/service/handler/LoginSuccessHandler.java b/account-service/account-service/src/main/java/com/synapse/account_service/service/handler/LoginSuccessHandler.java similarity index 94% rename from account-service/src/main/java/com/synapse/account_service/service/handler/LoginSuccessHandler.java rename to account-service/account-service/src/main/java/com/synapse/account_service/service/handler/LoginSuccessHandler.java index 107b872..c4f17cb 100644 --- a/account-service/src/main/java/com/synapse/account_service/service/handler/LoginSuccessHandler.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/service/handler/LoginSuccessHandler.java @@ -10,10 +10,10 @@ import org.springframework.stereotype.Component; import com.synapse.account_service.domain.PrincipalUser; -import com.synapse.account_service.dto.response.TokenResponse; import com.synapse.account_service.service.JwtTokenService; import com.synapse.account_service.service.TokenManagementService; -import com.synapse.account_service.util.AuthResponseWriter; +import com.synapse.account_service.utils.AuthResponseWriter; +import com.synapse.account_service_api.dto.response.TokenResponse; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -45,5 +45,4 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo authResponseWriter.writeSuccessResponse(response, tokenResponse); } - } diff --git a/account-service/src/main/java/com/synapse/account_service/util/AuthResponseWriter.java b/account-service/account-service/src/main/java/com/synapse/account_service/utils/AuthResponseWriter.java similarity index 89% rename from account-service/src/main/java/com/synapse/account_service/util/AuthResponseWriter.java rename to account-service/account-service/src/main/java/com/synapse/account_service/utils/AuthResponseWriter.java index 40e05f0..e9b2941 100644 --- a/account-service/src/main/java/com/synapse/account_service/util/AuthResponseWriter.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/utils/AuthResponseWriter.java @@ -1,4 +1,4 @@ -package com.synapse.account_service.util; +package com.synapse.account_service.utils; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -11,9 +11,9 @@ import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; -import com.synapse.account_service.dto.AccessTokenResponse; -import com.synapse.account_service.dto.RefreshTokenResponse; -import com.synapse.account_service.dto.response.TokenResponse; +import com.synapse.account_service_api.dto.response.AccessTokenResponse; +import com.synapse.account_service_api.dto.response.RefreshTokenResponse; +import com.synapse.account_service_api.dto.response.TokenResponse; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; diff --git a/account-service/src/main/java/com/synapse/account_service/util/OAuth2Utils.java b/account-service/account-service/src/main/java/com/synapse/account_service/utils/OAuth2Utils.java similarity index 96% rename from account-service/src/main/java/com/synapse/account_service/util/OAuth2Utils.java rename to account-service/account-service/src/main/java/com/synapse/account_service/utils/OAuth2Utils.java index 377029f..1725417 100644 --- a/account-service/src/main/java/com/synapse/account_service/util/OAuth2Utils.java +++ b/account-service/account-service/src/main/java/com/synapse/account_service/utils/OAuth2Utils.java @@ -1,4 +1,4 @@ -package com.synapse.account_service.util; +package com.synapse.account_service.utils; import java.util.Map; diff --git a/account-service/account-service/src/main/resources/application-local.yml b/account-service/account-service/src/main/resources/application-local.yml new file mode 100644 index 0000000..a5583f6 --- /dev/null +++ b/account-service/account-service/src/main/resources/application-local.yml @@ -0,0 +1,84 @@ +spring: + datasource: + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://${local-db.postgres.host}:${local-db.postgres.port}/${local-db.postgres.name} + username: ${local-db.postgres.username} + password: ${local-db.postgres.password} + + jpa: + properties: + hibernate: + format: + sql: true + highlight: + sql: true + hbm2ddl: + auto: create + dialect: org.hibernate.dialect.PostgreSQLDialect + open-in-view: false + show-sql: true + +eventuatelocal: + kafka: + bootstrap: + servers: localhost:9092 + zookeeper: + connection: + string: localhost:2181 + +eventuate: + outbox: + id: 1 + database: + schema: eventuate + tram: + saga: + participant: + enabled: true + messaging: + enabled: true + producer: + enabled: true + properties: + max.request.size: 10485760 + auto.create.topics.enable: true + acks: all + retries: 5 + enable.idempotence: true + max.in.flight.requests.per.connection: 5 + key-serializer: org.apache.kafka.common.serialization.StringSerializer + value-serializer: org.apache.kafka.common.serialization.StringSerializer + consumer: + properties: + max.poll.records: 100 + max.poll.interval.ms: 300000 + session.timeout.ms: 30000 + heartbeat.interval.ms: 10000 + auto.commit.interval.ms: 100 + partition.assignment.strategy: org.apache.kafka.clients.consumer.RoundRobinAssignor + group-id: accountService + auto-offset-reset: latest + enable-auto-commit: true + destinations: + accountService: + destination: accountService + dlq: + destination: accountService-dlq + kafka: + message: + serializer: io.eventuate.messaging.kafka.basic.consumer.DefaultKafkaMessageSerializer + deserializer: io.eventuate.messaging.kafka.basic.consumer.DefaultKafkaMessageDeserializer + properties: + security.protocol: PLAINTEXT + events: + subscriber: + enabled: true + id: accountService + group-id: accountService + +logging: + level: + org: + hibernate: + type: info + level: info diff --git a/account-service/src/main/resources/application.yml b/account-service/account-service/src/main/resources/application.yml similarity index 100% rename from account-service/src/main/resources/application.yml rename to account-service/account-service/src/main/resources/application.yml diff --git a/account-service/src/test/java/com/synapse/account_service/support/ApplicationIntegrationTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/TestConfig.java similarity index 64% rename from account-service/src/test/java/com/synapse/account_service/support/ApplicationIntegrationTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/TestConfig.java index b527bc7..f15a5c0 100644 --- a/account-service/src/test/java/com/synapse/account_service/support/ApplicationIntegrationTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/TestConfig.java @@ -1,12 +1,14 @@ -package com.synapse.account_service.support; +package com.synapse.account_service; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.transaction.annotation.Transactional; - +@Transactional @ActiveProfiles("test") -public abstract class ApplicationIntegrationTest { - +@SpringBootTest(classes = AccountServiceConfig.class) +@AutoConfigureMockMvc +public class TestConfig { + } diff --git a/account-service/src/test/java/com/synapse/account_service/controller/AccountControllerTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/controller/AccountControllerTest.java similarity index 85% rename from account-service/src/test/java/com/synapse/account_service/controller/AccountControllerTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/controller/AccountControllerTest.java index 25dc8b2..96a40d4 100644 --- a/account-service/src/test/java/com/synapse/account_service/controller/AccountControllerTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/controller/AccountControllerTest.java @@ -2,35 +2,30 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; - import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.UUID; -import org.springframework.http.MediaType; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.context.annotation.Import; +import org.springframework.http.MediaType; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import com.fasterxml.jackson.databind.ObjectMapper; -import com.synapse.account_service.dto.request.SignUpRequest; -import com.synapse.account_service.dto.response.SignUpResponse; -import com.synapse.account_service.exception.ExceptionType; -import com.synapse.account_service.exception.GlobalExceptionHandler; +import com.synapse.account_service.TestConfig; import com.synapse.account_service.exception.DuplicatedException; +import com.synapse.account_service.exception.ExceptionType; import com.synapse.account_service.service.AccountService; +import com.synapse.account_service_api.dto.request.SignUpRequest; +import com.synapse.account_service_api.dto.response.SignUpResponse; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; + +public class AccountControllerTest extends TestConfig { -@WebMvcTest(AccountController.class) -@AutoConfigureMockMvc(addFilters = false) -@Import(GlobalExceptionHandler.class) -public class AccountControllerTest { @Autowired private MockMvc mockMvc; diff --git a/account-service/src/test/java/com/synapse/account_service/convert/authority/CustomAuthorityMapperTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/convert/authority/CustomAuthorityMapperTest.java similarity index 94% rename from account-service/src/test/java/com/synapse/account_service/convert/authority/CustomAuthorityMapperTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/convert/authority/CustomAuthorityMapperTest.java index 160bbab..409bff9 100644 --- a/account-service/src/test/java/com/synapse/account_service/convert/authority/CustomAuthorityMapperTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/convert/authority/CustomAuthorityMapperTest.java @@ -11,7 +11,9 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; -public class CustomAuthorityMapperTest { +import com.synapse.account_service.TestConfig; + +public class CustomAuthorityMapperTest extends TestConfig { private final CustomAuthorityMapper authorityMapper = new CustomAuthorityMapper(); @Test @@ -55,3 +57,4 @@ void mapAuthorities_emptyList() { assertThat(mappedAuthorities).isEmpty(); } } + diff --git a/account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOAuth2UserServiceTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOAuth2UserServiceTest.java similarity index 93% rename from account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOAuth2UserServiceTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOAuth2UserServiceTest.java index 96e7cd4..254afd2 100644 --- a/account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOAuth2UserServiceTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOAuth2UserServiceTest.java @@ -1,23 +1,21 @@ package com.synapse.account_service.integrationtest; -import com.synapse.account_service.convert.ProviderUserConverter; -import com.synapse.account_service.convert.ProviderUserRequest; -import com.synapse.account_service.domain.Attributes; -import com.synapse.account_service.domain.Member; -import com.synapse.account_service.domain.PrincipalUser; -import com.synapse.account_service.domain.ProviderUser; -import com.synapse.account_service.domain.socials.GoogleUser; -import com.synapse.account_service.service.CustomOAuth2UserService; -import com.synapse.account_service.service.MemberRegistrationService; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.times; + + +import java.time.Instant; +import java.util.Collections; +import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Import; import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; import org.springframework.security.oauth2.client.userinfo.OAuth2UserService; @@ -27,19 +25,18 @@ import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.test.util.ReflectionTestUtils; -import java.time.Instant; -import java.util.Collections; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import com.synapse.account_service.TestConfig; +import com.synapse.account_service.convert.ProviderUserConverter; +import com.synapse.account_service.convert.ProviderUserRequest; +import com.synapse.account_service.domain.Attributes; +import com.synapse.account_service.domain.PrincipalUser; +import com.synapse.account_service.domain.ProviderUser; +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service.domain.socials.GoogleUser; +import com.synapse.account_service.service.CustomOAuth2UserService; +import com.synapse.account_service.service.MemberRegistrationService; -@Import(CustomOAuth2UserService.class) -@ExtendWith(MockitoExtension.class) -public class CustomOAuth2UserServiceTest { +public class CustomOAuth2UserServiceTest extends TestConfig { @Autowired private CustomOAuth2UserService customOAuth2UserService; diff --git a/account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOidcUserServiceTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOidcUserServiceTest.java similarity index 95% rename from account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOidcUserServiceTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOidcUserServiceTest.java index 5b17bcf..c375cfd 100644 --- a/account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOidcUserServiceTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/CustomOidcUserServiceTest.java @@ -1,20 +1,19 @@ package com.synapse.account_service.integrationtest; -import com.synapse.account_service.convert.ProviderUserConverter; -import com.synapse.account_service.convert.ProviderUserRequest; -import com.synapse.account_service.domain.Attributes; -import com.synapse.account_service.domain.Member; -import com.synapse.account_service.domain.PrincipalUser; -import com.synapse.account_service.domain.ProviderUser; -import com.synapse.account_service.domain.socials.KakaoOidcUser; -import com.synapse.account_service.service.CustomOidcUserService; -import com.synapse.account_service.service.MemberRegistrationService; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.times; + +import java.time.Instant; +import java.util.Collections; +import java.util.Map; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest; import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; import org.springframework.security.oauth2.client.registration.ClientRegistration; @@ -25,18 +24,18 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.test.util.ReflectionTestUtils; -import java.time.Instant; -import java.util.Collections; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import com.synapse.account_service.TestConfig; +import com.synapse.account_service.convert.ProviderUserConverter; +import com.synapse.account_service.convert.ProviderUserRequest; +import com.synapse.account_service.domain.Attributes; +import com.synapse.account_service.domain.PrincipalUser; +import com.synapse.account_service.domain.ProviderUser; +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service.domain.socials.KakaoOidcUser; +import com.synapse.account_service.service.CustomOidcUserService; +import com.synapse.account_service.service.MemberRegistrationService; -@ExtendWith(MockitoExtension.class) -public class CustomOidcUserServiceTest { +public class CustomOidcUserServiceTest extends TestConfig { private CustomOidcUserService customOidcUserService; @@ -100,4 +99,4 @@ void loadUser_registersOrLogsIn() { assertThat(((PrincipalUser) result).getUsername()).isEqualTo(username); assertThat(((PrincipalUser) result).providerUser().getUsername()).isEqualTo(username); } -} \ No newline at end of file +} diff --git a/account-service/src/test/java/com/synapse/account_service/integrationtest/LoginIntegrationTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/LoginIntegrationTest.java similarity index 90% rename from account-service/src/test/java/com/synapse/account_service/integrationtest/LoginIntegrationTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/LoginIntegrationTest.java index 8214e3c..6870799 100644 --- a/account-service/src/test/java/com/synapse/account_service/integrationtest/LoginIntegrationTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/LoginIntegrationTest.java @@ -2,32 +2,27 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.cookie; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; -import org.springframework.transaction.annotation.Transactional; import com.fasterxml.jackson.databind.ObjectMapper; -import com.synapse.account_service.domain.Member; +import com.synapse.account_service.TestConfig; +import com.synapse.account_service.domain.entity.Member; import com.synapse.account_service.domain.enums.MemberRole; -import com.synapse.account_service.dto.request.LoginRequest; -import com.synapse.account_service.repository.MemberRepository; +import com.synapse.account_service.domain.repository.MemberRepository; +import com.synapse.account_service_api.dto.request.LoginRequest; -@SpringBootTest -@AutoConfigureMockMvc -@Transactional -public class LoginIntegrationTest { +public class LoginIntegrationTest extends TestConfig{ @Autowired private MockMvc mockMvc; diff --git a/account-service/src/test/java/com/synapse/account_service/integrationtest/TokenReissueIntegrationTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/TokenReissueIntegrationTest.java similarity index 87% rename from account-service/src/test/java/com/synapse/account_service/integrationtest/TokenReissueIntegrationTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/TokenReissueIntegrationTest.java index 0e9756d..1c00e4d 100644 --- a/account-service/src/test/java/com/synapse/account_service/integrationtest/TokenReissueIntegrationTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/integrationtest/TokenReissueIntegrationTest.java @@ -2,35 +2,30 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.cookie; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; -import org.springframework.transaction.annotation.Transactional; -import com.synapse.account_service.domain.Member; -import com.synapse.account_service.domain.RefreshToken; +import com.synapse.account_service.TestConfig; +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service.domain.entity.RefreshToken; import com.synapse.account_service.domain.enums.MemberRole; -import com.synapse.account_service.dto.response.TokenResponse; -import com.synapse.account_service.repository.MemberRepository; -import com.synapse.account_service.repository.RefreshTokenRepository; +import com.synapse.account_service.domain.repository.MemberRepository; +import com.synapse.account_service.domain.repository.RefreshTokenRepository; import com.synapse.account_service.service.JwtTokenService; +import com.synapse.account_service_api.dto.response.TokenResponse; import jakarta.servlet.http.Cookie; -@SpringBootTest -@AutoConfigureMockMvc -@Transactional -public class TokenReissueIntegrationTest { - +public class TokenReissueIntegrationTest extends TestConfig { + @Autowired private MockMvc mockMvc; diff --git a/account-service/src/test/java/com/synapse/account_service/repository/MemberRepositoryTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/repository/MemberRepositoryTest.java similarity index 60% rename from account-service/src/test/java/com/synapse/account_service/repository/MemberRepositoryTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/repository/MemberRepositoryTest.java index 9138420..a21160a 100644 --- a/account-service/src/test/java/com/synapse/account_service/repository/MemberRepositoryTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/repository/MemberRepositoryTest.java @@ -3,36 +3,27 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; -import java.time.ZonedDateTime; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.Import; import org.springframework.dao.DataIntegrityViolationException; -import com.synapse.account_service.config.TestJpaAuditingConfig; -import com.synapse.account_service.domain.Member; -import com.synapse.account_service.domain.Subscription; +import com.synapse.account_service.TestConfig; +import com.synapse.account_service.domain.entity.Member; import com.synapse.account_service.domain.enums.MemberRole; -import com.synapse.account_service.domain.enums.SubscriptionTier; +import com.synapse.account_service.domain.repository.MemberRepository; import jakarta.persistence.EntityManager; +public class MemberRepositoryTest extends TestConfig { -@DataJpaTest -@Import(TestJpaAuditingConfig.class) -public class MemberRepositoryTest { @Autowired private MemberRepository memberRepository; - @Autowired - private SubscriptionRepository subscriptionRepository; - @Autowired private EntityManager entityManager; @@ -49,32 +40,6 @@ void setUp() { .build(); } - @Test - @DisplayName("새로운 회원을 저장하면, 연관된 구독 정보도 함께 저장되어야 한다 (cascade)") - void saveMemberWithSubscription_shouldSaveBoth() { - // given: 테스트할 새로운 회원과 구독 정보를 준비합니다. - Subscription newSubscription = Subscription.builder() - .tier(SubscriptionTier.FREE) - .nextRenewalDate(ZonedDateTime.now().plusMonths(1)) - .build(); - - // 연관관계 편의 메서드를 사용하여 두 엔티티를 연결합니다. - testMember.setSubscription(newSubscription); - - // when: Member만 저장합니다. Subscription은 cascade 옵션에 따라 함께 저장되어야 합니다. - Member savedMember = memberRepository.save(testMember); - - // then: 결과를 검증합니다. - assertThat(savedMember.getId()).isNotNull(); - assertThat(savedMember.getSubscription()).isNotNull(); - assertThat(savedMember.getSubscription().getId()).isNotNull(); - assertThat(savedMember.getSubscription().getTier()).isEqualTo(SubscriptionTier.FREE); - - // DB에 실제로 두 엔티티가 모두 저장되었는지 확인합니다. - assertThat(memberRepository.count()).isEqualTo(1); - assertThat(subscriptionRepository.count()).isEqualTo(1); - } - @Test @DisplayName("이메일로 회원을 성공적으로 조회해야 한다") void findByEmail_shouldReturnMember() { @@ -121,32 +86,6 @@ void findByEmail_withNonExistentEmail_shouldReturnEmpty() { assertThat(foundMemberOpt).isEmpty(); } - @Test - @DisplayName("회원의 구독 정보를 null로 설정하고 저장하면, 구독 정보가 삭제되어야 한다 (orphanRemoval)") - void removeSubscription_shouldDeleteSubscriptionEntity() { - // given: 회원과 구독 정보를 함께 저장합니다. - Subscription subscription = Subscription.builder() - .tier(SubscriptionTier.PRO) - .nextRenewalDate(ZonedDateTime.now()) - .build(); - - testMember.setSubscription(subscription); - - Member savedMember = memberRepository.save(testMember); - - // DB에 둘 다 존재하는지 먼저 확인 - assertThat(memberRepository.count()).isEqualTo(1); - assertThat(subscriptionRepository.count()).isEqualTo(1); - - // when: 회원의 구독 정보 참조를 제거합니다. - savedMember.setSubscription(null); - memberRepository.saveAndFlush(savedMember); // 변경사항을 즉시 DB에 반영 - - // then: Member는 남아있지만, 고아가 된 Subscription은 삭제되어야 합니다. - assertThat(memberRepository.count()).isEqualTo(1); - assertThat(subscriptionRepository.count()).isEqualTo(0); - } - @Test @DisplayName("엔티티 저장 시 생성 날짜(createdAt)가 자동으로 설정되어야 한다") void save_shouldSetCreatedAt() { diff --git a/account-service/src/test/java/com/synapse/account_service/service/AccountServiceTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/service/AccountServiceTest.java similarity index 85% rename from account-service/src/test/java/com/synapse/account_service/service/AccountServiceTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/service/AccountServiceTest.java index 4ef6bee..a5d6608 100644 --- a/account-service/src/test/java/com/synapse/account_service/service/AccountServiceTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/service/AccountServiceTest.java @@ -1,32 +1,31 @@ package com.synapse.account_service.service; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.verify; -import static org.mockito.ArgumentMatchers.any; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.Optional; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.security.crypto.password.PasswordEncoder; -import com.synapse.account_service.domain.Member; -import com.synapse.account_service.dto.request.SignUpRequest; -import com.synapse.account_service.dto.response.SignUpResponse; +import com.synapse.account_service.TestConfig; +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service.domain.repository.MemberRepository; +import com.synapse.account_service_api.dto.request.SignUpRequest; +import com.synapse.account_service_api.dto.response.SignUpResponse; import com.synapse.account_service.exception.DuplicatedException; -import com.synapse.account_service.repository.MemberRepository; -@ExtendWith(MockitoExtension.class) -public class AccountServiceTest { - @InjectMocks +public class AccountServiceTest extends TestConfig { + + @InjectMocks private AccountService accountService; @Mock diff --git a/account-service/src/test/java/com/synapse/account_service/service/CustomUserDetailsServiceTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/service/CustomUserDetailsServiceTest.java similarity index 92% rename from account-service/src/test/java/com/synapse/account_service/service/CustomUserDetailsServiceTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/service/CustomUserDetailsServiceTest.java index bd4beff..d22ad2a 100644 --- a/account-service/src/test/java/com/synapse/account_service/service/CustomUserDetailsServiceTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/service/CustomUserDetailsServiceTest.java @@ -1,32 +1,32 @@ package com.synapse.account_service.service; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; + +import java.util.Optional; +import java.util.UUID; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.test.util.ReflectionTestUtils; + +import com.synapse.account_service.TestConfig; import com.synapse.account_service.convert.ProviderUserConverter; import com.synapse.account_service.convert.ProviderUserRequest; -import com.synapse.account_service.domain.Member; import com.synapse.account_service.domain.PrincipalUser; import com.synapse.account_service.domain.ProviderUser; +import com.synapse.account_service.domain.entity.Member; import com.synapse.account_service.domain.enums.MemberRole; import com.synapse.account_service.domain.forms.FormUser; +import com.synapse.account_service.domain.repository.MemberRepository; import com.synapse.account_service.exception.NotFoundException; -import com.synapse.account_service.repository.MemberRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.test.util.ReflectionTestUtils; -import java.util.Optional; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; +class CustomUserDetailsServiceTest extends TestConfig { -@ExtendWith(MockitoExtension.class) -class CustomUserDetailsServiceTest { private CustomUserDetailsService customUserDetailsService; diff --git a/account-service/src/test/java/com/synapse/account_service/service/JwtTokenServiceTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/service/JwtTokenServiceTest.java similarity index 87% rename from account-service/src/test/java/com/synapse/account_service/service/JwtTokenServiceTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/service/JwtTokenServiceTest.java index a3597da..b68073b 100644 --- a/account-service/src/test/java/com/synapse/account_service/service/JwtTokenServiceTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/service/JwtTokenServiceTest.java @@ -1,29 +1,28 @@ package com.synapse.account_service.service; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import java.time.Instant; import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; -import com.synapse.account_service.dto.TokenResult; -import com.synapse.account_service.dto.response.TokenResponse; +import com.synapse.account_service.TestConfig; +import com.synapse.account_service_api.dto.TokenResult; +import com.synapse.account_service_api.dto.response.TokenResponse; + +public class JwtTokenServiceTest extends TestConfig { -@ExtendWith(MockitoExtension.class) -public class JwtTokenServiceTest { @InjectMocks private JwtTokenService jwtTokenService; diff --git a/account-service/src/test/java/com/synapse/account_service/service/MemberRegistrationServiceTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/service/MemberRegistrationServiceTest.java similarity index 91% rename from account-service/src/test/java/com/synapse/account_service/service/MemberRegistrationServiceTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/service/MemberRegistrationServiceTest.java index 2efcc72..812c7e5 100644 --- a/account-service/src/test/java/com/synapse/account_service/service/MemberRegistrationServiceTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/service/MemberRegistrationServiceTest.java @@ -1,30 +1,33 @@ package com.synapse.account_service.service; -import com.synapse.account_service.domain.Attributes; -import com.synapse.account_service.domain.Member; -import com.synapse.account_service.domain.ProviderUser; -import com.synapse.account_service.domain.socials.GoogleUser; -import com.synapse.account_service.repository.MemberRepository; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.security.oauth2.core.user.DefaultOAuth2User; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.ArgumentMatchers.anyString; import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.UUID; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.security.oauth2.core.user.DefaultOAuth2User; + +import com.synapse.account_service.TestConfig; +import com.synapse.account_service.domain.Attributes; +import com.synapse.account_service.domain.ProviderUser; +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service.domain.repository.MemberRepository; +import com.synapse.account_service.domain.socials.GoogleUser; -@ExtendWith(MockitoExtension.class) -class MemberRegistrationServiceTest { +class MemberRegistrationServiceTest extends TestConfig { @InjectMocks private MemberRegistrationService memberRegistrationService; @@ -111,4 +114,4 @@ void registerOauthUser_whenSocialAccountExists_returnsMember() { verify(existingMember, never()).linkSocialAccount(anyString(), anyString()); assertThat(result).isEqualTo(existingMember); } -} \ No newline at end of file +} diff --git a/account-service/src/test/java/com/synapse/account_service/service/TokenManagementServiceTest.java b/account-service/account-service/src/test/java/com/synapse/account_service/service/TokenManagementServiceTest.java similarity index 87% rename from account-service/src/test/java/com/synapse/account_service/service/TokenManagementServiceTest.java rename to account-service/account-service/src/test/java/com/synapse/account_service/service/TokenManagementServiceTest.java index 013c966..fe92e34 100644 --- a/account-service/src/test/java/com/synapse/account_service/service/TokenManagementServiceTest.java +++ b/account-service/account-service/src/test/java/com/synapse/account_service/service/TokenManagementServiceTest.java @@ -12,22 +12,21 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import com.synapse.account_service.domain.Member; -import com.synapse.account_service.domain.RefreshToken; +import com.synapse.account_service.TestConfig; +import com.synapse.account_service.domain.entity.Member; +import com.synapse.account_service.domain.entity.RefreshToken; import com.synapse.account_service.domain.enums.MemberRole; -import com.synapse.account_service.dto.TokenResult; -import com.synapse.account_service.dto.response.TokenResponse; +import com.synapse.account_service.domain.repository.MemberRepository; +import com.synapse.account_service.domain.repository.RefreshTokenRepository; import com.synapse.account_service.exception.JWTValidationException; -import com.synapse.account_service.repository.MemberRepository; -import com.synapse.account_service.repository.RefreshTokenRepository; +import com.synapse.account_service_api.dto.TokenResult; +import com.synapse.account_service_api.dto.response.TokenResponse; + +public class TokenManagementServiceTest extends TestConfig { -@ExtendWith(MockitoExtension.class) -public class TokenManagementServiceTest { @InjectMocks private TokenManagementService tokenManagementService; diff --git a/account-service/src/test/resources/application-test.yml b/account-service/account-service/src/test/resources/application-test.yml similarity index 81% rename from account-service/src/test/resources/application-test.yml rename to account-service/account-service/src/test/resources/application-test.yml index 06e97a3..06b5a80 100644 --- a/account-service/src/test/resources/application-test.yml +++ b/account-service/account-service/src/test/resources/application-test.yml @@ -26,11 +26,13 @@ spring: console: enabled: true datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: hikari: - driver-class-name: org.h2.Driver - jdbc-url: jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: + connection-timeout: 20000 + maximum-pool-size: 10 jpa: database-platform: org.hibernate.dialect.PostgreSQLDialect @@ -58,6 +60,17 @@ jwt: secret: key: testSecretKeyForJWTTokenGenerationInTestEnvironment2024 +# Kafka 테스트 설정 +eventuatelocal: + kafka: + bootstrap: + servers: localhost:9092 + cdc: + polling: + interval: + in: + milliseconds: 500 + logging: level: org: diff --git a/account-service/src/test/resources/application.yml b/account-service/account-service/src/test/resources/application.yml similarity index 100% rename from account-service/src/test/resources/application.yml rename to account-service/account-service/src/test/resources/application.yml diff --git a/account-service/build.gradle b/account-service/build.gradle index 8b38864..0426ef9 100644 --- a/account-service/build.gradle +++ b/account-service/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.5.0' + id 'org.springframework.boot' version '3.5.4' id 'io.spring.dependency-management' version '1.1.7' } @@ -8,45 +8,88 @@ group = 'com.synapse' version = '0.0.1-SNAPSHOT' java { - toolchain { - languageVersion = JavaLanguageVersion.of(21) - } + sourceCompatibility = JavaVersion.VERSION_21 +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } } repositories { mavenCentral() } -dependencies { - // Security - implementation 'org.springframework.boot:spring-boot-starter-security' - // Auth0 - implementation 'com.auth0:java-jwt:4.4.0' - // JPA - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - // PostgreSQL - runtimeOnly 'org.postgresql:postgresql' - // OAuth2 Client - implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' - // OAuth2 Resource Server - implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' - // Lombok - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - // Test - testCompileOnly 'org.projectlombok:lombok' - testAnnotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.springframework.security:spring-security-test' - // Spring Web - implementation 'org.springframework.boot:spring-boot-starter-web' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - //H2 Database - implementation 'com.h2database:h2' - // Validation - implementation 'org.springframework.boot:spring-boot-starter-validation' +subprojects{ + apply plugin: 'java' + apply plugin: 'io.spring.dependency-management' + apply plugin: 'org.springframework.boot' + + repositories { + mavenCentral() + } + + ext { + set('springCloudVersion', "2022.0.5") + set('eventuateTramVersion', "0.35.0.RELEASE") + set('eventuateTramSagasVersion', "0.24.0.RELEASE") + set('eventuateCommonVersion', "0.19.0.RELEASE") + } + + dependencies { + // Simple DSL + implementation "io.eventuate.tram.sagas:eventuate-tram-sagas-spring-orchestration-simple-dsl-starter:${eventuateTramSagasVersion}" + // Saga Participant + implementation "io.eventuate.tram.sagas:eventuate-tram-sagas-spring-participant-starter:${eventuateTramSagasVersion}" + // Eventuate Tram Consumer + implementation "io.eventuate.tram.core:eventuate-tram-spring-consumer-kafka:${eventuateTramVersion}" + // Eventuate Tram Producer JDBC + implementation "io.eventuate.tram.core:eventuate-tram-spring-producer-jdbc:${eventuateTramVersion}" + // Eventuate Tram Consumer JDBC + implementation "io.eventuate.tram.core:eventuate-tram-spring-consumer-jdbc:${eventuateTramVersion}" + // Eventuate Tram Aggregate Domain Events + implementation "io.eventuate.tram.core:eventuate-tram-aggregate-domain-events:${eventuateTramVersion}" + // Security + implementation 'org.springframework.boot:spring-boot-starter-security' + // Auth0 + implementation 'com.auth0:java-jwt:4.4.0' + // JPA + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + // PostgreSQL + runtimeOnly 'org.postgresql:postgresql' + // OAuth2 Client + implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' + // OAuth2 Resource Server + implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' + // Lombok + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + // Test + testCompileOnly 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.security:spring-security-test' + // Spring Web + implementation 'org.springframework.boot:spring-boot-starter-web' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + //H2 Database + implementation 'com.h2database:h2' + // Validation + implementation 'org.springframework.boot:spring-boot-starter-validation' + //QueryDSL + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + } + } tasks.named('test') { useJUnitPlatform() } + +bootJar { + enabled = false +} diff --git a/account-service/settings.gradle b/account-service/settings.gradle index c555051..a93bfb8 100644 --- a/account-service/settings.gradle +++ b/account-service/settings.gradle @@ -1 +1,4 @@ rootProject.name = 'account-service' + +include('account-service') +include('account-service-api') diff --git a/account-service/src/main/java/com/synapse/account_service/config/JpaAuditingConfig.java b/account-service/src/main/java/com/synapse/account_service/config/JpaAuditingConfig.java deleted file mode 100644 index 7f37c83..0000000 --- a/account-service/src/main/java/com/synapse/account_service/config/JpaAuditingConfig.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.synapse.account_service.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; - -@Configuration -@EnableJpaAuditing -public class JpaAuditingConfig { - -} diff --git a/account-service/src/main/java/com/synapse/account_service/controller/test/InternalApiController.java b/account-service/src/main/java/com/synapse/account_service/controller/test/InternalApiController.java deleted file mode 100644 index 20d9849..0000000 --- a/account-service/src/main/java/com/synapse/account_service/controller/test/InternalApiController.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.synapse.account_service.controller.test; - -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 내부 api를 테스트하는 테스트 api controller 입니다. - */ -@RestController -@RequestMapping("/api/internal") -public class InternalApiController { - - @GetMapping("/accounts/id") - public ResponseEntity getAccountInfo(Authentication authentication) { - // 인증된 주체(클라이언트 ID)와 요청된 ID를 로깅합니다. - System.out.println("Client '" + authentication.getName() + "' requested info for account: "); - return ResponseEntity.ok("Account info for "); - } -} diff --git a/account-service/src/main/java/com/synapse/account_service/domain/enums/OAuth2Config.java b/account-service/src/main/java/com/synapse/account_service/domain/enums/OAuth2Config.java deleted file mode 100644 index 8947651..0000000 --- a/account-service/src/main/java/com/synapse/account_service/domain/enums/OAuth2Config.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.synapse.account_service.domain.enums; - -public class OAuth2Config { - public enum SocialType { - GOOGLE("google"), - KAKAO("kakao"), - NAVER("naver") - ; - - private final String socialName; - - private SocialType(String socialName) { - this.socialName = socialName; - } - - public String getSocialName() { - return socialName; - } - } -} diff --git a/account-service/src/main/java/com/synapse/account_service/dto/TokenResult.java b/account-service/src/main/java/com/synapse/account_service/dto/TokenResult.java deleted file mode 100644 index 7105407..0000000 --- a/account-service/src/main/java/com/synapse/account_service/dto/TokenResult.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.synapse.account_service.dto; - -import java.time.Instant; - -/** - * JwtTemplate이 토큰 생성 후 반환할 DTO - * - * @param token 생성된 JWT 문자열 - * @param expiresAt 토큰의 만료 시간 - */ -public record TokenResult( - String token, - Instant expiresAt -) { - -} diff --git a/account-service/src/main/java/com/synapse/account_service/dto/response/SignUpResponse.java b/account-service/src/main/java/com/synapse/account_service/dto/response/SignUpResponse.java deleted file mode 100644 index 46beaeb..0000000 --- a/account-service/src/main/java/com/synapse/account_service/dto/response/SignUpResponse.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.synapse.account_service.dto.response; - -import java.util.UUID; - -import com.synapse.account_service.domain.Member; - -public record SignUpResponse( - UUID id, - String email, - String username, - String role -) { - public static SignUpResponse from(Member member) { - return new SignUpResponse(member.getId(), member.getEmail(), member.getUsername(), member.getRole().name()); - } -} diff --git a/account-service/src/main/java/com/synapse/account_service/dto/response/TokenResponse.java b/account-service/src/main/java/com/synapse/account_service/dto/response/TokenResponse.java deleted file mode 100644 index c4564b0..0000000 --- a/account-service/src/main/java/com/synapse/account_service/dto/response/TokenResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.synapse.account_service.dto.response; - -import com.synapse.account_service.dto.TokenResult; - -/** - * JwtService가 최종적으로 생성하여 반환할 인증 토큰 DTO - * - * @param accessToken 액세스 토큰 정보 - * @param refreshToken 리프레시 토큰 정보 - */ -public record TokenResponse(TokenResult accessToken, TokenResult refreshToken) { - -} diff --git a/account-service/src/main/resources/application-local.yml b/account-service/src/main/resources/application-local.yml deleted file mode 100644 index 0622468..0000000 --- a/account-service/src/main/resources/application-local.yml +++ /dev/null @@ -1,26 +0,0 @@ -spring: - datasource: - driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://${local-db.postgres.host}:${local-db.postgres.port}/${local-db.postgres.name} - username: ${local-db.postgres.username} - password: ${local-db.postgres.password} - - jpa: - properties: - hibernate: - format: - sql: true - highlight: - sql: true - hbm2ddl: - auto: create - dialect: org.hibernate.dialect.PostgreSQLDialect - open-in-view: false - show-sql: true - -logging: - level: - org: - hibernate: - type: info - level: info diff --git a/account-service/src/test/java/com/synapse/account_service/config/TestJpaAuditingConfig.java b/account-service/src/test/java/com/synapse/account_service/config/TestJpaAuditingConfig.java deleted file mode 100644 index 5d5f625..0000000 --- a/account-service/src/test/java/com/synapse/account_service/config/TestJpaAuditingConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.synapse.account_service.config; - -import java.util.Optional; - -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.data.domain.AuditorAware; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; - -@TestConfiguration -@EnableJpaAuditing -public class TestJpaAuditingConfig { - - // @CreatedBy, @LastModifiedBy를 테스트하기 위해 임시 AuditorAware 빈을 등록합니다. - @Bean - public AuditorAware auditorProvider() { - return () -> Optional.of("test_user"); - } -} diff --git a/account-service/src/test/java/com/synapse/account_service/integrationtest/ResourceServerIntegrationTest.java b/account-service/src/test/java/com/synapse/account_service/integrationtest/ResourceServerIntegrationTest.java deleted file mode 100644 index aaee59c..0000000 --- a/account-service/src/test/java/com/synapse/account_service/integrationtest/ResourceServerIntegrationTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.synapse.account_service.integrationtest; - -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.time.Instant; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.transaction.annotation.Transactional; - -import com.synapse.account_service.controller.test.InternalApiController; -import com.synapse.account_service.support.ApplicationIntegrationTest; - -@SpringBootTest -@AutoConfigureMockMvc -@Transactional -@Import(InternalApiController.class) -public class ResourceServerIntegrationTest extends ApplicationIntegrationTest { - - @Autowired - private MockMvc mockMvc; - - @Test - @DisplayName("리소스 접근 성공: 유효한 JWT와 올바른 scope으로 보호된 API 호출 시 200 OK를 응답한다") - void accessProtectedResource_withValidJwt_shouldSucceed() throws Exception { - // when - ResultActions actions = mockMvc.perform(get("/api/internal/accounts/id") - .with(jwt().jwt(j -> j.claim("scope", "api.internal")))); - - // then - actions.andDo(print()).andExpect(status().isOk()); - } - - @Test - @DisplayName("리소스 접근 실패: JWT가 없을 경우, 401 Unauthorized를 응답한다") - void accessProtectedResource_withoutJwt_shouldFail() throws Exception { - // when - ResultActions actions = mockMvc.perform(get("/api/internal/accounts/id")); - - // then - actions.andDo(print()).andExpect(status().isUnauthorized()); - } - - @Test - @DisplayName("리소스 접근 실패: 만료된 JWT로 호출 시, 401 Unauthorized를 응답한다") - void accessProtectedResource_withExpiredJwt_shouldFail() throws Exception { - // when - ResultActions actions = mockMvc.perform(get("/api/internal/accounts/id") - .with(jwt().jwt(j -> j - .claim("scope", "api.internal") - .expiresAt(Instant.now().minusSeconds(3600)) // mock에서는 만료시간 체크 안함 실제로는 401 에러 발생 - ))); - - // then - actions.andDo(print()).andExpect(status().isOk()); - } - - @Test - @DisplayName("리소스 접근 실패: 부적절한 scope을 가진 JWT로 호출 시, 403 Forbidden을 응답한다") - void accessProtectedResource_withInsufficientScope_shouldFail() throws Exception { - // when - ResultActions actions = mockMvc.perform(get("/api/internal/accounts/id") - // [핵심] API가 요구하는 'api.internal'이 아닌 다른 scope을 가진 JWT를 생성합니다. - .with(jwt().jwt(j -> j.claim("scope", "read:only")))); - - // then - actions.andDo(print()).andExpect(status().isForbidden()); - } -}