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(