Skip to content

Commit 4e84fae

Browse files
authored
refactor/#255 Lab-File 연관관계를 ID 참조로 변경 (#256)
* refactor/#255 Lab-FileEntity 연관 관계를 ID 참조로 변경 * refactor: Lab-FileEntity 연관 관계를 객체 참조에서 ID 참조로 변경 * refactor: LabFacade에 N+1 문제 해결을 위한 조회 로직 적용 * refactor: 변경된 연관 관계를 반영하도록 관련 DTO 수정 (LabListResponse, LabDetailResponse) * refactor: LabCommandService에서 불필요한 FileQueryService 의존성 제거 * refactor: 기존 club에도 불필요한 FileQueryService 의존성 제거 * test: 리팩토링에 따른 테스트 코드 수정 (Lab*Test.java 및 TestContainer) * test/#255 LabAdminFacadeTest, ClubAdminFacadeTest 불필요한 FileQueryService 의존성 제거 * refactor/#255 Lab 도메인의 fileId 필드를 nullable로 변경 * refactor/#255 메서드 명시적으로 변경 * refactor/#255 LabFacade의 파일 처리 로직을 FileQueryService로 위임
1 parent 26394c6 commit 4e84fae

File tree

18 files changed

+60
-71
lines changed

18 files changed

+60
-71
lines changed

aics-admin/src/testFixtures/java/club/application/ClubAdminFacadeTest.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,18 @@
1717
import kgu.developers.domain.club.application.query.ClubQueryService;
1818
import kgu.developers.domain.club.domain.Club;
1919
import kgu.developers.domain.club.exception.ClubNotFoundException;
20-
import kgu.developers.domain.file.application.query.FileQueryService;
2120
import mock.repository.FakeClubRepository;
22-
import mock.repository.FakeFileRepository;
2321

2422
public class ClubAdminFacadeTest {
2523
private ClubAdminFacade clubAdminFacade;
2624
private FakeClubRepository fakeClubRepository;
2725

2826
@BeforeEach
2927
public void init() {
30-
FakeFileRepository fakeFileRepository = new FakeFileRepository();
31-
FileQueryService fileQueryService = new FileQueryService(fakeFileRepository);
3228

3329
this.fakeClubRepository = new FakeClubRepository();
3430
this.clubAdminFacade = new ClubAdminFacade(
35-
new ClubCommandService(fakeClubRepository, fileQueryService),
31+
new ClubCommandService(fakeClubRepository),
3632
new ClubQueryService(fakeClubRepository)
3733
);
3834

aics-admin/src/testFixtures/java/lab/application/LabAdminFacadeTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import kgu.developers.admin.lab.presentation.request.LabCreateRequest;
1515
import kgu.developers.admin.lab.presentation.request.LabUpdateRequest;
1616
import kgu.developers.admin.lab.presentation.response.LabPersistResponse;
17-
import kgu.developers.domain.file.application.query.FileQueryService;
1817
import kgu.developers.domain.file.domain.FileEntity;
1918
import kgu.developers.domain.lab.application.command.LabCommandService;
2019
import kgu.developers.domain.lab.application.query.LabQueryService;
@@ -33,17 +32,17 @@ public void init() {
3332
FakeFileRepository fakeFileRepository = new FakeFileRepository();
3433
fakeLabRepository = new FakeLabRepository();
3534
labAdminFacade = new LabAdminFacade(
36-
new LabCommandService(new FileQueryService(fakeFileRepository), fakeLabRepository),
35+
new LabCommandService(fakeLabRepository),
3736
new LabQueryService(fakeLabRepository)
3837
);
3938

40-
FileEntity testFile = fakeFileRepository.save(FileEntity.builder().id(TEST_FILE_ID).build());
39+
fakeFileRepository.save(FileEntity.builder().id(TEST_FILE_ID).build());
4140
fakeLabRepository.save(Lab.builder()
4241
.name("Lab A")
4342
.loc("8500")
4443
.site("http://labA.kyonggi.ac.kr")
4544
.advisor("박민준")
46-
.file(testFile)
45+
.fileId(TEST_FILE_ID)
4746
.build()
4847
);
4948
}

aics-api/src/main/java/kgu/developers/api/club/application/ClubFacade.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
package kgu.developers.api.club.application;
22

33
import java.util.List;
4-
import java.util.Map;
54
import java.util.Objects;
6-
import java.util.function.Function;
7-
import java.util.stream.Collectors;
85

96
import kgu.developers.domain.file.application.query.FileQueryService;
10-
import kgu.developers.domain.file.domain.FileEntity;
117
import org.springframework.stereotype.Component;
128
import org.springframework.transaction.annotation.Transactional;
139

@@ -31,12 +27,6 @@ public ClubListResponse getClubs() {
3127
.filter(Objects::nonNull)
3228
.toList();
3329

34-
Map<Long, FileEntity> fileMap =
35-
fileQueryService.findAllByIds(fileIds)
36-
.stream()
37-
.collect(Collectors.toMap(FileEntity::getId,
38-
Function.identity()));
39-
40-
return ClubListResponse.from(clubs,fileMap);
30+
return ClubListResponse.from(clubs,fileQueryService.findFileEntityMapByIds(fileIds));
4131
}
4232
}

aics-api/src/main/java/kgu/developers/api/lab/application/LabFacade.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package kgu.developers.api.lab.application;
22

33
import java.util.List;
4+
import java.util.Objects;
45

6+
import kgu.developers.domain.file.application.query.FileQueryService;
57
import org.springframework.stereotype.Component;
68
import org.springframework.transaction.annotation.Transactional;
79

@@ -15,9 +17,17 @@
1517
@Transactional(readOnly = true)
1618
public class LabFacade {
1719
private final LabQueryService labQueryService;
20+
private final FileQueryService fileQueryService;
1821

1922
public LabListResponse getLabs() {
2023
List<Lab> labs = labQueryService.getLabsByName();
21-
return LabListResponse.from(labs);
24+
25+
List<Long> fileIds = labs.stream()
26+
.map(Lab::getFileId)
27+
.filter(Objects::nonNull)
28+
.toList();
29+
30+
31+
return LabListResponse.from(labs,fileQueryService.findFileEntityMapByIds(fileIds));
2232
}
2333
}

aics-api/src/main/java/kgu/developers/api/lab/presentation/response/LabDetailResponse.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import io.swagger.v3.oas.annotations.media.Schema;
77
import kgu.developers.domain.file.application.response.FilePathResponse;
8+
import kgu.developers.domain.file.domain.FileEntity;
89
import kgu.developers.domain.lab.domain.Lab;
910
import lombok.Builder;
1011

@@ -32,15 +33,15 @@ public record LabDetailResponse(
3233
requiredMode = NOT_REQUIRED)
3334
FilePathResponse img
3435
) {
35-
public static LabDetailResponse from(Lab lab) {
36+
public static LabDetailResponse from(Lab lab, FileEntity file) {
3637
return LabDetailResponse.builder()
3738
.id(lab.getId())
3839
.name(lab.getName())
3940
.loc(lab.getLoc())
4041
.site(lab.getSite())
4142
.advisor(lab.getAdvisor())
42-
.img(lab.getFile() != null ?
43-
FilePathResponse.from(lab.getFile()) : null)
43+
.img(file != null ?
44+
FilePathResponse.from(file) : null)
4445
.build();
4546
}
4647
}

aics-api/src/main/java/kgu/developers/api/lab/presentation/response/LabListResponse.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
44

55
import java.util.List;
6+
import java.util.Map;
67

78
import io.swagger.v3.oas.annotations.media.Schema;
9+
import kgu.developers.domain.file.domain.FileEntity;
810
import kgu.developers.domain.lab.domain.Lab;
911
import lombok.Builder;
1012

@@ -22,10 +24,10 @@ public record LabListResponse(
2224
requiredMode = REQUIRED)
2325
List<LabDetailResponse> contents
2426
) {
25-
public static LabListResponse from(List<Lab> labs) {
27+
public static LabListResponse from(List<Lab> labs, Map<Long, FileEntity> fileMap) {
2628
return LabListResponse.builder()
2729
.contents(labs.stream()
28-
.map(LabDetailResponse::from)
30+
.map(lab -> LabDetailResponse.from(lab,fileMap.get(lab.getFileId())))
2931
.toList())
3032
.build();
3133
}

aics-api/src/testFixtures/java/lab/application/LabFacadeTest.java

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

55
import java.util.List;
66

7+
import kgu.developers.domain.file.application.query.FileQueryService;
78
import kgu.developers.domain.file.domain.FileEntity;
89
import mock.repository.FakeFileRepository;
910
import org.junit.jupiter.api.BeforeEach;
@@ -19,24 +20,26 @@
1920

2021
public class LabFacadeTest {
2122
private LabFacade labFacade;
23+
private static final Long TEST_FILE_ID = 1L;
2224

2325
@BeforeEach
2426
public void init() {
2527
FakeLabRepository fakeLabRepository = new FakeLabRepository();
2628
FakeFileRepository fakeFileRepository = new FakeFileRepository();
29+
2730
labFacade = new LabFacade(
28-
new LabQueryService(fakeLabRepository)
31+
new LabQueryService(fakeLabRepository),new FileQueryService(fakeFileRepository)
2932
);
3033

31-
FileEntity testFile = fakeFileRepository.save(FileEntity.builder().id(1L).build());
34+
fakeFileRepository.save(FileEntity.builder().id(TEST_FILE_ID).build());
3235

3336
fakeLabRepository.save(
3437
Lab.create(
3538
"인공지능 연구실",
3639
"8502, 8503",
3740
"http://ailab.kyonggi.ac.kr",
3841
"김인철",
39-
testFile
42+
TEST_FILE_ID
4043
)
4144
);
4245

@@ -46,7 +49,7 @@ public void init() {
4649
"8504",
4750
"http://algeo.kyonggi.ac.kr/",
4851
"배상원",
49-
testFile
52+
TEST_FILE_ID
5053
)
5154
);
5255
}

aics-domain/src/main/java/kgu/developers/domain/club/application/command/ClubCommandService.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55

66
import kgu.developers.domain.club.domain.Club;
77
import kgu.developers.domain.club.domain.ClubRepository;
8-
import kgu.developers.domain.file.application.query.FileQueryService;
98
import lombok.RequiredArgsConstructor;
109

1110
@Service
1211
@Transactional
1312
@RequiredArgsConstructor
1413
public class ClubCommandService {
1514
private final ClubRepository clubRepository;
16-
private final FileQueryService fileQueryService;
1715

1816
public Long createClub(String name, String description, String site, Long fileId) {
1917

@@ -27,7 +25,7 @@ public void updateClub(Club club, String name, String description, String site,
2725
club.updateDescription(description);
2826
club.updateSite(site);
2927

30-
club.updateFile(fileId);
28+
club.updateFileId(fileId);
3129
}
3230

3331
public void deleteClubById(Long id) {

aics-domain/src/main/java/kgu/developers/domain/club/domain/Club.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public void updateSite(String site) {
5959
this.site = site;
6060
}
6161

62-
public void updateFile(Long fileId) {
62+
public void updateFileId(Long fileId) {
6363
this.fileId = fileId;
6464
}
6565
}

aics-domain/src/main/java/kgu/developers/domain/file/application/query/FileQueryService.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import org.springframework.stereotype.Service;
77

88
import java.util.List;
9+
import java.util.Map;
10+
import java.util.function.Function;
11+
import java.util.stream.Collectors;
912

1013
@Service
1114
@RequiredArgsConstructor
@@ -16,7 +19,10 @@ public FileEntity getFileById(Long id) {
1619
return fileRepository.findById(id).orElse(null);
1720
}
1821

19-
public List<FileEntity> findAllByIds(List<Long> ids) {
20-
return fileRepository.findAllByIds(ids);
22+
23+
public Map<Long,FileEntity> findFileEntityMapByIds(List<Long> ids) {
24+
return fileRepository.findAllByIds(ids)
25+
.stream()
26+
.collect(Collectors.toMap(FileEntity::getId, Function.identity()));
2127
}
2228
}

0 commit comments

Comments
 (0)