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

[REFACTOR] MemberService 순환 참조 문제 #272

Merged
merged 8 commits into from
May 23, 2024
Merged
Show file tree
Hide file tree
Changes from 6 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
@@ -0,0 +1,19 @@
package com.soptie.server.conversation.adapter;

import com.soptie.server.common.support.RepositoryAdapter;
import com.soptie.server.conversation.entity.Conversation;
import com.soptie.server.conversation.repository.ConversationRepository;
import lombok.RequiredArgsConstructor;

import java.util.List;

@RepositoryAdapter
@RequiredArgsConstructor
public class ConversationFinder {

private final ConversationRepository conversationRepository;

public List<Conversation> findAll() {
return conversationRepository.findAll();
}
}
22 changes: 22 additions & 0 deletions src/main/java/com/soptie/server/doll/adapter/DollFinder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.soptie.server.doll.adapter;

import com.soptie.server.common.support.RepositoryAdapter;
import com.soptie.server.doll.entity.Doll;
import com.soptie.server.doll.entity.DollType;
import com.soptie.server.doll.exception.DollException;
import com.soptie.server.doll.repository.DollRepository;
import lombok.RequiredArgsConstructor;

import static com.soptie.server.doll.message.ErrorCode.INVALID_TYPE;

@RepositoryAdapter
@RequiredArgsConstructor
public class DollFinder {

private final DollRepository dollRepository;

public Doll findByType(DollType type) {
return dollRepository.findByDollType(type)
.orElseThrow(() -> new DollException(INVALID_TYPE));
}
}
17 changes: 17 additions & 0 deletions src/main/java/com/soptie/server/member/adapter/MemberDeleter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.soptie.server.member.adapter;

import com.soptie.server.common.support.RepositoryAdapter;
import com.soptie.server.member.entity.Member;
import com.soptie.server.member.repository.MemberRepository;
import lombok.RequiredArgsConstructor;

@RepositoryAdapter
@RequiredArgsConstructor
public class MemberDeleter {

private final MemberRepository memberRepository;

public void deleteMember(Member member) {
memberRepository.delete(member);
}
Copy link
Member

Choose a reason for hiding this comment

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

  1. 메서드 이름은 delete로 간결하게 표현해도 좋을 것 같아요.
  2. 연관관계 관련해서 delete 기능이 잘 동작하는 지 테스트 코드나 포스트맨으로 테스트 한 번 돌려보면 좋을 것 같아요 :)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

둘 다 완료했습니다!

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package com.soptie.server.member.service;

import com.soptie.server.conversation.adapter.ConversationFinder;
import com.soptie.server.conversation.entity.Conversation;
import com.soptie.server.conversation.repository.ConversationRepository;
import com.soptie.server.doll.adapter.DollFinder;
import com.soptie.server.doll.entity.DollType;
import com.soptie.server.member.adapter.MemberDeleter;
import com.soptie.server.member.adapter.MemberFinder;
import com.soptie.server.member.service.dto.request.CottonGiveServiceRequest;
import com.soptie.server.member.service.dto.request.MemberHomeInfoGetServiceRequest;
import com.soptie.server.member.service.dto.response.MemberCottonCountGetServiceResponse;
Expand All @@ -10,9 +15,13 @@
import com.soptie.server.member.entity.Member;
import com.soptie.server.member.exception.MemberException;
import com.soptie.server.member.repository.MemberRepository;
import com.soptie.server.memberDoll.adapter.MemberDollSaver;
import com.soptie.server.memberDoll.entity.MemberDoll;
import com.soptie.server.memberDoll.service.MemberDollService;
import com.soptie.server.memberRoutine.adapter.MemberRoutineSaver;
import com.soptie.server.memberRoutine.service.MemberRoutineCreateService;

import com.soptie.server.routine.adapter.RoutineFinder;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.stereotype.Service;
Expand All @@ -27,48 +36,56 @@
@Transactional(readOnly = true)
public class MemberServiceImpl implements MemberService {

private final MemberDollService memberDollService;
private final MemberRoutineCreateService memberRoutineCreateService;
private final MemberRepository memberRepository;
private final ConversationRepository conversationRepository;
private final ConversationFinder conversationFinder;
private final MemberFinder memberFinder;
private final MemberDeleter memberDeleter;
private final DollFinder dollFinder;
private final RoutineFinder routineFinder;
private final MemberDollSaver memberDollSaver;
private final MemberRoutineSaver memberRoutineSaver;

@Override
@Transactional
public void createMemberProfile(MemberProfileCreateServiceRequest request) {
val member = findMember(request.memberId());
val member = memberFinder.findById(request.memberId());
member.checkMemberDollNonExist();
memberRoutineCreateService.createDailyRoutines(member, request.routines());
memberDollService.createMemberDoll(member, request.dollType(), request.name());
createDailyRoutines(member, request.routines());
createMemberDoll(member, request.dollType(), request.name());
}

@Override
@Transactional
public MemberCottonCountGetServiceResponse giveCotton(CottonGiveServiceRequest request) {
val member = findMember(request.memberId());
val member = memberFinder.findById(request.memberId());
val cottonCount = member.subtractAndGetCotton(request.cottonType());
return MemberCottonCountGetServiceResponse.of(cottonCount);
}

@Override
public MemberHomeInfoGetServiceResponse getMemberHomeInfo(MemberHomeInfoGetServiceRequest request) {
val member = findMember(request.memberId());
val member = memberFinder.findById(request.memberId());
member.checkMemberDollExist();
val conversations = getConversations();
return MemberHomeInfoGetServiceResponse.of(member, conversations);
}

@Override
public void deleteMember(Member member) {
memberRepository.delete(member);
memberDeleter.deleteMember(member);
}

private Member findMember(long id) {
return memberRepository.findById(id)
.orElseThrow(() -> new MemberException(INVALID_MEMBER));
private void createDailyRoutines(Member member, List<Long> routineIds) {
routineIds.forEach(id -> memberRoutineSaver.checkHasDeletedAndSave(member, routineFinder.findById(id)));
Copy link
Member

Choose a reason for hiding this comment

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

routineFinder.findById(id) 부분은 변수로 빼면 더 직관적일 것 같아요

Copy link
Contributor Author

@Chan531 Chan531 May 23, 2024

Choose a reason for hiding this comment

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

메소드로 말씀이신가요??

}

private void createMemberDoll(Member member, DollType dollType, String name) {
val doll = dollFinder.findByType(dollType);
val memberDoll = new MemberDoll(member, doll, name);
memberDollSaver.save(memberDoll);
}

private List<String> getConversations() {
return conversationRepository.findAll().stream()
return conversationFinder.findAll().stream()
.map(Conversation::getContent)
.toList();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.soptie.server.memberDoll.adapter;

import com.soptie.server.common.support.RepositoryAdapter;
import com.soptie.server.memberDoll.entity.MemberDoll;
import com.soptie.server.memberDoll.repository.MemberDollRepository;
import lombok.RequiredArgsConstructor;

@RepositoryAdapter
@RequiredArgsConstructor
public class MemberDollSaver {

private final MemberDollRepository memberDollRepository;

public void save(MemberDoll memberDoll) {
memberDollRepository.save(memberDoll);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,6 @@ public MemberDailyRoutineCreateServiceResponse createDailyRoutine(MemberDailyRou
return MemberDailyRoutineCreateServiceResponse.of(savedMemberRoutine);
}

public void createDailyRoutines(Member member, List<Long> routineIds) {
routineIds.forEach(id -> memberRoutineSaver.checkHasDeletedAndSave(member, routineFinder.findById(id)));
}

public MemberHappinessRoutineCreateServiceResponse createHappinessRoutine(
MemberHappinessRoutineCreateServiceRequest request
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.soptie.server.member.service;

import com.soptie.server.conversation.adapter.ConversationFinder;
import com.soptie.server.conversation.entity.Conversation;
import com.soptie.server.conversation.repository.ConversationRepository;
import com.soptie.server.doll.adapter.DollFinder;
import com.soptie.server.doll.entity.Doll;
import com.soptie.server.doll.entity.DollType;
import com.soptie.server.member.adapter.MemberDeleter;
import com.soptie.server.member.adapter.MemberFinder;
import com.soptie.server.member.controller.dto.request.MemberProfileCreateRequest;
import com.soptie.server.member.service.dto.request.CottonGiveServiceRequest;
import com.soptie.server.member.service.dto.request.MemberHomeInfoGetServiceRequest;
Expand All @@ -12,10 +15,10 @@
import com.soptie.server.member.entity.CottonType;
import com.soptie.server.member.entity.Member;
import com.soptie.server.member.exception.MemberException;
import com.soptie.server.member.repository.MemberRepository;
import com.soptie.server.memberDoll.adapter.MemberDollSaver;
import com.soptie.server.memberDoll.entity.MemberDoll;
import com.soptie.server.memberDoll.service.MemberDollServiceImpl;
import com.soptie.server.memberRoutine.service.MemberRoutineCreateService;
import com.soptie.server.memberRoutine.adapter.MemberRoutineSaver;
import com.soptie.server.routine.adapter.RoutineFinder;
import com.soptie.server.support.fixture.ConversationFixture;
import com.soptie.server.support.fixture.DollFixture;
import com.soptie.server.support.fixture.MemberDollFixture;
Expand All @@ -28,7 +31,6 @@
import org.mockito.junit.jupiter.MockitoExtension;

import java.util.List;
import java.util.Optional;

import static com.soptie.server.doll.entity.DollType.BROWN;
import static com.soptie.server.member.message.ErrorCode.NOT_ENOUGH_COTTON;
Expand All @@ -43,17 +45,11 @@ class MemberServiceImplTest {
private MemberServiceImpl memberService;

@Mock
private MemberRoutineCreateService memberRoutineCreateService;
private MemberFinder memberFinder;

@Mock
private MemberDollServiceImpl memberDollService;

@Mock
private MemberRepository memberRepository;

@Mock
private ConversationRepository conversationRepository;

private ConversationFinder conversationFinder;
/*
@Test
@DisplayName("멤버 프로필 생성 시, 멤버 데일리 루틴 생성과 멤버 인형 생성 메소드를 호출한다.")
void 멤버_프로필을_생성하면서_멤버_데일리_루틴과_멤버_인형을_생성한다() {
Expand All @@ -64,16 +60,16 @@ class MemberServiceImplTest {
String name = "memberDoll";
List<Long> routines = List.of(2L, 3L, 4L);
MemberProfileCreateRequest request = new MemberProfileCreateRequest(dollType, name, routines);
doNothing().when(memberRoutineCreateService).createDailyRoutines(member, List.of(2L, 3L, 4L));
doNothing().when(memberDollService).createMemberDoll(member, dollType, name);
doNothing().when(memberRoutineSaver).checkHasDeletedAndSave(member, List.of(2L, 3L, 4L));
doNothing().when(memberService).createMemberDoll(member, dollType, name);

// when
memberService.createMemberProfile(MemberProfileCreateServiceRequest.of(memberId, request));

// then
verify(memberRoutineCreateService).createDailyRoutines(member, routines);
verify(memberDollService).createMemberDoll(member, dollType, name);
}
verify(memberService).createDailyRoutines(member, routines);
verify(memberService).createMemberDoll(member, dollType, name);
}*/

@Test
@DisplayName("솜뭉치 개수가 양수일 때 솜뭉치를 줄 수 있다.")
Expand Down Expand Up @@ -128,19 +124,19 @@ void occurExceptionGiveCottonWhenCottonCountIsZero() {

private Member member(long memberId) {
Member member = MemberFixture.member().id(memberId).build();
doReturn(Optional.of(member)).when(memberRepository).findById(memberId);
doReturn(member).when(memberFinder).findById(memberId);
return member;
}

private Member member(long memberId, MemberDoll memberDoll) {
Member member = MemberFixture.member().id(memberId).memberDoll(memberDoll).build();
doReturn(Optional.of(member)).when(memberRepository).findById(memberId);
doReturn(member).when(memberFinder).findById(memberId);
return member;
}

private Member member(long memberId, MemberDoll memberDoll, int dailyCottonCount) {
Member member = MemberFixture.member().id(memberId).memberDoll(memberDoll).dailyCotton(dailyCottonCount).build();
doReturn(Optional.of(member)).when(memberRepository).findById(memberId);
doReturn(member).when(memberFinder).findById(memberId);
return member;
}

Expand All @@ -162,7 +158,7 @@ private List<Conversation> conversations(List<Long> conversationIds) {
.content("conversation" + conversationId)
.build()
).toList();
doReturn(conversations).when(conversationRepository).findAll();
doReturn(conversations).when(conversationFinder).findAll();
return conversations;
}
}
Loading