Skip to content

Commit 8aa6a40

Browse files
authored
✨ [Feat] 회원 탈퇴 로직 구현 (#79)
2 parents 5795f0e + 365012c commit 8aa6a40

File tree

4 files changed

+19
-4
lines changed

4 files changed

+19
-4
lines changed

src/main/java/org/withtime/be/withtimebe/domain/member/controller/MemberController.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
import io.swagger.v3.oas.annotations.tags.Tag;
77
import lombok.RequiredArgsConstructor;
88
import org.namul.api.payload.response.DefaultResponse;
9-
import org.springframework.web.bind.annotation.PatchMapping;
10-
import org.springframework.web.bind.annotation.RequestBody;
11-
import org.springframework.web.bind.annotation.RequestMapping;
12-
import org.springframework.web.bind.annotation.RestController;
9+
import org.springframework.web.bind.annotation.*;
1310
import org.withtime.be.withtimebe.domain.member.converter.MemberConverter;
1411
import org.withtime.be.withtimebe.domain.member.dto.MemberRequestDTO;
1512
import org.withtime.be.withtimebe.domain.member.dto.MemberResponseDTO;
@@ -75,4 +72,12 @@ public DefaultResponse<MemberResponseDTO.ChangeInfo> changeInfo(@AuthenticatedMe
7572
Member updatedMember = memberCommandService.changeInfo(member.getId(), request);
7673
return DefaultResponse.ok(MemberConverter.toChangeInfo(updatedMember));
7774
}
75+
76+
@Operation(summary = "회원 탈퇴하기 API", description = "로그인된 토큰을 이용하여 회원 탈퇴하는 API")
77+
@ApiResponse(responseCode = "204", description = "회원 탈퇴 성공 (soft delete)")
78+
@DeleteMapping
79+
public DefaultResponse<Void> deleteMember(@AuthenticatedMember Member member) {
80+
memberCommandService.deleteMember(member.getId());
81+
return DefaultResponse.noContent();
82+
}
7883
}

src/main/java/org/withtime/be/withtimebe/domain/member/entity/Member.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import jakarta.persistence.*;
44
import lombok.*;
5+
import org.hibernate.annotations.SQLDelete;
6+
import org.hibernate.annotations.SQLRestriction;
57
import org.withtime.be.withtimebe.domain.member.entity.enums.Gender;
68
import org.withtime.be.withtimebe.domain.member.entity.enums.Role;
79
import org.withtime.be.withtimebe.domain.member.entity.enums.UserRank;
@@ -16,6 +18,8 @@
1618
@NoArgsConstructor(access = AccessLevel.PROTECTED)
1719
@AllArgsConstructor(access = AccessLevel.PRIVATE)
1820
@Table(name = "member")
21+
@SQLDelete(sql = "UPDATE member SET deleted_at = NOW() WHERE member_id = ?")
22+
@SQLRestriction(value = "deleted_at IS NULL")
1923
public class Member extends BaseEntity {
2024

2125
@Id

src/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ public interface MemberCommandService {
77
void changePassword(Member member, MemberRequestDTO.ChangePassword request);
88
void changePassword(String email, String password);
99
Member changeInfo(Long memberId, MemberRequestDTO.ChangeInfo request);
10+
void deleteMember(Long memberId);
1011
}

src/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandServiceImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ public Member changeInfo(Long memberId, MemberRequestDTO.ChangeInfo request) {
4646
return member;
4747
}
4848

49+
@Override
50+
public void deleteMember(Long memberId) {
51+
memberRepository.deleteById(memberId);
52+
}
53+
4954
public void validateChangePassword(Member member, String password) throws ServerApplicationException {
5055
String memberPassword = member.getPassword();
5156
if (memberPassword == null) {

0 commit comments

Comments
 (0)