Skip to content

Commit 572bd86

Browse files
authored
[DDING-000] 통계 전체조회시 파일 조회 쿼리 개선 및 응답값 수정 (#292)
1 parent 546cf90 commit 572bd86

File tree

9 files changed

+184
-42
lines changed

9 files changed

+184
-42
lines changed

src/main/java/ddingdong/ddingdongBE/domain/form/service/FacadeCentralFormServiceImpl.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import ddingdong.ddingdongBE.domain.club.entity.Club;
1010
import ddingdong.ddingdongBE.domain.club.service.ClubService;
1111
import ddingdong.ddingdongBE.domain.clubmember.entity.ClubMember;
12-
import ddingdong.ddingdongBE.domain.filemetadata.entity.DomainType;
1312
import ddingdong.ddingdongBE.domain.filemetadata.service.FileMetaDataService;
1413
import ddingdong.ddingdongBE.domain.form.entity.Form;
1514
import ddingdong.ddingdongBE.domain.form.entity.FormField;
@@ -26,13 +25,13 @@
2625
import ddingdong.ddingdongBE.domain.form.service.dto.query.FormStatisticsQuery.ApplicantStatisticQuery;
2726
import ddingdong.ddingdongBE.domain.form.service.dto.query.FormStatisticsQuery.DepartmentStatisticQuery;
2827
import ddingdong.ddingdongBE.domain.form.service.dto.query.FormStatisticsQuery.FieldStatisticsQuery;
29-
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
30-
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplicationStatus;
31-
import ddingdong.ddingdongBE.domain.formapplication.service.FormApplicationService;
3228
import ddingdong.ddingdongBE.domain.form.service.dto.query.MultipleFieldStatisticsQuery;
3329
import ddingdong.ddingdongBE.domain.form.service.dto.query.MultipleFieldStatisticsQuery.OptionStatisticQuery;
3430
import ddingdong.ddingdongBE.domain.form.service.dto.query.SingleFieldStatisticsQuery;
3531
import ddingdong.ddingdongBE.domain.form.service.dto.query.SingleFieldStatisticsQuery.SingleStatisticsQuery;
32+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
33+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplicationStatus;
34+
import ddingdong.ddingdongBE.domain.formapplication.service.FormApplicationService;
3635
import ddingdong.ddingdongBE.domain.user.entity.User;
3736
import ddingdong.ddingdongBE.email.SesEmailService;
3837
import ddingdong.ddingdongBE.email.dto.EmailContent;
@@ -98,7 +97,7 @@ public void deleteForm(Long formId, User user) {
9897
Club club = clubService.getByUserId(user.getId());
9998
Form form = formService.getById(formId);
10099
validateEqualsClub(club, form);
101-
fileMetaDataService.updateStatusToDelete(DomainType.FORM_FILE, formId);
100+
// TODO : fileMetaData의 formFile formAnswer 지우기
102101
formService.delete(form); //테이블 생성 시 외래 키에 cascade 설정하여 formField 삭제도 자동으로 됨.
103102
}
104103

@@ -252,13 +251,13 @@ private void validateEndDate(LocalDate startDate, LocalDate endDate) {
252251
}
253252

254253
private List<FormField> toUpdateFormFields(Form originform,
255-
List<UpdateFormFieldCommand> updateFormFieldCommands) {
254+
List<UpdateFormFieldCommand> updateFormFieldCommands) {
256255
return updateFormFieldCommands.stream()
257256
.map(formFieldCommand -> formFieldCommand.toEntity(originform)).toList();
258257
}
259258

260259
private List<FormField> toCreateFormFields(Form savedForm,
261-
List<CreateFormFieldCommand> createFormFieldCommands) {
260+
List<CreateFormFieldCommand> createFormFieldCommands) {
262261
return createFormFieldCommands.stream()
263262
.map(formFieldCommand -> formFieldCommand.toEntity(savedForm)).toList();
264263
}

src/main/java/ddingdong/ddingdongBE/domain/form/service/FormStatisticServiceImpl.java

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import ddingdong.ddingdongBE.common.utils.CalculationUtils;
55
import ddingdong.ddingdongBE.common.utils.TimeUtils;
66
import ddingdong.ddingdongBE.domain.club.entity.Club;
7-
import ddingdong.ddingdongBE.domain.filemetadata.service.FileMetaDataService;
87
import ddingdong.ddingdongBE.domain.form.entity.Form;
98
import ddingdong.ddingdongBE.domain.form.entity.FormField;
109
import ddingdong.ddingdongBE.domain.form.repository.FormFieldRepository;
@@ -18,11 +17,11 @@
1817
import ddingdong.ddingdongBE.domain.formapplication.repository.FormAnswerRepository;
1918
import ddingdong.ddingdongBE.domain.formapplication.repository.FormApplicationRepository;
2019
import ddingdong.ddingdongBE.domain.formapplication.repository.dto.DepartmentInfo;
20+
import ddingdong.ddingdongBE.domain.formapplication.repository.dto.FileAnswerInfo;
2121
import ddingdong.ddingdongBE.domain.formapplication.repository.dto.RecentFormInfo;
2222
import ddingdong.ddingdongBE.domain.formapplication.repository.dto.TextAnswerInfo;
23-
import ddingdong.ddingdongBE.file.service.S3FileService;
23+
import ddingdong.ddingdongBE.domain.formapplication.service.FileFormAnswerService;
2424
import java.time.LocalDate;
25-
import java.util.ArrayList;
2625
import java.util.List;
2726
import java.util.stream.IntStream;
2827
import lombok.RequiredArgsConstructor;
@@ -41,8 +40,7 @@ public class FormStatisticServiceImpl implements FormStatisticService {
4140
private final FormFieldRepository formFieldRepository;
4241
private final FormAnswerRepository formAnswerRepository;
4342
private final StringListConverter stringListConverter;
44-
private final S3FileService s3FileService;
45-
private final FileMetaDataService fileMetaDataService;
43+
private final FileFormAnswerService fileFormAnswerService;
4644

4745
@Override
4846
public int getTotalApplicationCountByForm(Form form) {
@@ -123,33 +121,25 @@ public List<OptionStatisticQuery> createOptionStatistics(FormField formField) {
123121
public List<SingleStatisticsQuery> createTextStatistics(FormField formField) {
124122
List<TextAnswerInfo> textAnswerInfos = formAnswerRepository.getTextAnswerInfosByFormFieldId(formField.getId());
125123
return textAnswerInfos.stream()
126-
.map(textAnswerInfo -> {
127-
Long id = textAnswerInfo.getId();
128-
String name = textAnswerInfo.getName();
129-
String answer = getAnswer(textAnswerInfo.getValue());
130-
return new SingleStatisticsQuery(id, name, answer);
131-
})
124+
.map(textAnswerInfo ->
125+
SingleStatisticsQuery.fromTextInfo(textAnswerInfo, getAnswer(textAnswerInfo.getValue()))
126+
)
132127
.toList();
133128
}
134129

135130
@Override
136131
public List<SingleStatisticsQuery> createFileStatistics(FormField formField) {
137-
List<TextAnswerInfo> textAnswerInfos = formAnswerRepository.getTextAnswerInfosByFormFieldId(formField.getId());
138-
List<SingleStatisticsQuery> textStatisticsQueries = new ArrayList<>();
139-
for(TextAnswerInfo textAnswerInfo : textAnswerInfos) {
140-
Long id = textAnswerInfo.getId();
141-
String name = textAnswerInfo.getName();
142-
List<String> answers = stringListConverter.convertToEntityAttribute(textAnswerInfo.getValue());
143-
for (String answer : answers) {
144-
textStatisticsQueries.add(new SingleStatisticsQuery(id, name, answer));
145-
}
146-
}
147-
return textStatisticsQueries;
132+
List<Long> answerIds = formAnswerRepository.findAllAnswerByFormFieldId(formField.getId());
133+
List<FileAnswerInfo> fileAnswerInfos = fileFormAnswerService.getAllFileApplicationInfo(
134+
answerIds);
135+
return fileAnswerInfos.stream()
136+
.map(SingleStatisticsQuery::fromFileInfo)
137+
.toList();
148138
}
149139

150140
private String getAnswer(String value) {
151141
List<String> answer = stringListConverter.convertToEntityAttribute(value);
152-
if(answer.isEmpty()) {
142+
if (answer.isEmpty()) {
153143
return null;
154144
}
155145
return answer.get(0);

src/main/java/ddingdong/ddingdongBE/domain/form/service/dto/query/SingleFieldStatisticsQuery.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package ddingdong.ddingdongBE.domain.form.service.dto.query;
22

3+
import ddingdong.ddingdongBE.domain.formapplication.repository.dto.FileAnswerInfo;
4+
import ddingdong.ddingdongBE.domain.formapplication.repository.dto.TextAnswerInfo;
35
import java.util.List;
46

57
public record SingleFieldStatisticsQuery(
@@ -12,5 +14,13 @@ public record SingleStatisticsQuery(
1214
String name,
1315
String answer
1416
) {
17+
18+
public static SingleStatisticsQuery fromFileInfo(FileAnswerInfo info) {
19+
return new SingleStatisticsQuery(info.getId(), info.getName(), info.getFileName());
20+
}
21+
22+
public static SingleStatisticsQuery fromTextInfo(TextAnswerInfo info, String answer) {
23+
return new SingleStatisticsQuery(info.getId(), info.getName(), answer);
24+
}
1525
}
1626
}

src/main/java/ddingdong/ddingdongBE/domain/formapplication/repository/FormAnswerRepository.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import ddingdong.ddingdongBE.domain.form.entity.FormField;
44
import ddingdong.ddingdongBE.domain.formapplication.entity.FormAnswer;
55
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
6+
import ddingdong.ddingdongBE.domain.formapplication.repository.dto.FileAnswerInfo;
67
import ddingdong.ddingdongBE.domain.formapplication.repository.dto.TextAnswerInfo;
7-
import org.springframework.data.jpa.repository.JpaRepository;
8-
98
import java.util.List;
9+
import org.springframework.data.jpa.repository.JpaRepository;
1010
import org.springframework.data.jpa.repository.Query;
1111
import org.springframework.data.repository.query.Param;
1212

@@ -35,4 +35,28 @@ public interface FormAnswerRepository extends JpaRepository<FormAnswer, Long> {
3535
ORDER BY fap.id
3636
""", nativeQuery = true)
3737
List<TextAnswerInfo> getTextAnswerInfosByFormFieldId(Long fieldId);
38+
39+
@Query(value = """
40+
SELECT DISTINCT fa.id
41+
FROM form_answer fa
42+
WHERE fa.field_id = :fieldId
43+
""", nativeQuery = true)
44+
List<Long> findAllAnswerByFormFieldId(@Param("fieldId") Long fieldId);
45+
46+
@Query(value = """
47+
SELECT fa.id as id, fap.name as name, fmd.file_name as fileName
48+
FROM form_answer fa
49+
JOIN file_meta_data fmd
50+
ON fmd.entity_id = fa.id
51+
JOIN form_application fap
52+
ON fa.application_id = fap.id
53+
WHERE fmd.domain_type = :domainType
54+
AND fmd.entity_id IN (:answerIds)
55+
AND fmd.file_status = :fileStatus
56+
ORDER BY fmd.file_name
57+
""", nativeQuery = true)
58+
List<FileAnswerInfo> findAllFileAnswerInfo(
59+
@Param("domainType") String domainType,
60+
@Param("answerIds") List<Long> answerIds,
61+
@Param("fileStatus") String fileStatus );
3862
}

src/main/java/ddingdong/ddingdongBE/domain/formapplication/repository/FormApplicationRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,4 @@ List<RecentFormInfo> findRecentFormByDateWithApplicationCount(
6060
List<FormApplication> findAllByForm(Form form);
6161

6262
List<FormApplication> getAllByFormIdAndStatus(Long formId, FormApplicationStatus status);
63-
6463
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.repository.dto;
2+
3+
public interface FileAnswerInfo {
4+
5+
Long getId();
6+
7+
String getName();
8+
9+
String getFileName();
10+
11+
}

src/main/java/ddingdong/ddingdongBE/domain/formapplication/service/FacadeUserFormApplicationServiceImpl.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void createFormApplication(CreateFormApplicationCommand createFormApplica
3939

4040
List<FormAnswer> formAnswers = toFormAnswers(savedFormApplication,
4141
createFormApplicationCommand.formAnswerCommands());
42-
updateFileMetaDataStatusToCoupled(formAnswers, form);
42+
updateFileMetaDataStatusToCoupled(formAnswers);
4343
formAnswerService.createAll(formAnswers);
4444
}
4545

@@ -50,16 +50,14 @@ private void validateFormPeriod(LocalDate startDate,
5050
}
5151
}
5252

53-
private void updateFileMetaDataStatusToCoupled(List<FormAnswer> formAnswers, Form form) {
54-
formAnswers.forEach(formAnswer -> {
55-
if (formAnswer.isFile()) {
56-
fileMetaDataService.updateStatusToCoupled(
53+
private void updateFileMetaDataStatusToCoupled(List<FormAnswer> formAnswers) {
54+
formAnswers.stream()
55+
.filter(FormAnswer::isFile)
56+
.forEach(formAnswer -> fileMetaDataService.updateStatusToCoupled(
5757
formAnswer.getValue(),
5858
FORM_FILE,
59-
form.getId()
60-
);
61-
}
62-
});
59+
formAnswer.getId()
60+
));
6361
}
6462

6563
private List<FormAnswer> toFormAnswers(
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.service;
2+
3+
import static ddingdong.ddingdongBE.domain.filemetadata.entity.DomainType.FORM_FILE;
4+
import static ddingdong.ddingdongBE.domain.filemetadata.entity.FileStatus.COUPLED;
5+
6+
import ddingdong.ddingdongBE.domain.formapplication.repository.FormAnswerRepository;
7+
import ddingdong.ddingdongBE.domain.formapplication.repository.dto.FileAnswerInfo;
8+
import java.util.List;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.stereotype.Service;
11+
12+
@Service
13+
@RequiredArgsConstructor
14+
public class FileFormAnswerService {
15+
16+
private final FormAnswerRepository formAnswerRepository;
17+
18+
public List<FileAnswerInfo> getAllFileApplicationInfo(List<Long> answerIds) {
19+
return formAnswerRepository.findAllFileAnswerInfo(FORM_FILE.name(), answerIds, COUPLED.name());
20+
}
21+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.repository;
2+
3+
import static org.assertj.core.api.SoftAssertions.assertSoftly;
4+
5+
import com.navercorp.fixturemonkey.FixtureMonkey;
6+
import ddingdong.ddingdongBE.common.support.DataJpaTestSupport;
7+
import ddingdong.ddingdongBE.common.support.FixtureMonkeyFactory;
8+
import ddingdong.ddingdongBE.domain.filemetadata.entity.DomainType;
9+
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileMetaData;
10+
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileStatus;
11+
import ddingdong.ddingdongBE.domain.filemetadata.repository.FileMetaDataRepository;
12+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormAnswer;
13+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
14+
import ddingdong.ddingdongBE.domain.formapplication.repository.dto.FileAnswerInfo;
15+
import java.util.List;
16+
import java.util.UUID;
17+
import org.junit.jupiter.api.DisplayName;
18+
import org.junit.jupiter.api.Test;
19+
import org.springframework.beans.factory.annotation.Autowired;
20+
21+
class FormApplicationRepositoryTest extends DataJpaTestSupport {
22+
23+
@Autowired
24+
private FormApplicationRepository formApplicationRepository;
25+
26+
@Autowired
27+
private FileMetaDataRepository fileMetaDataRepository;
28+
29+
@Autowired
30+
private FormAnswerRepository formAnswerRepository;
31+
32+
private FixtureMonkey fixtureMonkey = FixtureMonkeyFactory.getNotNullBuilderIntrospectorMonkey();
33+
34+
@DisplayName("폼 지원서id와 FileMetaData의 entityId와 조인하여 정보를 조회한다")
35+
@Test
36+
void findAllFileApplicationInfo() {
37+
// given
38+
FormApplication formApplication = fixtureMonkey.giveMeBuilder(FormApplication.class)
39+
.set("name", "이름1")
40+
.set("form", null)
41+
.sample();
42+
FormApplication savedFormApplication = formApplicationRepository.save(formApplication);
43+
FormAnswer formAnswer = FormAnswer.builder()
44+
.formApplication(savedFormApplication)
45+
.value(List.of())
46+
.build();
47+
FormAnswer savedFormAnswer = formAnswerRepository.save(formAnswer);
48+
FormApplication formApplication2 = fixtureMonkey.giveMeBuilder(FormApplication.class)
49+
.set("name", "이름2")
50+
.set("form", null)
51+
.sample();
52+
FormApplication savedFormApplication2 = formApplicationRepository.save(formApplication2);
53+
FormAnswer formAnswer2 = FormAnswer.builder()
54+
.formApplication(savedFormApplication2)
55+
.value(List.of())
56+
.build();
57+
FormAnswer savedFormAnswer2 = formAnswerRepository.save(formAnswer2);
58+
FileMetaData fileMetaData = FileMetaData.builder()
59+
.id(UUID.randomUUID())
60+
.entityId(savedFormAnswer.getId())
61+
.fileName("파일 이름1")
62+
.domainType(DomainType.FORM_FILE)
63+
.fileStatus(FileStatus.COUPLED)
64+
.fileKey("1")
65+
.build();
66+
FileMetaData fileMetaData2 = FileMetaData.builder()
67+
.id(UUID.randomUUID())
68+
.entityId(savedFormAnswer2.getId())
69+
.fileName("파일 이름2")
70+
.domainType(DomainType.FORM_FILE)
71+
.fileStatus(FileStatus.COUPLED)
72+
.fileKey("1")
73+
.build();
74+
fileMetaDataRepository.saveAll(List.of(fileMetaData, fileMetaData2));
75+
List<Long> ids = List.of(savedFormAnswer.getId(), savedFormAnswer2.getId());
76+
77+
// when
78+
List<FileAnswerInfo> fileAnswerInfos = formAnswerRepository.findAllFileAnswerInfo(
79+
DomainType.FORM_FILE.name(), ids, FileStatus.COUPLED.name());
80+
81+
// then
82+
assertSoftly(softly -> {
83+
softly.assertThat(fileAnswerInfos).hasSize(2);
84+
softly.assertThat(fileAnswerInfos.get(0).getFileName()).isEqualTo(fileMetaData.getFileName());
85+
softly.assertThat(fileAnswerInfos.get(0).getName()).isEqualTo(savedFormApplication.getName());
86+
softly.assertThat(fileAnswerInfos.get(0).getId()).isEqualTo(savedFormAnswer.getId());
87+
softly.assertThat(fileAnswerInfos.get(1).getFileName()).isEqualTo(fileMetaData2.getFileName());
88+
});
89+
}
90+
}

0 commit comments

Comments
 (0)