Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DELETE] 회원 탈퇴 #108

Merged
merged 4 commits into from
Jan 15, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,11 @@ public ResponseEntity<Response> signOut(Principal principal) {
authService.signOut(memberId);
return ResponseEntity.ok(success(SUCCESS_SIGN_OUT.getMessage(), null));
}

@DeleteMapping
public ResponseEntity<Response> withdrawal(Principal principal) {
val memberId = Long.parseLong(principal.getName());
authService.withdraw(memberId);
return ResponseEntity.ok(success(SUCCESS_WITHDRAWAL.getMessage()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public enum ResponseMessage {

SUCCESS_SIGN_IN("소셜로그인 성공"),
SUCCESS_SIGN_OUT("로그아웃 성공"),
SUCCESS_WITHDRAWAL("회원 탈퇴 성공"),
;

private final String message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ public interface AuthService {

SignInResponse signIn(String socialAccessToken, SignInRequest request);
void signOut(Long memberId);
void withdraw(Long memberId);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오늘 논의한대로 notNull을 보장하기 위해 long 타입을 사용하면 더 좋을 것 같아요!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분은 제가 Long 타입을 사용한게 너무 많아서 추후에 이슈 파서 한 번에 리팩토링하겠습니다!

}
46 changes: 46 additions & 0 deletions src/main/java/com/soptie/server/auth/service/AuthServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,19 @@
import com.soptie.server.member.entity.Member;
import com.soptie.server.member.entity.SocialType;
import com.soptie.server.member.repository.MemberRepository;
import com.soptie.server.memberDoll.service.MemberDollService;
import com.soptie.server.memberRoutine.service.CompletedMemberDailyRoutineService;
import com.soptie.server.memberRoutine.service.MemberDailyRoutineService;
import com.soptie.server.memberRoutine.service.MemberHappinessRoutineService;
import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Objects;

import static com.soptie.server.auth.message.ErrorMessage.INVALID_TOKEN;
import static com.soptie.server.member.message.ErrorMessage.INVALID_MEMBER;

Expand All @@ -27,6 +33,10 @@ public class AuthServiceImpl implements AuthService {
private final JwtTokenProvider jwtTokenProvider;
private final MemberRepository memberRepository;
private final KakaoService kakaoService;
private final MemberDailyRoutineService memberDailyRoutineService;
private final MemberHappinessRoutineService memberHappinessRoutineService;
private final MemberDollService memberDollService;
private final CompletedMemberDailyRoutineService completedMemberDailyRoutineService;
private final ValueConfig valueConfig;

@Override
Expand All @@ -42,6 +52,17 @@ public void signOut(Long memberId) {
member.resetRefreshToken();
}

@Override
@Transactional
public void withdraw(Long memberId) {
val member = findMember(memberId);
deleteMemberDoll(member);
deleteMemberDailyRoutines(member);
deleteMemberHappinessRoutine(member);
deleteCompletedMemberDailyRoutine(member);
deleteMember(member);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이번 리뷰를 달다가 든 생각인데,
각 delete 메서드에 Member를 넘기기보다는 해당 값
(예를 들면, deleteMemberDoll(member) -> deleteMemberDoll(memger.getMemberDoll())
을 인자로 넘기는 방법을 사용하면 더 직관적일 것이라고 생각되는데 어떤가요??

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

뭔가 모든 메서드가 member를 넘기다보니까 member를 넘기게 됐습니다...ㅋㅋㅋ
원래 리뷰해주신 거처럼 메서드를 작성했다가 오히려 다시 member를 넘기는 걸로 고쳤는데 ㅠㅠ
생각해보니 처음부터 memberDoll을 넘겨서 뒤에서 member.getMemberDoll()을 두 번 호출할 일을 줄이는게 좋은 거 같아 리뷰 반영해두었습니다!

}

private Member getMember(String socialAccessToken, SignInRequest request) {
val socialType = request.socialType();
val socialId = getSocialId(socialAccessToken, socialType);
Expand Down Expand Up @@ -85,4 +106,29 @@ private Member findMember(Long id) {
return memberRepository.findById(id)
.orElseThrow(() -> new EntityNotFoundException(INVALID_MEMBER.getMeesage()));
}

private void deleteMemberDoll(Member member) {
if (Objects.nonNull(member.getMemberDoll())) {
memberDollService.deleteMemberDoll(member.getMemberDoll());
}
}

private void deleteMemberDailyRoutines(Member member) {
member.getDailyRoutines()
.forEach(memberDailyRoutineService::deleteMemberDailyRoutine);
}

private void deleteMemberHappinessRoutine(Member member) {
if (Objects.nonNull(member.getHappinessRoutine())) {
memberHappinessRoutineService.deleteMemberHappinessRoutine(member.getHappinessRoutine());
}
}

private void deleteCompletedMemberDailyRoutine(Member member) {
completedMemberDailyRoutineService.deleteCompletedMemberDailyRoutine(member);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CompletedMemberDailyRoutine도 한 회원이 여러 개를 가질 수 있기 때문에,
메서드명은 복수형을 활용하여 deleteCompletedMemberDailyRoutines 를 사용해도 좋을 것 같아요!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 맞네요 중복 리뷰 죄송합니다ㅠㅠ


private void deleteMember(Member member) {
memberRepository.delete(member);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.soptie.server.memberDoll.repository;

import com.soptie.server.member.entity.Member;
import com.soptie.server.memberDoll.entity.MemberDoll;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberDollRepository extends JpaRepository<MemberDoll, Long> {
void deleteByMember(Member member);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import com.soptie.server.doll.entity.DollType;
import com.soptie.server.member.entity.Member;
import com.soptie.server.memberDoll.entity.MemberDoll;

public interface MemberDollService {

void createMemberDoll(Member member, DollType dollType, String name);
void deleteMemberDoll(MemberDoll memberDoll);
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ public void createMemberDoll(Member member, DollType dollType, String name) {
memberDollRepository.save(memberDoll);
}

@Override
@Transactional
public void deleteMemberDoll(MemberDoll memberDoll) {
memberDollRepository.delete(memberDoll);
}

private Doll getDoll(DollType type) {
return dollRepository.findByDollType(type)
.orElseThrow(() -> new EntityNotFoundException(INVALID_TYPE.getMessage()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@

public interface CompletedMemberDailyRoutineRepository extends JpaRepository<CompletedMemberDailyRoutine, Long> {
Optional<CompletedMemberDailyRoutine> findByMemberAndRoutine(Member member, DailyRoutine routine);
void deleteAllByMember(Member member);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.soptie.server.memberRoutine.service;

import com.soptie.server.member.entity.Member;

public interface CompletedMemberDailyRoutineService {

void deleteCompletedMemberDailyRoutine(Member member);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.soptie.server.memberRoutine.service;

import com.soptie.server.member.entity.Member;
import com.soptie.server.memberRoutine.repository.CompletedMemberDailyRoutineRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class CompletedMemberDailyRoutineServiceImpl implements CompletedMemberDailyRoutineService {

private final CompletedMemberDailyRoutineRepository completedMemberDailyRoutineRepository;

public void deleteCompletedMemberDailyRoutine(Member member) {
completedMemberDailyRoutineRepository.deleteAllByMember(member);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Override를 붙이지 않은 이유가 있나요??

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@OverRide@transactional 누락했습니다...ㅠ 수정했습니다

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.soptie.server.memberRoutine.dto.MemberDailyRoutineRequest;
import com.soptie.server.memberRoutine.dto.MemberDailyRoutineResponse;
import com.soptie.server.memberRoutine.dto.MemberDailyRoutinesResponse;
import com.soptie.server.memberRoutine.entity.daily.MemberDailyRoutine;

import java.util.List;

Expand All @@ -15,4 +16,5 @@ public interface MemberDailyRoutineService {
AchievedMemberDailyRoutineResponse achieveMemberDailyRoutine(long memberId, Long routineId);
MemberDailyRoutinesResponse getMemberDailyRoutines(long memberId);
void initMemberDailyRoutines();
void deleteMemberDailyRoutine(MemberDailyRoutine routine);
}
Original file line number Diff line number Diff line change
Expand Up @@ -148,4 +148,10 @@ public void initMemberDailyRoutines() {
val routines = memberDailyRoutineRepository.findAllByAchieved();
routines.forEach(MemberDailyRoutine::initAchievement);
}

@Override
@Transactional
public void deleteMemberDailyRoutine(MemberDailyRoutine routine) {
memberDailyRoutineRepository.delete(routine);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.soptie.server.memberRoutine.service;

import com.soptie.server.memberRoutine.dto.*;
import com.soptie.server.memberRoutine.entity.happiness.MemberHappinessRoutine;

public interface MemberHappinessRoutineService {

MemberHappinessRoutineResponse createMemberHappinessRoutine(Long memberId, MemberHappinessRoutineRequest request);
MemberHappinessRoutinesResponse getMemberHappinessRoutine(Long memberId);
void deleteMemberHappinessRoutine(Long memberId, Long routineId);
void achieveMemberHappinessRoutine(Long memberId, Long routineId);
void deleteMemberHappinessRoutine(MemberHappinessRoutine routine);
}
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,10 @@ private void checkRoutineForMember(Member member, MemberHappinessRoutine routine
throw new IllegalStateException(INACCESSIBLE_ROUTINE.getMeesage());
}
}

@Override
@Transactional
public void deleteMemberHappinessRoutine(MemberHappinessRoutine routine) {
memberHappinessRoutineRepository.delete(routine);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.List;

import com.soptie.server.member.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;

import com.soptie.server.routine.entity.daily.DailyRoutine;
Expand Down
Loading