Skip to content

Commit eabcbf4

Browse files
authored
Merge pull request #61 from team-fontory/fix/font-member
fix: 없는 사용자의 폰트 조회 시 오류 수정
2 parents a3f246a + 5942507 commit eabcbf4

File tree

4 files changed

+76
-30
lines changed

4 files changed

+76
-30
lines changed

src/main/java/org/fontory/fontorybe/font/service/FontServiceImpl.java

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -147,18 +147,20 @@ public Page<FontResponse> getFonts(Long memberId, int page, int size) {
147147
PageRequest pageRequest = PageRequest.of(page, size, sort);
148148

149149
Page<Font> fontPage = fontRepository.findAllByMemberIdAndStatus(memberId, pageRequest, FontStatus.DONE);
150-
log.debug("Service detail: Found {} fonts on page {} for member ID: {}",
150+
log.debug("Service detail: Found {} fonts on page {} for member ID: {}",
151151
fontPage.getNumberOfElements(), page, memberId);
152152

153153
Page<FontResponse> result = fontPage.map(font -> {
154154
boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(memberId, font.getId());
155-
Member writer = memberLookupService.getOrThrowById(font.getMemberId());
155+
String writerNickname = memberLookupService.findById(font.getMemberId())
156+
.map(Member::getNickname)
157+
.orElse("알 수 없는 사용자");
156158
String woff2Url = cloudStorageService.getWoff2Url(font.getKey());
157-
return FontResponse.from(font, bookmarked, writer.getNickname(), woff2Url);
159+
return FontResponse.from(font, bookmarked, writerNickname, woff2Url);
158160
});
159161

160-
161-
log.info("Service completed: Retrieved {} fonts out of {} total for member ID: {}",
162+
163+
log.info("Service completed: Retrieved {} fonts out of {} total for member ID: {}",
162164
result.getNumberOfElements(), result.getTotalElements(), memberId);
163165
return result;
164166
}
@@ -169,16 +171,18 @@ public FontResponse getFont(Long fontId, Long memberId) {
169171
log.info("Service executing: Fetching font details for font ID: {}", fontId);
170172
Font targetFont = getOrThrowById(fontId);
171173
checkFontStatusIsDone(targetFont);
172-
Member writer = memberLookupService.getOrThrowById(targetFont.getMemberId());
174+
String writerNickname = memberLookupService.findById(targetFont.getMemberId())
175+
.map(Member::getNickname)
176+
.orElse("알 수 없는 사용자");
173177

174178
boolean isBookmarked = false;
175179
if (memberId != null) {
176180
isBookmarked = bookmarkRepository.existsByMemberIdAndFontId(memberId, fontId);
177181
}
178182
String woff2Url = cloudStorageService.getWoff2Url(targetFont.getKey());
179-
FontResponse fontResponse = FontResponse.from(targetFont, isBookmarked, writer.getNickname(), woff2Url);
183+
FontResponse fontResponse = FontResponse.from(targetFont, isBookmarked, writerNickname, woff2Url);
180184

181-
log.info("Service completed: Retrieved font details for font ID: {} with name: {}",
185+
log.info("Service completed: Retrieved font details for font ID: {} with name: {}",
182186
fontId, targetFont.getName());
183187

184188
return fontResponse;
@@ -202,9 +206,9 @@ public FontDeleteResponse delete(Long memberId, Long fontId) {
202206

203207
@Override
204208
public Page<FontPageResponse> getFontPage(Long memberId, int page, int size, String sortBy, String keyword) {
205-
log.info("Service executing: Fetching font page with memberId: {}, page: {}, size: {}, sortBy: {}, keyword: {}",
209+
log.info("Service executing: Fetching font page with memberId: {}, page: {}, size: {}, sortBy: {}, keyword: {}",
206210
memberId, page, size, sortBy, keyword);
207-
211+
208212
Sort sort = Sort.by(Sort.Order.desc("createdAt"));
209213
if ("downloadCount".equalsIgnoreCase(sortBy)) {
210214
sort = Sort.by(Sort.Order.desc("downloadCount"));
@@ -221,26 +225,30 @@ public Page<FontPageResponse> getFontPage(Long memberId, int page, int size, Str
221225
log.debug("Service detail: Searching fonts with keyword: {}", keyword);
222226
fontPage = fontRepository.findByNameContainingAndStatus(keyword, pageRequest, FontStatus.DONE);
223227
}
224-
228+
225229
log.debug("Service detail: Found {} fonts on page {}", fontPage.getNumberOfElements(), page);
226230

227231
Page<FontPageResponse> result;
228232
if (memberId == null) {
229233
result = fontPage.map(font -> {
230-
Member member = memberLookupService.getOrThrowById(font.getMemberId());
234+
String writerNickname = memberLookupService.findById(font.getMemberId())
235+
.map(Member::getNickname)
236+
.orElse("알 수 없는 사용자");
231237
String woff2Url = cloudStorageService.getWoff2Url(font.getKey());
232-
return FontPageResponse.from(font, member.getNickname(), false, woff2Url);
238+
return FontPageResponse.from(font, writerNickname, false, woff2Url);
233239
});
234240
} else {
235241
result = fontPage.map(font -> {
236-
Member member = memberLookupService.getOrThrowById(font.getMemberId());
242+
String writerNickname = memberLookupService.findById(font.getMemberId())
243+
.map(Member::getNickname)
244+
.orElse("알 수 없는 사용자");
237245
boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(memberId, font.getId());
238246
String woff2Url = cloudStorageService.getWoff2Url(font.getKey());
239-
return FontPageResponse.from(font, member.getNickname(), bookmarked, woff2Url);
247+
return FontPageResponse.from(font, writerNickname, bookmarked, woff2Url);
240248
});
241249
}
242-
243-
log.info("Service completed: Retrieved {} fonts out of {} total, {} pages",
250+
251+
log.info("Service completed: Retrieved {} fonts out of {} total, {} pages",
244252
result.getNumberOfElements(), result.getTotalElements(), result.getTotalPages());
245253
return result;
246254
}
@@ -261,12 +269,14 @@ public List<FontResponse> getOtherFonts(Long fontId) {
261269
List<FontResponse> result = fonts.stream()
262270
.map(f -> {
263271
boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(member.getId(), f.getId());
264-
Member writer = memberLookupService.getOrThrowById(f.getMemberId());
265-
String woff2Url = cloudStorageService.getWoff2Url(font.getKey());
266-
return FontResponse.from(f, bookmarked, writer.getNickname(), woff2Url);
272+
String writerNickname = memberLookupService.findById(f.getMemberId())
273+
.map(Member::getNickname)
274+
.orElse("알 수 없는 사용자");
275+
String woff2Url = cloudStorageService.getWoff2Url(f.getKey());
276+
return FontResponse.from(f, bookmarked, writerNickname, woff2Url);
267277
})
268278
.collect(Collectors.toList());
269-
279+
270280
log.info("Service completed: Retrieved {} other fonts from creator of font ID: {}", result.size(), fontId);
271281
return result;
272282
}
@@ -283,12 +293,14 @@ public List<FontResponse> getMyPopularFonts(Long memberId) {
283293
List<FontResponse> result = fonts.stream()
284294
.map(font -> {
285295
boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(member.getId(), font.getId());
286-
Member writer = memberLookupService.getOrThrowById(font.getMemberId());
296+
String writerNickname = memberLookupService.findById(font.getMemberId())
297+
.map(Member::getNickname)
298+
.orElse("알 수 없는 사용자");
287299
String woff2Url = cloudStorageService.getWoff2Url(font.getKey());
288-
return FontResponse.from(font, bookmarked, writer.getNickname(), woff2Url);
300+
return FontResponse.from(font, bookmarked, writerNickname, woff2Url);
289301
})
290302
.collect(Collectors.toList());
291-
303+
292304
log.info("Service completed: Retrieved {} popular fonts for member ID: {}", result.size(), memberId);
293305
return result;
294306
}
@@ -304,23 +316,27 @@ public List<FontResponse> getPopularFonts(Long memberId) {
304316
if (memberId == null) {
305317
result = fonts.stream()
306318
.map(font -> {
307-
Member writer = memberLookupService.getOrThrowById(font.getMemberId());
319+
String writerNickname = memberLookupService.findById(font.getMemberId())
320+
.map(Member::getNickname)
321+
.orElse("알 수 없는 사용자");
308322
String woff2Url = cloudStorageService.getWoff2Url(font.getKey());
309-
return FontResponse.from(font, false, writer.getNickname(), woff2Url);
323+
return FontResponse.from(font, false, writerNickname, woff2Url);
310324
})
311325
.collect(Collectors.toList());
312326
} else {
313327
Member member = memberLookupService.getOrThrowById(memberId);
314328
result = fonts.stream()
315329
.map(font -> {
316330
boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(member.getId(), font.getId());
317-
Member writer = memberLookupService.getOrThrowById(font.getMemberId());
331+
String writerNickname = memberLookupService.findById(font.getMemberId())
332+
.map(Member::getNickname)
333+
.orElse("알 수 없는 사용자");
318334
String woff2Url = cloudStorageService.getWoff2Url(font.getKey());
319-
return FontResponse.from(font, bookmarked, writer.getNickname(), woff2Url);
335+
return FontResponse.from(font, bookmarked, writerNickname, woff2Url);
320336
})
321337
.collect(Collectors.toList());
322338
}
323-
339+
324340
log.info("Service completed: Retrieved {} globally popular fonts", result.size());
325341
return result;
326342
}

src/main/java/org/fontory/fontorybe/member/controller/port/MemberLookupService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
import org.fontory.fontorybe.member.domain.Member;
44

5+
import java.util.Optional;
6+
57
public interface MemberLookupService {
68
Member getOrThrowById(Long id);
79
boolean existsByNickname(String nick);
10+
Optional<Member> findById(Long id);
811
}

src/main/java/org/fontory/fontorybe/member/service/MemberLookupServiceImpl.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public Member getOrThrowById(Long id) {
4848

4949
/**
5050
* 특정 닉네임이 이미 사용 중인지 확인
51-
*
51+
*
5252
* @param targetName 확인할 닉네임
5353
* @return 사용 중이면 true, 사용 가능하면 false
5454
*/
@@ -60,4 +60,25 @@ public boolean existsByNickname(String targetName) {
6060
log.debug("Nickname existence check result: nickname={}, exists={}", targetName, exists);
6161
return exists;
6262
}
63+
64+
/**
65+
* ID로 회원을 조회하고, 존재하지 않으면 Optional.empty() 반환
66+
*
67+
* @param id 조회할 회원 ID
68+
* @return 조회된 회원 정보를 담은 Optional
69+
*/
70+
@Override
71+
@Transactional(readOnly = true)
72+
public Optional<Member> findById(Long id) {
73+
log.debug("Looking up member by ID (optional): memberId={}", id);
74+
if (id == null) {
75+
log.debug("Member lookup skipped: memberId is null");
76+
return Optional.empty();
77+
}
78+
Optional<Member> member = memberRepository.findById(id);
79+
if (member.isEmpty()) {
80+
log.debug("Member not found: memberId={}", id);
81+
}
82+
return member;
83+
}
6384
}

src/test/java/org/fontory/fontorybe/unit/mock/FakeMemberLookupService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.util.HashMap;
88
import java.util.Map;
9+
import java.util.Optional;
910

1011
public class FakeMemberLookupService implements MemberLookupService {
1112
private final Map<Long, Member> members = new HashMap<>();
@@ -25,6 +26,11 @@ public boolean existsByNickname(String nickname) {
2526
.anyMatch(member -> member.getNickname().equals(nickname));
2627
}
2728

29+
@Override
30+
public Optional<Member> findById(Long id) {
31+
return Optional.ofNullable(members.get(id));
32+
}
33+
2834
// Test helper methods
2935
public void addMember(Member member) {
3036
members.put(member.getId(), member);

0 commit comments

Comments
 (0)