diff --git a/src/main/java/com/divary/domain/logbase/logbook/service/LogBookService.java b/src/main/java/com/divary/domain/logbase/logbook/service/LogBookService.java index 6ea330f..c15af8b 100644 --- a/src/main/java/com/divary/domain/logbase/logbook/service/LogBookService.java +++ b/src/main/java/com/divary/domain/logbase/logbook/service/LogBookService.java @@ -1,7 +1,7 @@ package com.divary.domain.logbase.logbook.service; import com.divary.domain.member.entity.Member; -import com.divary.domain.member.service.MemberServiceImpl; +import com.divary.domain.member.service.MemberService; import com.divary.domain.logbase.LogBaseInfo; import com.divary.domain.logbase.LogBaseInfoRepository; import com.divary.domain.logbase.logbook.dto.request.*; @@ -33,7 +33,7 @@ public class LogBookService { private final LogBaseInfoRepository logBaseInfoRepository; private final LogBookRepository logBookRepository; private final CompanionRepository companionRepository; - private final MemberServiceImpl memberService; + private final MemberService memberService; @Transactional public LogBaseCreateResultDTO createLogBase diff --git a/src/main/java/com/divary/domain/member/controller/MemberController.java b/src/main/java/com/divary/domain/member/controller/MemberController.java index 12d9fc0..52cd5ee 100644 --- a/src/main/java/com/divary/domain/member/controller/MemberController.java +++ b/src/main/java/com/divary/domain/member/controller/MemberController.java @@ -5,6 +5,7 @@ import com.divary.domain.member.dto.requestDTO.MyPageLevelRequestDTO; import com.divary.domain.member.dto.response.MyPageImageResponseDTO; import com.divary.domain.member.dto.response.MyPageProfileResponseDTO; +import com.divary.domain.member.facade.MyPageFacade; import com.divary.global.config.SwaggerConfig; import com.divary.global.config.security.CustomUserPrincipal; import com.divary.global.exception.ErrorCode; @@ -22,6 +23,7 @@ @RequiredArgsConstructor public class MemberController { private final MemberService memberService; + private final MyPageFacade myPageFacade; @PatchMapping("/level") @SwaggerConfig.ApiSuccessResponse(dataType = Void.class) @@ -53,7 +55,7 @@ public ApiResponse updateGroup(@AuthenticationPrincipal CustomUserPrincipal user @SwaggerConfig.ApiSuccessResponse(dataType = Void.class) @SwaggerConfig.ApiErrorExamples(value = {ErrorCode.AUTHENTICATION_REQUIRED}) public ApiResponse getProfile(@AuthenticationPrincipal CustomUserPrincipal userPrincipal){ - MyPageProfileResponseDTO responseDTO = memberService.getMemberProfile(userPrincipal.getId()); + MyPageProfileResponseDTO responseDTO = myPageFacade.getMemberProfile(userPrincipal.getId()); return ApiResponse.success(responseDTO); } diff --git a/src/main/java/com/divary/domain/member/facade/MyPageFacade.java b/src/main/java/com/divary/domain/member/facade/MyPageFacade.java new file mode 100644 index 0000000..1c21b5d --- /dev/null +++ b/src/main/java/com/divary/domain/member/facade/MyPageFacade.java @@ -0,0 +1,55 @@ +package com.divary.domain.member.facade; + +import com.divary.domain.logbase.logbook.service.LogBookService; +import com.divary.domain.member.dto.response.MyPageProfileResponseDTO; +import com.divary.domain.member.entity.Member; +import com.divary.domain.member.service.MemberService; +import com.divary.global.exception.BusinessException; +import com.divary.global.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * MyPage Facade + * 여러 도메인 서비스를 조합하여 마이페이지 관련 비즈니스 로직을 처리합니다. + * + * 목적: + * 1. MemberService와 LogBookService 간의 순환참조 제거 + * 2. 여러 도메인의 데이터를 조합하는 책임 분리 + * 3. 향후 소셜 기능(친구 등) 추가 시 확장성 확보 + */ +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MyPageFacade { + + private final MemberService memberService; + private final LogBookService logBookService; + + /** + * 마이페이지 프로필 정보 조회 + * Member 정보와 LogBook 누적 횟수를 조합하여 반환 + * + * @param userId 사용자 ID + * @return 마이페이지 프로필 정보 + */ + public MyPageProfileResponseDTO getMemberProfile(Long userId) { + // 1. Member 도메인 데이터 조회 + Member member = memberService.findById(userId); + + // 2. LogBook 도메인 데이터 조회 + Integer accumulation = logBookService.getAccumulationById(userId); + + // 3. 비즈니스 로직: 이메일에서 ID 추출 + String memberIdByEmail = member.getEmail().split("@")[0]; + + // 4. DTO 조합 및 반환 + return MyPageProfileResponseDTO.builder() + .memberGroup(member.getMemberGroup()) + .level(member.getLevel()) + .id(memberIdByEmail) + .accumulations(accumulation) + .build(); + } +} diff --git a/src/main/java/com/divary/domain/member/service/MemberService.java b/src/main/java/com/divary/domain/member/service/MemberService.java index 47f8b2f..e27aee1 100644 --- a/src/main/java/com/divary/domain/member/service/MemberService.java +++ b/src/main/java/com/divary/domain/member/service/MemberService.java @@ -3,7 +3,6 @@ import com.divary.common.enums.SocialType; import com.divary.domain.member.dto.requestDTO.MyPageGroupRequestDTO; import com.divary.domain.member.dto.response.MyPageImageResponseDTO; -import com.divary.domain.member.dto.response.MyPageProfileResponseDTO; import com.divary.domain.member.entity.Member; import com.divary.domain.member.dto.requestDTO.MyPageLevelRequestDTO; import com.divary.global.oauth.dto.response.DeactivateResponse; @@ -21,7 +20,5 @@ public interface MemberService { void updateGroup(Long userId, MyPageGroupRequestDTO requestDTO); - MyPageProfileResponseDTO getMemberProfile(Long userId); - MyPageImageResponseDTO getLicenseImage(Long userId); } diff --git a/src/main/java/com/divary/domain/member/service/MemberServiceImpl.java b/src/main/java/com/divary/domain/member/service/MemberServiceImpl.java index cbceec4..ad3f3d7 100644 --- a/src/main/java/com/divary/domain/member/service/MemberServiceImpl.java +++ b/src/main/java/com/divary/domain/member/service/MemberServiceImpl.java @@ -5,8 +5,6 @@ import com.divary.domain.image.dto.request.ImageUploadRequest; import com.divary.domain.image.dto.response.ImageResponse; import com.divary.domain.image.service.ImageService; -import com.divary.domain.logbase.logbook.enums.SaveStatus; -import com.divary.domain.logbase.logbook.service.LogBookService; import com.divary.domain.member.dto.requestDTO.MyPageGroupRequestDTO; import com.divary.domain.member.dto.requestDTO.MyPageLevelRequestDTO; import com.divary.domain.member.dto.response.MyPageImageResponseDTO; @@ -41,7 +39,6 @@ public class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository; private final ImageService imageService; private final TokenBlackListService tokenBlackListService; - private final LogBookService logBookService; @Value("${jobs.user-deletion.grace-period-days}") private int gracePeriodDays; @@ -199,24 +196,6 @@ public void updateGroup(Long userId, MyPageGroupRequestDTO requestDTO){ member.updateGroup(group); } - @Override - public MyPageProfileResponseDTO getMemberProfile(Long userId){ - Member member = memberRepository.findById(userId).orElseThrow(()->new BusinessException(ErrorCode.MEMBER_NOT_FOUND)); - - Integer accumulation - = logBookService.getAccumulationById(userId); - //현재기준으로 총 로그북 누적횟수 계산 - - String memberIdByEmail = member.getEmail().split("@")[0]; - // 프로필에 나오는 아이디: 이메일에서 @ 앞부분만 추출 - - return MyPageProfileResponseDTO.builder() - .memberGroup(member.getMemberGroup()) - .level(member.getLevel()) - .id(memberIdByEmail) - .accumulations(accumulation) - .build(); - } @Override public MyPageImageResponseDTO getLicenseImage(Long userId){