Skip to content

Commit d025de9

Browse files
committed
✨ feat: 회원 탈퇴 기능 구현
1 parent 5501997 commit d025de9

File tree

5 files changed

+56
-0
lines changed

5 files changed

+56
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.f1.backend.domain.user.api;
2+
3+
import static io.f1.backend.global.util.SecurityUtils.logout;
4+
5+
import io.f1.backend.domain.user.app.UserService;
6+
import io.f1.backend.domain.user.dto.UserPrincipal;
7+
import jakarta.servlet.http.HttpSession;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
11+
import org.springframework.stereotype.Controller;
12+
import org.springframework.web.bind.annotation.DeleteMapping;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
15+
@Controller
16+
@RequiredArgsConstructor
17+
@RequestMapping("/user/me")
18+
public class UserController {
19+
20+
private final UserService userService;
21+
22+
@DeleteMapping
23+
public ResponseEntity<Void> deleteCurrentUser(
24+
@AuthenticationPrincipal UserPrincipal userPrincipal, HttpSession httpSession) {
25+
userService.deleteUser(userPrincipal.getUserId());
26+
logout(httpSession);
27+
return ResponseEntity.noContent().build();
28+
}
29+
}

backend/src/main/java/io/f1/backend/domain/user/app/UserService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,11 @@ private void updateSessionAfterSignup(HttpSession session, User user) {
8282
session.removeAttribute(OAUTH_USER);
8383
session.setAttribute(USER, AuthenticationUser.from(user));
8484
}
85+
86+
@Transactional
87+
public void deleteUser(Long userId) {
88+
User user = userRepository.findById(userId)
89+
.orElseThrow(() -> new RuntimeException("E404001: 존재하지 않는 회원입니다."));
90+
userRepository.delete(user);
91+
}
8592
}

backend/src/main/java/io/f1/backend/global/config/SecurityConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public SecurityFilterChain userFilterChain(HttpSecurity http) throws Exception {
4242
.permitAll()
4343
.requestMatchers("/ws/**")
4444
.authenticated()
45+
.requestMatchers("/user/me").hasRole("USER")
4546
.anyRequest()
4647
.authenticated())
4748
.formLogin(AbstractHttpConfigurer::disable)

backend/src/main/java/io/f1/backend/global/config/WebConfig.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.f1.backend.global.config;
22

3+
import org.springframework.context.annotation.Bean;
34
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.web.filter.HiddenHttpMethodFilter;
46
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
57
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
68

@@ -14,4 +16,9 @@ public void addResourceHandlers(ResourceHandlerRegistry registry) {
1416
registry.addResourceHandler("/images/thumbnail/**")
1517
.addResourceLocations("file:images/thumbnail/");
1618
}
19+
20+
@Bean
21+
public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
22+
return new HiddenHttpMethodFilter();
23+
}
1724
}

backend/src/main/java/io/f1/backend/global/util/SecurityUtils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.f1.backend.domain.user.dto.UserPrincipal;
44
import io.f1.backend.domain.user.entity.User;
55

6+
import jakarta.servlet.http.HttpSession;
67
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
78
import org.springframework.security.core.Authentication;
89
import org.springframework.security.core.context.SecurityContextHolder;
@@ -37,4 +38,15 @@ public static Long getCurrentUserId() {
3738
public static String getCurrentUserNickname() {
3839
return getCurrentUserPrincipal().getUserNickname();
3940
}
41+
42+
public static void logout(HttpSession session) {
43+
if (session != null) {
44+
session.invalidate();
45+
}
46+
clearAuthentication();
47+
}
48+
49+
private static void clearAuthentication() {
50+
SecurityContextHolder.clearContext();
51+
}
4052
}

0 commit comments

Comments
 (0)