diff --git a/README.md b/README.md index c719377..f9cc4da 100644 --- a/README.md +++ b/README.md @@ -162,4 +162,8 @@ 프로젝트를 진행하면서 서비스의 성능을 향상시킬 수 있는 부분에 대해서 고민하고 테스팅한 후 성능 향상 전/후의 측정값들을 기록하고 성능 향상 원인에 대해 공부한 것을 정리하였습니다. -
\ No newline at end of file + +## 9. 설계 다이어그램 + +### [시퀀스 다이어그램] (https://viewer.diagrams.net/?tags=%7B%7D&highlight=0000ff&edit=_blank&layers=1&nav=1#G1BFeex-2cN2aTEROFH5kdMMmAsgxf-xuQ) +
diff --git a/src/main/java/org/capstone/maru/controller/LoginController.java b/src/main/java/org/capstone/maru/controller/LoginController.java index 9f95455..404ec52 100644 --- a/src/main/java/org/capstone/maru/controller/LoginController.java +++ b/src/main/java/org/capstone/maru/controller/LoginController.java @@ -10,18 +10,4 @@ @RequestMapping public class LoginController { - @GetMapping("/login") - public String socialLogin() { - return "카카오 로그인 url: login-kakao | 네이버 로그인 url: login-naver"; - } - - @GetMapping("/login-kakao") - public void loginKakao(HttpServletResponse response) throws IOException { - response.sendRedirect("oauth2/authorization/kakao"); - } - - @GetMapping(value = "/login-naver") - public void loginNaver(HttpServletResponse response) throws IOException { - response.sendRedirect("oauth2/authorization/naver"); - } } diff --git a/src/main/java/org/capstone/maru/controller/MainController.java b/src/main/java/org/capstone/maru/controller/MainController.java index ba352eb..fa8c3de 100644 --- a/src/main/java/org/capstone/maru/controller/MainController.java +++ b/src/main/java/org/capstone/maru/controller/MainController.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.capstone.maru.security.principal.SharedPostPrincipal; -import org.capstone.maru.service.MemberAccountService; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -12,8 +11,6 @@ @RestController public class MainController { - private final MemberAccountService memberAccountService; - @GetMapping("/") public String root() { return "health check"; diff --git a/src/main/java/org/capstone/maru/domain/MemberAccount.java b/src/main/java/org/capstone/maru/domain/MemberAccount.java index 6daadc2..415cb65 100644 --- a/src/main/java/org/capstone/maru/domain/MemberAccount.java +++ b/src/main/java/org/capstone/maru/domain/MemberAccount.java @@ -11,6 +11,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.springframework.data.domain.Persistable; @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -22,17 +23,15 @@ @Index(columnList = "createdBy") }) @Entity -public class MemberAccount extends AuditingFields { +public class MemberAccount extends AuditingFields implements Persistable { @Id @Column(nullable = false, length = 50) private String memberId; - @Setter @Column(length = 100) private String email; - @Setter @Column(length = 100) private String nickname; @@ -81,4 +80,14 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(this.getMemberId()); } + + @Override + public String getId() { + return memberId; + } + + @Override + public boolean isNew() { + return getCreatedAt() == null; + } } diff --git a/src/main/java/org/capstone/maru/security/config/SecurityConfig.java b/src/main/java/org/capstone/maru/security/config/SecurityConfig.java index 6dab6a7..2899dc2 100644 --- a/src/main/java/org/capstone/maru/security/config/SecurityConfig.java +++ b/src/main/java/org/capstone/maru/security/config/SecurityConfig.java @@ -10,7 +10,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.SecurityFilterChain; @@ -18,7 +17,6 @@ @Slf4j @Configuration -@EnableWebSecurity public class SecurityConfig { private final AuthenticationEntryPoint authEntryPoint; @@ -50,8 +48,7 @@ public SecurityFilterChain securityFilterChain( .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() .requestMatchers( HttpMethod.GET, - "/", "/login", "login-kakao", "login-naver", "/oauth2/**", "/login/oauth2/**", - "/errorTest" + "/" ).permitAll() .requestMatchers( HttpMethod.POST, @@ -68,6 +65,10 @@ public SecurityFilterChain securityFilterChain( .exceptionHandling(hc -> hc .authenticationEntryPoint(authEntryPoint) ) + .logout(logout -> logout + .deleteCookies("JSESSIONID") + .logoutSuccessUrl("/").permitAll() + ) .csrf( csrf -> csrf .ignoringRequestMatchers("/api/**") diff --git a/src/main/java/org/capstone/maru/security/service/CustomOAuth2UserService.java b/src/main/java/org/capstone/maru/security/service/CustomOAuth2UserService.java index 7231b52..4145d2c 100644 --- a/src/main/java/org/capstone/maru/security/service/CustomOAuth2UserService.java +++ b/src/main/java/org/capstone/maru/security/service/CustomOAuth2UserService.java @@ -31,20 +31,7 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic oAuth2User.getAttributes() ); - String memberId = getMemberId(registrationId, extractAttributes); - - return memberAccountService - .searchMember(memberId) - .map(SharedPostPrincipal::from) - .orElseGet(() -> - SharedPostPrincipal.from( - memberAccountService.saveUser( - memberId, - extractAttributes.email(), - extractAttributes.nickname() - ) - ) - ); + return createSharedPostPrincipal(registrationId, extractAttributes); } private SocialType getSocialType(String registrationId) { @@ -55,5 +42,18 @@ private String getMemberId(String registrationId, OAuth2Response oAuth2Response) return registrationId + "_" + oAuth2Response.id(); } + private SharedPostPrincipal createSharedPostPrincipal( + String registrationId, + OAuth2Response extractAttributes + ) { + String memberId = getMemberId(registrationId, extractAttributes); + return SharedPostPrincipal.from( + memberAccountService.login( + memberId, + extractAttributes.email(), + extractAttributes.nickname() + ) + ); + } } diff --git a/src/main/java/org/capstone/maru/service/MemberAccountService.java b/src/main/java/org/capstone/maru/service/MemberAccountService.java index 34df1fc..6c4f4ac 100644 --- a/src/main/java/org/capstone/maru/service/MemberAccountService.java +++ b/src/main/java/org/capstone/maru/service/MemberAccountService.java @@ -25,18 +25,25 @@ public Optional searchMember(String memberId) { .map(MemberAccountDto::from); } - @Transactional - public MemberAccountDto saveUser( + public MemberAccountDto login(String memberId, String email, String nickname) { + Optional memberAccount = memberAccountRepository.findByEmail(email); + + if (memberAccount.isEmpty()) { + return saveMember(memberId, email, nickname); + } + + if (memberAccount.get().getMemberId().equals(memberId)) { + return MemberAccountDto.from(memberAccount.get()); + } + + throw new MemberAccountExistentException(RestErrorCode.DUPLICATE_VALUE); + } + + private MemberAccountDto saveMember( String memberId, String email, String nickname ) { - if (memberAccountRepository.findByEmail(email).isPresent()) { - throw new MemberAccountExistentException( - RestErrorCode.DUPLICATE_VALUE - ); - } - return MemberAccountDto.from( memberAccountRepository.save( MemberAccount.of(