Skip to content

Commit

Permalink
refactor: 회원 탈퇴 시, 쿠키 삭제 및 비즈니스 로직 리팩토링
Browse files Browse the repository at this point in the history
* feat: 회원 탈퇴 시, 쿠키 제거 로직 추가

* feat: 회원 탈퇴 시, databse에 저장된 토큰 제거 기능 추가

* refactor: oauth login시, memberService 호출 매개변수 리팩토링

* refactor: Member Oauth Identifier 생성 로직 리팩토링
  • Loading branch information
YongsHub authored Oct 22, 2023
1 parent fe0d21c commit 35214e7
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public EnvelopeResponse<CreateMemberTokensResDto> login(
AuthenticatedMember authenticatedMember = memberService.createMemberByOauthIdentifier(postMemberReqDto);
CreateMemberTokensResDto createMemberTokensResDto = authService.createToken(authenticatedMember);

Member member = memberService.saveTokenByMember(authenticatedMember, createMemberTokensResDto);
Member member = memberService.saveTokenByMember(authenticatedMember.getMemberId(), createMemberTokensResDto);

cookieProvider.setResponseWithCookies(
response,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.ssafy.ssafsound.domain.member.controller;

import com.ssafy.ssafsound.domain.auth.dto.AuthenticatedMember;
import com.ssafy.ssafsound.domain.auth.service.CookieProvider;
import com.ssafy.ssafsound.domain.auth.validator.Authentication;
import com.ssafy.ssafsound.domain.member.dto.*;
import com.ssafy.ssafsound.domain.member.service.MemberService;
import com.ssafy.ssafsound.global.common.response.EnvelopeResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

@RestController
Expand All @@ -16,6 +18,7 @@
public class MemberController {

private final MemberService memberService;
private final CookieProvider cookieProvider;

@GetMapping
public EnvelopeResponse<GetMemberResDto> getMemberInformation(
Expand Down Expand Up @@ -165,9 +168,11 @@ public EnvelopeResponse<Void> changeMemberNickname(
}

@DeleteMapping
public EnvelopeResponse<Void> leaveMember(@Authentication AuthenticatedMember authenticatedMember) {
public EnvelopeResponse<Void> leaveMember(
@Authentication AuthenticatedMember authenticatedMember,
HttpServletResponse response) {
memberService.leaveMember(authenticatedMember.getMemberId());

cookieProvider.setResponseWithCookies(response, null, null);
return EnvelopeResponse.<Void>builder()
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

public interface MemberRepository extends JpaRepository<Member, Long> {

Optional<Member> findByOauthIdentifier(String oauthIdentifier);
Member findByOauthIdentifier(String oauthIdentifier);

boolean existsByNickname(String nickname);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;

Expand All @@ -55,33 +56,30 @@ public class MemberService {

@Transactional
public AuthenticatedMember createMemberByOauthIdentifier(PostMemberReqDto postMemberReqDto) {
Optional<Member> optionalMember = memberRepository.findByOauthIdentifier(postMemberReqDto.getOauthIdentifier());
Member member;
if (optionalMember.isPresent()) {
member = optionalMember.get();
if (isInvalidOauthLogin(member, postMemberReqDto)) {
throw new MemberException(MemberErrorInfo.MEMBER_OAUTH_NOT_FOUND);
} else if(isDeletedMember(member)) {
throw new MemberException(MemberErrorInfo.MEMBER_DELETED);
}
return AuthenticatedMember.from(member);
} else {
Member member = memberRepository.findByOauthIdentifier(postMemberReqDto.getOauthIdentifier());

if (Objects.isNull(member)) {
MemberRole memberRole = findMemberRoleByRoleName("user");
member = postMemberReqDto.createMember();
member.setMemberRole(memberRole);
return AuthenticatedMember.from(memberRepository.save(member));
} else if (isInvalidOauthLogin(member, postMemberReqDto)) {
throw new MemberException(MemberErrorInfo.MEMBER_OAUTH_NOT_FOUND);
} else if (isDeletedMember(member)) {
throw new MemberException(MemberErrorInfo.MEMBER_DELETED);
}

return AuthenticatedMember.from(member);
}

@Transactional
public Member saveTokenByMember(
AuthenticatedMember authenticatedMember,
Long memberId,
CreateMemberTokensResDto createMemberTokensResDto) {
Member member = memberRepository.findById(authenticatedMember.getMemberId())
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new MemberException(MemberErrorInfo.MEMBER_NOT_FOUND_BY_ID));

Optional<MemberToken> memberTokenOptional = memberTokenRepository
.findById(authenticatedMember.getMemberId());
Optional<MemberToken> memberTokenOptional = memberTokenRepository.findById(memberId);

memberTokenOptional.ifPresentOrElse(
memberToken -> changeMemberTokens(memberToken, createMemberTokensResDto),
Expand Down Expand Up @@ -204,6 +202,7 @@ public void leaveMember(Long memberId) {
Member member = getMemberByMemberIdOrThrowException(memberId);
member.setAccountStateDeleted();
member.changeNickname("@" + member.getId());
memberTokenRepository.deleteById(memberId);
applicationEventPublisher.publishEvent(new MemberLeavedEvent(member.getId()));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ void Given_OauthIdentifier_When_SaveMember_Then_Success() {
Member member = memberFixture.createGeneralMember();
PostMemberReqDto postMemberReqDto = memberFixture.createPostMemberReqDto();
given(memberRepository.findByOauthIdentifier(postMemberReqDto.getOauthIdentifier()))
.willReturn(Optional.empty());
.willReturn(null);
given(memberRoleRepository.findByRoleType("user")).willReturn(Optional.of(member.getRole()));
given(memberRepository.save(any())).willReturn(member);

Expand All @@ -102,7 +102,7 @@ void Given_ExistOauthIdentifier_When_FindMember_Then_Success() {
Member member = memberFixture.createGeneralMember();
PostMemberReqDto postMemberReqDto = memberFixture.createPostMemberReqDto();
given(memberRepository.findByOauthIdentifier(postMemberReqDto.getOauthIdentifier()))
.willReturn(Optional.of(member));
.willReturn(member);
//when
AuthenticatedMember response = memberService.createMemberByOauthIdentifier(postMemberReqDto);

Expand All @@ -122,7 +122,7 @@ void Given_OauthIdentifier_When_CompareIncorrectRequest_Then_ThrowException() {
PostMemberReqDto postMemberReqDto = memberFixture.createPostMemberReqDto();
Member member = memberFixture.createInitializerMember();
given(memberRepository.findByOauthIdentifier(postMemberReqDto.getOauthIdentifier()))
.willReturn(Optional.of(member));
.willReturn(member);

//when, then
assertThrows(MemberException.class,
Expand All @@ -138,65 +138,58 @@ void Given_OauthIdentifier_When_CompareIncorrectRequest_Then_ThrowException() {
void Given_Tokens_When_InitializeMember_Then_Success() {
//given
Member member = memberFixture.createInitializerMember();
AuthenticatedMember authenticatedMember = AuthenticatedMember.from(member);
given(memberTokenRepository.findById(authenticatedMember.getMemberId()))
.willReturn(Optional.empty());
given(memberRepository.findById(authenticatedMember.getMemberId()))
.willReturn(Optional.of(member));
given(memberTokenRepository.findById(member.getId())).willReturn(Optional.empty());
given(memberRepository.findById(member.getId())).willReturn(Optional.of(member));

//when
Member response = memberService
.saveTokenByMember(authenticatedMember, memberFixture.createMemberTokensResDto());
Member response = memberService.saveTokenByMember(member.getId(), memberFixture.createMemberTokensResDto());

//then
assertAll(
() -> assertEquals(response.getId(), authenticatedMember.getMemberId()),
() -> assertEquals(response.getRole().getRoleType(), authenticatedMember.getMemberRole())
() -> assertEquals(response.getId(), member.getId()),
() -> assertEquals(response.getRole().getRoleType(), member.getRole().getRoleType())
);


//verify
verify(memberTokenRepository, times(1))
.findById(authenticatedMember.getMemberId());
verify(memberRepository, times(1))
.findById(authenticatedMember.getMemberId());
verify(memberTokenRepository, times(1)).findById(member.getId());
verify(memberRepository, times(1)).findById(member.getId());
}

@Test
@DisplayName("Member가 토큰을 발급한 적이 있다면 새로운 토큰들로 저장한다.")
void Given_Tokens_When_JoinedMember_Then_SuccessExchangeTokens() {
//given
MemberToken memberToken = memberFixture.createMemberToken();
AuthenticatedMember authenticatedMember = AuthenticatedMember.from(memberToken.getMember());
given(memberRepository.findById(authenticatedMember.getMemberId()))
.willReturn(Optional.of(memberToken.getMember()));
given(memberTokenRepository.findById(authenticatedMember.getMemberId()))
.willReturn(Optional.of(memberToken));
MemberToken memberToken = memberFixture.createMemberToken(memberFixture.createGeneralMember());
Long memberId = memberToken.getId();
given(memberRepository.findById(memberId)).willReturn(Optional.of(memberToken.getMember()));
given(memberTokenRepository.findById(memberId)).willReturn(Optional.of(memberToken));

//when
Member response = memberService.saveTokenByMember(authenticatedMember, memberFixture.createMemberTokensResDto());
Member response = memberService.saveTokenByMember(memberToken.getId(), memberFixture.createMemberTokensResDto());

//then
assertAll(
() -> assertEquals(response.getId(), authenticatedMember.getMemberId()),
() -> assertEquals(response.getRole().getRoleType(), authenticatedMember.getMemberRole())
() -> assertEquals(response.getId(), memberId),
() -> assertEquals(response.getRole().getRoleType(), memberToken.getMember().getRole().getRoleType())
);

//verify
verify(memberRepository, times(1)).findById(authenticatedMember.getMemberId());
verify(memberTokenRepository, times(1)).findById(authenticatedMember.getMemberId());
verify(memberRepository, times(1)).findById(memberId);
verify(memberTokenRepository, times(1)).findById(memberId);
}

@Test
@DisplayName("가입이 안된 Member라면 토큰 발급을 시도하면 예외가 발생한다.")
void Given_Member_When_NotJoinedMember_Then_ThrowMemberException() {
//given
AuthenticatedMember authenticatedMember = AuthenticatedMember.from(memberFixture.createInitializerMember());
Long memberId = authenticatedMember.getMemberId();
given(memberRepository.findById(any())).willReturn(Optional.empty());

//when, then
assertThrows(MemberException.class,
() -> memberService.saveTokenByMember(authenticatedMember, memberFixture.createMemberTokensResDto()));
() -> memberService.saveTokenByMember(memberId, memberFixture.createMemberTokensResDto()));

//verify
verify(memberRepository, times(1)).findById(authenticatedMember.getMemberId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,9 +284,10 @@ public CreateMemberTokensResDto createMemberTokensResDto() {
.build();
}

public MemberToken createMemberToken() {
public MemberToken createMemberToken(Member member) {
return MemberToken.builder()
.member(createGeneralMember())
.id(member.getId())
.member(member)
.accessToken(AuthFixture.accessToken)
.refreshToken(AuthFixture.refreshToken)
.build();
Expand Down

0 comments on commit 35214e7

Please sign in to comment.