diff --git a/src/main/java/org/withtime/be/withtimebe/domain/member/controller/MemberController.java b/src/main/java/org/withtime/be/withtimebe/domain/member/controller/MemberController.java index 4220e46..96feeec 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/member/controller/MemberController.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/member/controller/MemberController.java @@ -6,10 +6,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.namul.api.payload.response.DefaultResponse; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.withtime.be.withtimebe.domain.member.converter.MemberConverter; import org.withtime.be.withtimebe.domain.member.dto.MemberRequestDTO; import org.withtime.be.withtimebe.domain.member.dto.MemberResponseDTO; @@ -75,4 +72,12 @@ public DefaultResponse changeInfo(@AuthenticatedMe Member updatedMember = memberCommandService.changeInfo(member.getId(), request); return DefaultResponse.ok(MemberConverter.toChangeInfo(updatedMember)); } + + @Operation(summary = "회원 탈퇴하기 API", description = "로그인된 토큰을 이용하여 회원 탈퇴하는 API") + @ApiResponse(responseCode = "204", description = "회원 탈퇴 성공 (soft delete)") + @DeleteMapping + public DefaultResponse deleteMember(@AuthenticatedMember Member member) { + memberCommandService.deleteMember(member.getId()); + return DefaultResponse.noContent(); + } } diff --git a/src/main/java/org/withtime/be/withtimebe/domain/member/entity/Member.java b/src/main/java/org/withtime/be/withtimebe/domain/member/entity/Member.java index 9969f52..9805709 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/member/entity/Member.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/member/entity/Member.java @@ -2,6 +2,8 @@ import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.SQLRestriction; import org.withtime.be.withtimebe.domain.member.entity.enums.Gender; import org.withtime.be.withtimebe.domain.member.entity.enums.Role; import org.withtime.be.withtimebe.domain.member.entity.enums.UserRank; @@ -16,6 +18,8 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) @Table(name = "member") +@SQLDelete(sql = "UPDATE member SET deleted_at = NOW() WHERE member_id = ?") +@SQLRestriction(value = "deleted_at IS NULL") public class Member extends BaseEntity { @Id diff --git a/src/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandService.java b/src/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandService.java index eed5c12..a721b3c 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandService.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandService.java @@ -7,4 +7,5 @@ public interface MemberCommandService { void changePassword(Member member, MemberRequestDTO.ChangePassword request); void changePassword(String email, String password); Member changeInfo(Long memberId, MemberRequestDTO.ChangeInfo request); + void deleteMember(Long memberId); } diff --git a/src/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandServiceImpl.java b/src/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandServiceImpl.java index 48f16ec..3f3a08f 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandServiceImpl.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/member/service/command/MemberCommandServiceImpl.java @@ -46,6 +46,11 @@ public Member changeInfo(Long memberId, MemberRequestDTO.ChangeInfo request) { return member; } + @Override + public void deleteMember(Long memberId) { + memberRepository.deleteById(memberId); + } + public void validateChangePassword(Member member, String password) throws ServerApplicationException { String memberPassword = member.getPassword(); if (memberPassword == null) {