From 89391e398d60fa055e5ec4c6901fb123af4515df Mon Sep 17 00:00:00 2001 From: JuHyuk Lim Date: Sat, 11 Oct 2025 13:20:14 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=EC=97=86=EB=8A=94=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=EC=9D=98=20=ED=8F=B0=ED=8A=B8=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=8B=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../font/service/FontServiceImpl.java | 74 +++++++++++-------- .../controller/port/MemberLookupService.java | 3 + .../service/MemberLookupServiceImpl.java | 23 +++++- 3 files changed, 70 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/fontory/fontorybe/font/service/FontServiceImpl.java b/src/main/java/org/fontory/fontorybe/font/service/FontServiceImpl.java index 6acd81e..c6e46a7 100644 --- a/src/main/java/org/fontory/fontorybe/font/service/FontServiceImpl.java +++ b/src/main/java/org/fontory/fontorybe/font/service/FontServiceImpl.java @@ -147,18 +147,20 @@ public Page getFonts(Long memberId, int page, int size) { PageRequest pageRequest = PageRequest.of(page, size, sort); Page fontPage = fontRepository.findAllByMemberIdAndStatus(memberId, pageRequest, FontStatus.DONE); - log.debug("Service detail: Found {} fonts on page {} for member ID: {}", + log.debug("Service detail: Found {} fonts on page {} for member ID: {}", fontPage.getNumberOfElements(), page, memberId); Page result = fontPage.map(font -> { boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(memberId, font.getId()); - Member writer = memberLookupService.getOrThrowById(font.getMemberId()); + String writerNickname = memberLookupService.findById(font.getMemberId()) + .map(Member::getNickname) + .orElse("알 수 없는 사용자"); String woff2Url = cloudStorageService.getWoff2Url(font.getKey()); - return FontResponse.from(font, bookmarked, writer.getNickname(), woff2Url); + return FontResponse.from(font, bookmarked, writerNickname, woff2Url); }); - - log.info("Service completed: Retrieved {} fonts out of {} total for member ID: {}", + + log.info("Service completed: Retrieved {} fonts out of {} total for member ID: {}", result.getNumberOfElements(), result.getTotalElements(), memberId); return result; } @@ -169,16 +171,18 @@ public FontResponse getFont(Long fontId, Long memberId) { log.info("Service executing: Fetching font details for font ID: {}", fontId); Font targetFont = getOrThrowById(fontId); checkFontStatusIsDone(targetFont); - Member writer = memberLookupService.getOrThrowById(targetFont.getMemberId()); + String writerNickname = memberLookupService.findById(targetFont.getMemberId()) + .map(Member::getNickname) + .orElse("알 수 없는 사용자"); boolean isBookmarked = false; if (memberId != null) { isBookmarked = bookmarkRepository.existsByMemberIdAndFontId(memberId, fontId); } String woff2Url = cloudStorageService.getWoff2Url(targetFont.getKey()); - FontResponse fontResponse = FontResponse.from(targetFont, isBookmarked, writer.getNickname(), woff2Url); + FontResponse fontResponse = FontResponse.from(targetFont, isBookmarked, writerNickname, woff2Url); - log.info("Service completed: Retrieved font details for font ID: {} with name: {}", + log.info("Service completed: Retrieved font details for font ID: {} with name: {}", fontId, targetFont.getName()); return fontResponse; @@ -202,9 +206,9 @@ public FontDeleteResponse delete(Long memberId, Long fontId) { @Override public Page getFontPage(Long memberId, int page, int size, String sortBy, String keyword) { - log.info("Service executing: Fetching font page with memberId: {}, page: {}, size: {}, sortBy: {}, keyword: {}", + log.info("Service executing: Fetching font page with memberId: {}, page: {}, size: {}, sortBy: {}, keyword: {}", memberId, page, size, sortBy, keyword); - + Sort sort = Sort.by(Sort.Order.desc("createdAt")); if ("downloadCount".equalsIgnoreCase(sortBy)) { sort = Sort.by(Sort.Order.desc("downloadCount")); @@ -221,26 +225,30 @@ public Page getFontPage(Long memberId, int page, int size, Str log.debug("Service detail: Searching fonts with keyword: {}", keyword); fontPage = fontRepository.findByNameContainingAndStatus(keyword, pageRequest, FontStatus.DONE); } - + log.debug("Service detail: Found {} fonts on page {}", fontPage.getNumberOfElements(), page); Page result; if (memberId == null) { result = fontPage.map(font -> { - Member member = memberLookupService.getOrThrowById(font.getMemberId()); + String writerNickname = memberLookupService.findById(font.getMemberId()) + .map(Member::getNickname) + .orElse("알 수 없는 사용자"); String woff2Url = cloudStorageService.getWoff2Url(font.getKey()); - return FontPageResponse.from(font, member.getNickname(), false, woff2Url); + return FontPageResponse.from(font, writerNickname, false, woff2Url); }); } else { result = fontPage.map(font -> { - Member member = memberLookupService.getOrThrowById(font.getMemberId()); + String writerNickname = memberLookupService.findById(font.getMemberId()) + .map(Member::getNickname) + .orElse("알 수 없는 사용자"); boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(memberId, font.getId()); String woff2Url = cloudStorageService.getWoff2Url(font.getKey()); - return FontPageResponse.from(font, member.getNickname(), bookmarked, woff2Url); + return FontPageResponse.from(font, writerNickname, bookmarked, woff2Url); }); } - - log.info("Service completed: Retrieved {} fonts out of {} total, {} pages", + + log.info("Service completed: Retrieved {} fonts out of {} total, {} pages", result.getNumberOfElements(), result.getTotalElements(), result.getTotalPages()); return result; } @@ -261,12 +269,14 @@ public List getOtherFonts(Long fontId) { List result = fonts.stream() .map(f -> { boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(member.getId(), f.getId()); - Member writer = memberLookupService.getOrThrowById(f.getMemberId()); - String woff2Url = cloudStorageService.getWoff2Url(font.getKey()); - return FontResponse.from(f, bookmarked, writer.getNickname(), woff2Url); + String writerNickname = memberLookupService.findById(f.getMemberId()) + .map(Member::getNickname) + .orElse("알 수 없는 사용자"); + String woff2Url = cloudStorageService.getWoff2Url(f.getKey()); + return FontResponse.from(f, bookmarked, writerNickname, woff2Url); }) .collect(Collectors.toList()); - + log.info("Service completed: Retrieved {} other fonts from creator of font ID: {}", result.size(), fontId); return result; } @@ -283,12 +293,14 @@ public List getMyPopularFonts(Long memberId) { List result = fonts.stream() .map(font -> { boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(member.getId(), font.getId()); - Member writer = memberLookupService.getOrThrowById(font.getMemberId()); + String writerNickname = memberLookupService.findById(font.getMemberId()) + .map(Member::getNickname) + .orElse("알 수 없는 사용자"); String woff2Url = cloudStorageService.getWoff2Url(font.getKey()); - return FontResponse.from(font, bookmarked, writer.getNickname(), woff2Url); + return FontResponse.from(font, bookmarked, writerNickname, woff2Url); }) .collect(Collectors.toList()); - + log.info("Service completed: Retrieved {} popular fonts for member ID: {}", result.size(), memberId); return result; } @@ -304,9 +316,11 @@ public List getPopularFonts(Long memberId) { if (memberId == null) { result = fonts.stream() .map(font -> { - Member writer = memberLookupService.getOrThrowById(font.getMemberId()); + String writerNickname = memberLookupService.findById(font.getMemberId()) + .map(Member::getNickname) + .orElse("알 수 없는 사용자"); String woff2Url = cloudStorageService.getWoff2Url(font.getKey()); - return FontResponse.from(font, false, writer.getNickname(), woff2Url); + return FontResponse.from(font, false, writerNickname, woff2Url); }) .collect(Collectors.toList()); } else { @@ -314,13 +328,15 @@ public List getPopularFonts(Long memberId) { result = fonts.stream() .map(font -> { boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(member.getId(), font.getId()); - Member writer = memberLookupService.getOrThrowById(font.getMemberId()); + String writerNickname = memberLookupService.findById(font.getMemberId()) + .map(Member::getNickname) + .orElse("알 수 없는 사용자"); String woff2Url = cloudStorageService.getWoff2Url(font.getKey()); - return FontResponse.from(font, bookmarked, writer.getNickname(), woff2Url); + return FontResponse.from(font, bookmarked, writerNickname, woff2Url); }) .collect(Collectors.toList()); } - + log.info("Service completed: Retrieved {} globally popular fonts", result.size()); return result; } diff --git a/src/main/java/org/fontory/fontorybe/member/controller/port/MemberLookupService.java b/src/main/java/org/fontory/fontorybe/member/controller/port/MemberLookupService.java index b96919d..f46e87a 100644 --- a/src/main/java/org/fontory/fontorybe/member/controller/port/MemberLookupService.java +++ b/src/main/java/org/fontory/fontorybe/member/controller/port/MemberLookupService.java @@ -2,7 +2,10 @@ import org.fontory.fontorybe.member.domain.Member; +import java.util.Optional; + public interface MemberLookupService { Member getOrThrowById(Long id); boolean existsByNickname(String nick); + Optional findById(Long id); } diff --git a/src/main/java/org/fontory/fontorybe/member/service/MemberLookupServiceImpl.java b/src/main/java/org/fontory/fontorybe/member/service/MemberLookupServiceImpl.java index fedd027..39c121e 100644 --- a/src/main/java/org/fontory/fontorybe/member/service/MemberLookupServiceImpl.java +++ b/src/main/java/org/fontory/fontorybe/member/service/MemberLookupServiceImpl.java @@ -48,7 +48,7 @@ public Member getOrThrowById(Long id) { /** * 특정 닉네임이 이미 사용 중인지 확인 - * + * * @param targetName 확인할 닉네임 * @return 사용 중이면 true, 사용 가능하면 false */ @@ -60,4 +60,25 @@ public boolean existsByNickname(String targetName) { log.debug("Nickname existence check result: nickname={}, exists={}", targetName, exists); return exists; } + + /** + * ID로 회원을 조회하고, 존재하지 않으면 Optional.empty() 반환 + * + * @param id 조회할 회원 ID + * @return 조회된 회원 정보를 담은 Optional + */ + @Override + @Transactional(readOnly = true) + public Optional findById(Long id) { + log.debug("Looking up member by ID (optional): memberId={}", id); + if (id == null) { + log.debug("Member lookup skipped: memberId is null"); + return Optional.empty(); + } + Optional member = memberRepository.findById(id); + if (member.isEmpty()) { + log.debug("Member not found: memberId={}", id); + } + return member; + } } From 59425076ac7320f5f16bb54b7e7c868a60188a60 Mon Sep 17 00:00:00 2001 From: JuHyuk Lim Date: Sat, 11 Oct 2025 13:23:24 +0900 Subject: [PATCH 2/2] =?UTF-8?q?test:=20FakeMemberLookupService=EC=97=90=20?= =?UTF-8?q?findById=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fontorybe/unit/mock/FakeMemberLookupService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/org/fontory/fontorybe/unit/mock/FakeMemberLookupService.java b/src/test/java/org/fontory/fontorybe/unit/mock/FakeMemberLookupService.java index 05a0326..b505b55 100644 --- a/src/test/java/org/fontory/fontorybe/unit/mock/FakeMemberLookupService.java +++ b/src/test/java/org/fontory/fontorybe/unit/mock/FakeMemberLookupService.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.Optional; public class FakeMemberLookupService implements MemberLookupService { private final Map members = new HashMap<>(); @@ -25,6 +26,11 @@ public boolean existsByNickname(String nickname) { .anyMatch(member -> member.getNickname().equals(nickname)); } + @Override + public Optional findById(Long id) { + return Optional.ofNullable(members.get(id)); + } + // Test helper methods public void addMember(Member member) { members.put(member.getId(), member);