diff --git a/src/main/java/com/sb/web/account/mapper/AccountEntryMapper.java b/src/main/java/com/sb/web/account/mapper/AccountEntryMapper.java index 107e633..1b1181f 100644 --- a/src/main/java/com/sb/web/account/mapper/AccountEntryMapper.java +++ b/src/main/java/com/sb/web/account/mapper/AccountEntryMapper.java @@ -93,4 +93,7 @@ public interface AccountEntryMapper { int deleteEntryTagsByEntryId(@Param("entryId") Long entryId); List findTagNamesByEntryId(@Param("entryId") Long entryId); + + /** 복수 항목의 태그를 한 번에 조회 — {entryId, tagName} 맵 반환 */ + List> findTagsByEntryIds(@Param("entryIds") List entryIds); } diff --git a/src/main/java/com/sb/web/account/service/AccountService.java b/src/main/java/com/sb/web/account/service/AccountService.java index 2868871..078b5e8 100644 --- a/src/main/java/com/sb/web/account/service/AccountService.java +++ b/src/main/java/com/sb/web/account/service/AccountService.java @@ -53,9 +53,19 @@ public class AccountService { public List list(Long memberId, Integer year, Integer month, String type, String category, Long walletId, String keyword, Long tagId) { - return mapper.findByMember(memberId, year, month, - blankToNull(type), blankToNull(category), walletId, blankToNull(keyword), tagId).stream() - .map(this::toResponse) + List entries = mapper.findByMember(memberId, year, month, + blankToNull(type), blankToNull(category), walletId, blankToNull(keyword), tagId); + if (entries.isEmpty()) return List.of(); + // 태그 N+1 방지: 한 번에 모든 entry 의 태그를 조회 후 Map 으로 그룹화 + List ids = entries.stream().map(AccountEntry::getId).toList(); + Map> tagsByEntry = new HashMap<>(); + for (Map row : mapper.findTagsByEntryIds(ids)) { + Long eid = ((Number) row.get("entryId")).longValue(); + String name = (String) row.get("tagName"); + tagsByEntry.computeIfAbsent(eid, k -> new ArrayList<>()).add(name); + } + return entries.stream() + .map(e -> AccountEntryResponse.from(e, tagsByEntry.getOrDefault(e.getId(), List.of()))) .toList(); } diff --git a/src/main/resources/mapper/AccountEntryMapper.xml b/src/main/resources/mapper/AccountEntryMapper.xml index 93f32d9..0150e41 100644 --- a/src/main/resources/mapper/AccountEntryMapper.xml +++ b/src/main/resources/mapper/AccountEntryMapper.xml @@ -234,4 +234,16 @@ ORDER BY t.name + + +