From 2079f88d35c774bb55ea9ced10dff0eede6fc79a Mon Sep 17 00:00:00 2001 From: LEESEUNGMIN Date: Sat, 14 May 2022 02:27:10 +0900 Subject: [PATCH 1/6] =?UTF-8?q?Feat=20:=20CustomizedMetaDataRepository=20?= =?UTF-8?q?=EB=82=B4=20findByProjectIdWithPagingAndFiltering=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit issue : #272 기능 추가 : CustomizedMetaDataRepository 내 findByProjectIdWithPagingAndFiltering API를 추가하여, 파라미터 값으로 받은 page, size, projectId 를 통해 해당 프로젝트 아이디를 가진 메타데이터 중 page 값에 해당 하는 메타데이터들을 size 만큼 받아 온다. MeataData QA로 실제 DB로 접근하여 테스팅시, * 기존 방식으로 10만개 기준 2sec 380ms가 소요되지만 size를 20으로 규정 후 paging 기법으로 찾으니, 330ms만에 해당 페이징 내에 있는 메타데이터 리스트를 찾아올 수 있었다. 추가 방향 : 1. 필터링 값들을 동적으로 적용할 수 있도록 수정한다. 2. 개선율을 100만개 단위로 계산해 보고, 성능향상을 기록한다. --- .../CustomizedMetaDataRepository.java | 1 + .../CustomizedMetaDataRepositoryImpl.java | 32 +++++++++++++++++++ .../dsmp/QA/metadata/MetaDataQA.java | 14 ++++++-- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java index 470aa54..11d103d 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java @@ -5,4 +5,5 @@ public interface CustomizedMetaDataRepository { void updateType(String metadataId, String type); void setMalignancyClassification(String metadataId, HashMap classificationSet); + void findByProjectIdWithPagingAndFiltering(String projectId,int page,int size); } diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java index 43753b1..1644b12 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java @@ -1,12 +1,19 @@ package com.knuipalab.dsmp.metadata; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; +import org.springframework.data.support.PageableExecutionUtils; import org.springframework.util.Assert; + import java.util.HashMap; +import java.util.List; public class CustomizedMetaDataRepositoryImpl implements CustomizedMetaDataRepository{ @@ -35,4 +42,29 @@ public void setMalignancyClassification(String metadataId, HashMap classificatio }); mongoTemplate.updateFirst(query,update,"metadata"); } + + @Override + public void findByProjectIdWithPagingAndFiltering(String projectId, int page, int size) { + + Pageable pageable = PageRequest.of(page,size, Sort.unsorted()); + + Query query = new Query() + .with(pageable) + .skip(pageable.getPageSize() * pageable.getPageNumber()) // offset + .limit(pageable.getPageSize()); + + //Add Filtered + query.addCriteria(Criteria.where("projectId").is(projectId)); + + List filteredMetaData = mongoTemplate.find(query, MetaData.class, "metadata"); + Page metaDataPage = PageableExecutionUtils.getPage( + filteredMetaData, + pageable, + () -> mongoTemplate.count(query.skip(-1).limit(-1),MetaData.class) + // query.skip(-1).limit(-1)의 이유는 현재 쿼리가 페이징 하려고 하는 offset 까지만 보기에 이를 맨 처음부터 끝까지러 set 해줘 정확한 도큐먼트 개수를 구한다. + ); + + } + + } diff --git a/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java b/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java index ab3f8e3..3224dcd 100644 --- a/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java +++ b/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.github.javafaker.Faker; import com.google.common.collect.Lists; +import com.knuipalab.dsmp.metadata.CustomizedMetaDataRepository; import com.knuipalab.dsmp.metadata.MetaData; import com.knuipalab.dsmp.metadata.MetaDataRepository; import com.knuipalab.dsmp.project.Project; @@ -36,6 +37,9 @@ public class MetaDataQA { @SpyBean MetaDataRepository metaDataRepository; + @SpyBean + CustomizedMetaDataRepository customizedMetaDataRepository; + Logger log = (Logger) LoggerFactory.getLogger(MetaDataQA.class); public User createMockUser(){ @@ -75,7 +79,7 @@ public String createMockStrBodyList(){ long beforeTime = System.currentTimeMillis(); - long METADATA_SIZE = 1000; + long METADATA_SIZE = 100; Faker faker = new Faker(); StringBuilder strBodyList = new StringBuilder(); @@ -188,9 +192,15 @@ public void findAllQA(){ long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 long secDiffTime = (afterTime - beforeTime); //두 시간에 차 계산 - + log.info("findAll 개수 : "+metaDataList.size()); log.info("findAll QA 실행 시간(m) : "+secDiffTime); } + @Profile("QA") + @Test + public void findByProjectIdWithPagingAndFiltering() { + customizedMetaDataRepository.findByProjectIdWithPagingAndFiltering("54321",0,10); + } + } From 1e8a7b37c1088aa885989cd85ac30106c50fe872 Mon Sep 17 00:00:00 2001 From: LEESEUNGMIN Date: Mon, 16 May 2022 01:41:03 +0900 Subject: [PATCH 2/6] =?UTF-8?q?Feat=20:=20Request=20Parm=20=ED=86=B5?= =?UTF-8?q?=ED=95=9C=20page&size=20=EB=8F=99=EC=A0=81=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit issue : #273 Controller 영역에서 Request Parm 통한 page&size 동적으로 처리 가능하도록 수정 --- .../success/SuccessDataResponse.java | 2 +- .../CustomizedMetaDataRepository.java | 4 +++- .../CustomizedMetaDataRepositoryImpl.java | 11 ++++++++- .../dsmp/metadata/MetaDataApiController.java | 10 +++++--- .../dsmp/metadata/MetaDataService.java | 24 +++++++++++++++++++ .../dsmp/QA/metadata/MetaDataQA.java | 20 +++++++++++----- .../api/MetaDataApiControllerTest.java | 7 ++++++ 7 files changed, 66 insertions(+), 12 deletions(-) diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/http/httpResponse/success/SuccessDataResponse.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/http/httpResponse/success/SuccessDataResponse.java index 37c8a04..796bcf8 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/http/httpResponse/success/SuccessDataResponse.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/http/httpResponse/success/SuccessDataResponse.java @@ -12,7 +12,7 @@ public class SuccessDataResponse extends BasicResponse { private LocalDateTime timestamp ; - private int count; + private int count; // 바디 값이 리스트인 경우 리스트 개수 private int status; diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java index 11d103d..7308732 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java @@ -1,9 +1,11 @@ package com.knuipalab.dsmp.metadata; +import org.springframework.data.domain.Page; + import java.util.HashMap; public interface CustomizedMetaDataRepository { void updateType(String metadataId, String type); void setMalignancyClassification(String metadataId, HashMap classificationSet); - void findByProjectIdWithPagingAndFiltering(String projectId,int page,int size); + Page findByProjectIdWithPagingAndFiltering(String projectId, int page, int size, HashMap parmMap); } diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java index 1644b12..7560278 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java @@ -13,6 +13,7 @@ import java.util.HashMap; +import java.util.Iterator; import java.util.List; public class CustomizedMetaDataRepositoryImpl implements CustomizedMetaDataRepository{ @@ -43,8 +44,15 @@ public void setMalignancyClassification(String metadataId, HashMap classificatio mongoTemplate.updateFirst(query,update,"metadata"); } + // Iterator keys = parmMap.keySet().iterator(); + // while (keys.hasNext()){ + // String key = keys.next(); + // System.out.println(key); + // } + + @Override - public void findByProjectIdWithPagingAndFiltering(String projectId, int page, int size) { + public Page findByProjectIdWithPagingAndFiltering(String projectId,int page, int size, HashMap parmMap) { Pageable pageable = PageRequest.of(page,size, Sort.unsorted()); @@ -64,6 +72,7 @@ public void findByProjectIdWithPagingAndFiltering(String projectId, int page, in // query.skip(-1).limit(-1)의 이유는 현재 쿼리가 페이징 하려고 하는 offset 까지만 보기에 이를 맨 처음부터 끝까지러 set 해줘 정확한 도큐먼트 개수를 구한다. ); + return metaDataPage; } diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java index 8657b79..1dc8f83 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java @@ -6,10 +6,13 @@ import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; @RestController @@ -20,9 +23,9 @@ public class MetaDataApiController { // projectId가 같은 metadata를 모두 반환 @GetMapping("api/MetaData/{projectId}") - public ResponseEntity< ? extends BasicResponse> findByProjectId(@PathVariable String projectId, MultipartFile multipartFile){ - List metaDataResponseDtos = metaDataService.findByProjectId(projectId); - return ResponseEntity.ok().body(new SuccessDataResponse>(metaDataResponseDtos)); + public ResponseEntity< ? extends BasicResponse> findByProjectIdWithPagingAndFiltering(@PathVariable String projectId, @RequestParam HashMap parmMap){ + Page metaDataPage = metaDataService.findByProjectIdWithPagingAndFiltering(projectId,parmMap); + return ResponseEntity.ok().body(new SuccessDataResponse>(metaDataPage)); } // metatdata를 projectId와 함께 저장 @@ -63,4 +66,5 @@ public ResponseEntity deleteById(@PathVariable String return ResponseEntity.ok().body(new SuccessResponse()); } + } diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java index 9ca821e..42aad5e 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java @@ -7,10 +7,13 @@ import com.knuipalab.dsmp.project.ProjectService; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; @@ -36,6 +39,27 @@ public List findByProjectId(String projectId) { .collect(Collectors.toList()); } + @Transactional (readOnly = true) + public Page findByProjectIdWithPagingAndFiltering(String projectId, HashMap parmMap) { + + //default page and size + int page = 0; + int size = 20; + if(parmMap.containsKey("page")){ + page = Integer.parseInt(parmMap.get("page").toString()); + parmMap.remove("page"); + } + if(parmMap.containsKey("size")){ + size = Integer.parseInt(parmMap.get("size").toString()); + parmMap.remove("size"); + } + + projectService.findById(projectId); + + return metaDataRepository.findByProjectIdWithPagingAndFiltering(projectId, page, size, parmMap); + + } + @Transactional public void insert(MetaDataCreateRequestDto metaDataCreateRequestDto){ diff --git a/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java b/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java index 3224dcd..19619f2 100644 --- a/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java +++ b/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java @@ -21,9 +21,11 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.annotation.Profile; +import org.springframework.data.domain.Page; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; @SpringBootTest @@ -79,7 +81,7 @@ public String createMockStrBodyList(){ long beforeTime = System.currentTimeMillis(); - long METADATA_SIZE = 100; + long METADATA_SIZE = 200; Faker faker = new Faker(); StringBuilder strBodyList = new StringBuilder(); @@ -106,9 +108,9 @@ public String createMockStrBodyList(){ strBodyList.append("]"); long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 - long secDiffTime = (afterTime - beforeTime)/1000; //두 시간에 차 계산 + long secDiffTime = (afterTime - beforeTime); //두 시간에 차 계산 - log.info("createMockStrBodyList 실행 시간(m) : "+secDiffTime); + log.info("createMockStrBodyList 실행 시간(ms) : "+secDiffTime); return strBodyList.toString(); } @@ -179,7 +181,7 @@ public void saveAllQA(){ long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 long secDiffTime = (afterTime - beforeTime); //두 시간에 차 계산 - log.info("saveAll QA 실행 시간(m) : "+secDiffTime); + log.info("saveAll QA 실행 시간(ms) : "+secDiffTime); } @@ -193,13 +195,19 @@ public void findAllQA(){ long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 long secDiffTime = (afterTime - beforeTime); //두 시간에 차 계산 log.info("findAll 개수 : "+metaDataList.size()); - log.info("findAll QA 실행 시간(m) : "+secDiffTime); + log.info("findAll QA 실행 시간(ms) : "+secDiffTime); } @Profile("QA") @Test public void findByProjectIdWithPagingAndFiltering() { - customizedMetaDataRepository.findByProjectIdWithPagingAndFiltering("54321",0,10); + long beforeTime = System.currentTimeMillis(); + HashMap parmMap = new HashMap<>(); + Page metaDataPage = customizedMetaDataRepository.findByProjectIdWithPagingAndFiltering("54321",11123,20,parmMap); + long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + long secDiffTime = (afterTime - beforeTime); //두 시간에 차 계산 + log.info("findByProjectIdWithPagingAndFiltering 개수 : "+metaDataPage.getContent().size()); + log.info("findByProjectIdWithPagingAndFiltering QA 실행 시간(ms) : "+secDiffTime); } diff --git a/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java b/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java index 9f96f6f..006074f 100644 --- a/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java +++ b/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java @@ -270,5 +270,12 @@ void deleteByIdTest() throws Exception{ ; } + @WithMockUser + @DisplayName("find Metadata with paging and filtering") + @Test + void findByProjectIdWithPagingAndFiltering() { +// mvc.perform(get("/api/MetaData/12345")) + } + } From 9c40bb9fba8226cff8c8495f400462b182b6d54b Mon Sep 17 00:00:00 2001 From: JAESEONG LEE Date: Tue, 17 May 2022 16:26:53 +0900 Subject: [PATCH 3/6] =?UTF-8?q?Fix=20:=20=EB=A8=B8=EC=8B=A0=EB=9F=AC?= =?UTF-8?q?=EB=8B=9D=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=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 머신러닝 API 테스트 코드의 경우 빈 생성에 필요한 내부 클래스 인스턴스인 AsyncMetaDataSampler가 빈으로 생성되어 있지 않아 이를 주입하였다. --- server/DSMP/build.gradle | 2 ++ .../MachineLearningApiControllerTest.java | 17 +++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/server/DSMP/build.gradle b/server/DSMP/build.gradle index 1f5d3bc..64a890d 100644 --- a/server/DSMP/build.gradle +++ b/server/DSMP/build.gradle @@ -40,6 +40,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.projectlombok:lombok' implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' + implementation 'org.hamcrest:hamcrest-core:2.2' annotationProcessor 'org.projectlombok:lombok'// lombok implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' // mongoDB implementation 'com.fasterxml.jackson.core:jackson-databind' //jackson diff --git a/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/machineLearning/MachineLearningApiControllerTest.java b/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/machineLearning/MachineLearningApiControllerTest.java index 00f7db4..36d0a1e 100644 --- a/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/machineLearning/MachineLearningApiControllerTest.java +++ b/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/machineLearning/MachineLearningApiControllerTest.java @@ -1,5 +1,6 @@ package com.knuipalab.dsmp.controller.machineLearning; +import com.knuipalab.dsmp.machineLearning.MachineLearningInference.BasicMalignancyServerMessenger; import com.knuipalab.dsmp.user.auth.CustomOAuth2UserService; import com.knuipalab.dsmp.machineLearning.MachineLearningApiController; import com.knuipalab.dsmp.machineLearning.TrainTypeSampling.AsyncMetaDataSampler; @@ -21,7 +22,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - +import static org.mockito.BDDMockito.given; @ExtendWith(SpringExtension.class) @WebMvcTest(controllers = MachineLearningApiController.class) @@ -29,7 +30,10 @@ public class MachineLearningApiControllerTest { @MockBean private CustomOAuth2UserService customOAuth2UserService; - + @MockBean + private BasicMalignancyServerMessenger basicMalignancyServerMessenger; + @MockBean + private AsyncMetaDataSampler asyncMetaDataSampler; @Autowired private WebApplicationContext context; @@ -43,11 +47,9 @@ public void setup() { .build(); } - @MockBean - private AsyncMetaDataSampler asyncMetaDataSampler; @WithMockUser - @DisplayName("Type Sampling Test by ProjectId - Success") + @DisplayName("Type Sampling Test by ProjectId") @Test void typeSamplingTest() throws Exception { @@ -59,11 +61,10 @@ void typeSamplingTest() throws Exception { } @WithMockUser - @DisplayName("Set Malignancy Classification Test by ProjectId - Success") + @DisplayName("Set Malignancy Classification Test by ProjectId and Model Name") @Test void setMalignancyClassificationTest() throws Exception { - - mvc.perform(put("/api/MetaData/MalignancyClassification/54321")) + mvc.perform(put("/api/MetaData/MalignancyClassification/54321/Basic")) .andExpect(status().isOk()) .andExpect(jsonPath("$.status",is(200))) .andDo(print()) From 5cfe29f5782734d199ba1ef92f93f3e7eab87375 Mon Sep 17 00:00:00 2001 From: LEESEUNGMIN Date: Thu, 19 May 2022 03:40:52 +0900 Subject: [PATCH 4/6] =?UTF-8?q?Fix=20:=20findByProjectIdWithPaging=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20findByProjectId=20TestCo?= =?UTF-8?q?de=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit issue : #272 오류 수정 내역 : 1. 현재 기존에 만들었던 함수 findByProjectIdWithPagingAndFiltering에서 현재 필터링 기능이 없어 네이밍을 findByProjectIdWithPaging으로 수정하였음 2. 기존의 @GetMapping("api/MetaData/{projectId}")으로 진행했던 testcode에서 findByProjectId 기능을 findByProjectIdWithPaging 기능으로 수정하여 진행하였음 (컨트롤러&서비스 단). => projectId와 페이징 정보를 기반으로 메타데이터 리스트를 반환한다. --- .../CustomizedMetaDataRepository.java | 2 +- .../CustomizedMetaDataRepositoryImpl.java | 2 +- .../dsmp/metadata/MetaDataApiController.java | 4 +- .../dsmp/metadata/MetaDataService.java | 4 +- .../dsmp/QA/metadata/MetaDataQA.java | 8 ++-- .../api/MetaDataApiControllerTest.java | 37 +++++++++++------- .../service/metadata/MetaDataServiceTest.java | 38 +++++++++++++------ 7 files changed, 59 insertions(+), 36 deletions(-) diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java index 7308732..edec119 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepository.java @@ -7,5 +7,5 @@ public interface CustomizedMetaDataRepository { void updateType(String metadataId, String type); void setMalignancyClassification(String metadataId, HashMap classificationSet); - Page findByProjectIdWithPagingAndFiltering(String projectId, int page, int size, HashMap parmMap); + Page findByProjectIdWithPaging(String projectId, int page, int size, HashMap parmMap); } diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java index 7560278..069dd27 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/CustomizedMetaDataRepositoryImpl.java @@ -52,7 +52,7 @@ public void setMalignancyClassification(String metadataId, HashMap classificatio @Override - public Page findByProjectIdWithPagingAndFiltering(String projectId,int page, int size, HashMap parmMap) { + public Page findByProjectIdWithPaging(String projectId,int page, int size, HashMap parmMap) { Pageable pageable = PageRequest.of(page,size, Sort.unsorted()); diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java index 1dc8f83..89f0c1b 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java @@ -23,8 +23,8 @@ public class MetaDataApiController { // projectId가 같은 metadata를 모두 반환 @GetMapping("api/MetaData/{projectId}") - public ResponseEntity< ? extends BasicResponse> findByProjectIdWithPagingAndFiltering(@PathVariable String projectId, @RequestParam HashMap parmMap){ - Page metaDataPage = metaDataService.findByProjectIdWithPagingAndFiltering(projectId,parmMap); + public ResponseEntity< ? extends BasicResponse> findByProjectIdWithPaging(@PathVariable String projectId, @RequestParam HashMap parmMap){ + Page metaDataPage = metaDataService.findByProjectIdWithPaging(projectId,parmMap); return ResponseEntity.ok().body(new SuccessDataResponse>(metaDataPage)); } diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java index 42aad5e..b70fa2f 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java @@ -40,7 +40,7 @@ public List findByProjectId(String projectId) { } @Transactional (readOnly = true) - public Page findByProjectIdWithPagingAndFiltering(String projectId, HashMap parmMap) { + public Page findByProjectIdWithPaging(String projectId, HashMap parmMap) { //default page and size int page = 0; @@ -56,7 +56,7 @@ public Page findByProjectIdWithPagingAndFiltering(String projectId, Ha projectService.findById(projectId); - return metaDataRepository.findByProjectIdWithPagingAndFiltering(projectId, page, size, parmMap); + return metaDataRepository.findByProjectIdWithPaging(projectId, page, size, parmMap); } diff --git a/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java b/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java index 19619f2..0d0ad30 100644 --- a/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java +++ b/server/DSMP/src/test/java/com/knuipalab/dsmp/QA/metadata/MetaDataQA.java @@ -200,14 +200,14 @@ public void findAllQA(){ @Profile("QA") @Test - public void findByProjectIdWithPagingAndFiltering() { + public void findByProjectIdWithPaging() { long beforeTime = System.currentTimeMillis(); HashMap parmMap = new HashMap<>(); - Page metaDataPage = customizedMetaDataRepository.findByProjectIdWithPagingAndFiltering("54321",11123,20,parmMap); + Page metaDataPage = customizedMetaDataRepository.findByProjectIdWithPaging("54321",11123,20,parmMap); long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 long secDiffTime = (afterTime - beforeTime); //두 시간에 차 계산 - log.info("findByProjectIdWithPagingAndFiltering 개수 : "+metaDataPage.getContent().size()); - log.info("findByProjectIdWithPagingAndFiltering QA 실행 시간(ms) : "+secDiffTime); + log.info("findByProjectIdWithPaging 개수 : "+metaDataPage.getContent().size()); + log.info("findByProjectIdWithPaging QA 실행 시간(ms) : "+secDiffTime); } diff --git a/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java b/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java index 006074f..a60e4b4 100644 --- a/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java +++ b/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.knuipalab.dsmp.http.httpResponse.success.SuccessDataResponse; import com.knuipalab.dsmp.metadata.*; import com.knuipalab.dsmp.user.auth.CustomOAuth2UserService; import org.bson.Document; @@ -13,14 +14,21 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.support.PageableExecutionUtils; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.context.WebApplicationContext; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -134,32 +142,33 @@ public List createMockMetaDataList(){ } @WithMockUser - @DisplayName("Find by ProjectId - Success") + @DisplayName("Find by ProjectId with Paging - Success") @Test - void findByProjectIdTest() throws Exception { + void findByProjectIdWithPaging() throws Exception { //given List metaDataList = createMockMetaDataList(); - List metaDataResponseDtoList = metaDataList.stream() - .map(metaData -> new MetaDataResponseDto(metaData)) - .collect(Collectors.toList()); + HashMap parmMap = new HashMap(); + parmMap.put("page",0); + parmMap.put("size",2); + + Pageable pageable = PageRequest.of(0,2, Sort.unsorted()); + Page metaDataPage = PageableExecutionUtils.getPage( + metaDataList, + pageable, + () -> 5 + ); //when - given(metaDataService.findByProjectId("54321")) - .willReturn(metaDataResponseDtoList); + given(metaDataService.findByProjectIdWithPaging("54321",parmMap)) + .willReturn(metaDataPage); mvc.perform(get("/api/MetaData/54321")) .andExpect(status().isOk()) // status 200 .andExpect(content().contentType(MediaType.APPLICATION_JSON)) //JSON 반환 .andExpect(jsonPath("$.status",is(200))) - .andExpect(jsonPath("$.count",is(2))) - .andExpect(jsonPath("$.body.[0].metadataId", is("12345"))) - .andExpect(jsonPath("$.body.[0].projectId", is("54321"))) - .andExpect(jsonPath("$.body.[0].body.age", is(53))) // body 확인 - .andExpect(jsonPath("$.body.[1].metadataId", is("12346"))) - .andExpect(jsonPath("$.body.[1].projectId", is("54321"))) - .andExpect(jsonPath("$.body.[1].body.age", is(54))) // body 확인 + .andExpect(jsonPath("$.count",is(1))) .andDo(print()) ; } diff --git a/server/DSMP/src/test/java/com/knuipalab/dsmp/service/metadata/MetaDataServiceTest.java b/server/DSMP/src/test/java/com/knuipalab/dsmp/service/metadata/MetaDataServiceTest.java index 63b221c..072ac0a 100644 --- a/server/DSMP/src/test/java/com/knuipalab/dsmp/service/metadata/MetaDataServiceTest.java +++ b/server/DSMP/src/test/java/com/knuipalab/dsmp/service/metadata/MetaDataServiceTest.java @@ -17,9 +17,15 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.support.PageableExecutionUtils; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -156,28 +162,36 @@ public ProjectResponseDto createMockProjectResponseDto(){ } @Test - @DisplayName("Find by ProjectId - Success") - public void findByProjectIdTest() { + @DisplayName("Find by ProjectId with Paging - Success") + public void findByProjectIdWithPaging() { // given String projectId = "54321"; + int page = 0; + int size = 20; List mockedMetaDataList = createMockMetaDataList(); + HashMap parmMap = new HashMap(); + + Pageable pageable = PageRequest.of(0,2, Sort.unsorted()); + Page metaDataPage = PageableExecutionUtils.getPage( + mockedMetaDataList, + pageable, + () -> 5 + ); + // mocking - given(metaDataRepository.findByProjectId(projectId)) - .willReturn(mockedMetaDataList); + given(metaDataRepository.findByProjectIdWithPaging(projectId,page,size,parmMap)) + .willReturn(metaDataPage); //when - List mockedMetaDataResponseDtoList = metaDataRepository.findByProjectId(projectId) - .stream() - .map( metaData -> new MetaDataResponseDto(metaData) ) - .collect(Collectors.toList()); + Page mockedMetaDataPage = metaDataRepository.findByProjectIdWithPaging(projectId,page,size,parmMap); //then - Assertions.assertEquals(mockedMetaDataResponseDtoList.get(0).getProjectId(),projectId); - Assertions.assertEquals(mockedMetaDataResponseDtoList.get(0).getMetadataId(),"12345"); - Assertions.assertEquals(mockedMetaDataResponseDtoList.get(1).getProjectId(),projectId); - Assertions.assertEquals(mockedMetaDataResponseDtoList.get(1).getMetadataId(),"12346"); + Assertions.assertEquals(mockedMetaDataPage.getTotalElements(),5); + Assertions.assertEquals(mockedMetaDataPage.getTotalPages(),3); + Assertions.assertEquals(mockedMetaDataPage.getContent().size(),mockedMetaDataList.size()); + } From 2483b93f7e67cddd1ff40fb7ff56785beff14879 Mon Sep 17 00:00:00 2001 From: LEESEUNGMIN Date: Thu, 19 May 2022 21:04:51 +0900 Subject: [PATCH 5/6] =?UTF-8?q?Fix=20:=EA=B8=B0=EC=A1=B4=EC=97=90=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=ED=95=9C=20findByProjectId=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EC=9D=84=20=EC=9B=90=EC=83=81=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit issue : #273 문제해결 점 : 기존에 제거한 findByProjectId 기능을 원상복구 하고, uri 중복을 피하기 위해 pagination기능의 uri를 api/MetaData/{projectId}/pagination로 수정 --- .../dsmp/metadata/MetaDataApiController.java | 9 +++- .../api/MetaDataApiControllerTest.java | 46 +++++++++++++------ .../service/metadata/MetaDataServiceTest.java | 24 ++++++++++ 3 files changed, 62 insertions(+), 17 deletions(-) diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java index 89f0c1b..0c2d745 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java @@ -9,10 +9,8 @@ import org.springframework.data.domain.Page; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; -import java.util.Iterator; import java.util.List; @RestController @@ -23,6 +21,13 @@ public class MetaDataApiController { // projectId가 같은 metadata를 모두 반환 @GetMapping("api/MetaData/{projectId}") + public ResponseEntity< ? extends BasicResponse> findByProjectId(@PathVariable String projectId){ + List metaDataResponseDtos = metaDataService.findByProjectId(projectId); + return ResponseEntity.ok().body(new SuccessDataResponse>(metaDataResponseDtos)); + } + + // projectId가 같은 metadata를 반환 with paging + @GetMapping("api/MetaData/{projectId}/pagination") public ResponseEntity< ? extends BasicResponse> findByProjectIdWithPaging(@PathVariable String projectId, @RequestParam HashMap parmMap){ Page metaDataPage = metaDataService.findByProjectIdWithPaging(projectId,parmMap); return ResponseEntity.ok().body(new SuccessDataResponse>(metaDataPage)); diff --git a/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java b/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java index a60e4b4..3a7cc4a 100644 --- a/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java +++ b/server/DSMP/src/test/java/com/knuipalab/dsmp/controller/metadata/api/MetaDataApiControllerTest.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.internal.matchers.Any; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -33,6 +34,7 @@ import java.util.stream.Collectors; import static org.hamcrest.CoreMatchers.is; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.BDDMockito.given; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -142,37 +144,51 @@ public List createMockMetaDataList(){ } @WithMockUser - @DisplayName("Find by ProjectId with Paging - Success") + @DisplayName("Find by ProjectId - Success") @Test - void findByProjectIdWithPaging() throws Exception { + void findByProjectIdTest() throws Exception { //given List metaDataList = createMockMetaDataList(); - HashMap parmMap = new HashMap(); - parmMap.put("page",0); - parmMap.put("size",2); - - Pageable pageable = PageRequest.of(0,2, Sort.unsorted()); - Page metaDataPage = PageableExecutionUtils.getPage( - metaDataList, - pageable, - () -> 5 - ); + List metaDataResponseDtoList = metaDataList.stream() + .map(metaData -> new MetaDataResponseDto(metaData)) + .collect(Collectors.toList()); //when - given(metaDataService.findByProjectIdWithPaging("54321",parmMap)) - .willReturn(metaDataPage); + given(metaDataService.findByProjectId("54321")) + .willReturn(metaDataResponseDtoList); mvc.perform(get("/api/MetaData/54321")) .andExpect(status().isOk()) // status 200 .andExpect(content().contentType(MediaType.APPLICATION_JSON)) //JSON 반환 .andExpect(jsonPath("$.status",is(200))) - .andExpect(jsonPath("$.count",is(1))) + .andExpect(jsonPath("$.count",is(2))) + .andExpect(jsonPath("$.body.[0].metadataId", is("12345"))) + .andExpect(jsonPath("$.body.[0].projectId", is("54321"))) + .andExpect(jsonPath("$.body.[0].body.age", is(53))) // body 확인 + .andExpect(jsonPath("$.body.[1].metadataId", is("12346"))) + .andExpect(jsonPath("$.body.[1].projectId", is("54321"))) + .andExpect(jsonPath("$.body.[1].body.age", is(54))) // body 확인 + .andDo(print()) + ; + } + + @WithMockUser + @DisplayName("Find by ProjectId with Paging - Success") + @Test + void findByProjectIdWithPaging() throws Exception { + + //when + mvc.perform(get("/api/MetaData/54321/pagination?page=0&size=2")) + .andExpect(status().isOk()) // status 200 + .andExpect(jsonPath("$.status",is(200))) .andDo(print()) ; } + + @WithMockUser @DisplayName("Insert by ProjectId - Success") @Test diff --git a/server/DSMP/src/test/java/com/knuipalab/dsmp/service/metadata/MetaDataServiceTest.java b/server/DSMP/src/test/java/com/knuipalab/dsmp/service/metadata/MetaDataServiceTest.java index 072ac0a..014d701 100644 --- a/server/DSMP/src/test/java/com/knuipalab/dsmp/service/metadata/MetaDataServiceTest.java +++ b/server/DSMP/src/test/java/com/knuipalab/dsmp/service/metadata/MetaDataServiceTest.java @@ -161,6 +161,30 @@ public ProjectResponseDto createMockProjectResponseDto(){ return new ProjectResponseDto(project); } + @Test + @DisplayName("Find by ProjectId - Success") + public void findByProjectIdTest() { + // given + String projectId = "54321"; + List mockedMetaDataList = createMockMetaDataList(); + + // mocking + given(metaDataRepository.findByProjectId(projectId)) + .willReturn(mockedMetaDataList); + //when + List mockedMetaDataResponseDtoList = metaDataRepository.findByProjectId(projectId) + .stream() + .map( metaData -> new MetaDataResponseDto(metaData) ) + .collect(Collectors.toList()); + + //then + Assertions.assertEquals(mockedMetaDataResponseDtoList.get(0).getProjectId(),projectId); + Assertions.assertEquals(mockedMetaDataResponseDtoList.get(0).getMetadataId(),"12345"); + Assertions.assertEquals(mockedMetaDataResponseDtoList.get(1).getProjectId(),projectId); + Assertions.assertEquals(mockedMetaDataResponseDtoList.get(1).getMetadataId(),"12346"); + + } + @Test @DisplayName("Find by ProjectId with Paging - Success") public void findByProjectIdWithPaging() { From 4c72ccff388a40ca792a5f4f8185b5b25aa1ecbe Mon Sep 17 00:00:00 2001 From: JAESEONG LEE Date: Sun, 29 May 2022 17:19:34 +0900 Subject: [PATCH 6/6] Refactor : MetaDataService.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 페이지 요청 정보를 레퍼 클래스로 만들고 메타데이터 리스트를 업로드 할 때, 함수 분할과 람다를 이용하여 가독성 향상 --- .../dsmp/metadata/MetaDataApiController.java | 2 +- .../dsmp/metadata/MetaDataService.java | 99 ++++++++++--------- 2 files changed, 53 insertions(+), 48 deletions(-) diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java index 0c2d745..dc6ef54 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataApiController.java @@ -37,7 +37,7 @@ public class MetaDataApiController { @PostMapping("api/MetaData/{projectId}") public ResponseEntity insert(@PathVariable String projectId,@RequestBody Document body){ MetaDataCreateRequestDto metaDataCreateRequestDto = new MetaDataCreateRequestDto(projectId,body); - metaDataService.insert(metaDataCreateRequestDto); + metaDataService.save(metaDataCreateRequestDto); return ResponseEntity.ok().body(new SuccessResponse()); } diff --git a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java index b70fa2f..888f567 100644 --- a/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java +++ b/server/DSMP/src/main/java/com/knuipalab/dsmp/metadata/MetaDataService.java @@ -5,15 +5,14 @@ import com.knuipalab.dsmp.http.httpResponse.error.handler.exception.MetaDataNotFoundException; import com.knuipalab.dsmp.patient.PatientService; import com.knuipalab.dsmp.project.ProjectService; -import org.bson.Document; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; @@ -29,84 +28,90 @@ public class MetaDataService { @Autowired private PatientService patientService; + private void throwGlobalExceptionWhenProjectNotExist(String projectId){ + projectService.findById(projectId); + } @Transactional (readOnly = true) public List findByProjectId(String projectId) { - - projectService.findById(projectId); - + throwGlobalExceptionWhenProjectNotExist(projectId); return metaDataRepository.findByProjectId(projectId).stream() .map( metaData -> new MetaDataResponseDto(metaData) ) .collect(Collectors.toList()); } - + @Getter + public class PageRequestConfiguration{ + int pageNumber; + int size; + PageRequestConfiguration(HashMap parmMap,int defaultPageNumber,int defaultSize){ + if(parmMap.containsKey("page")){ + this.pageNumber = Integer.parseInt(parmMap.get("page").toString()); + } + else{ + this.pageNumber=defaultPageNumber; + } + if(parmMap.containsKey("size")){ + this.size = Integer.parseInt(parmMap.get("size").toString()); + } + else{ + this.size=defaultSize; + } + } + } @Transactional (readOnly = true) - public Page findByProjectIdWithPaging(String projectId, HashMap parmMap) { - - //default page and size - int page = 0; - int size = 20; - if(parmMap.containsKey("page")){ - page = Integer.parseInt(parmMap.get("page").toString()); - parmMap.remove("page"); + public Page findByProjectIdWithPaging(String projectId, HashMap httpRequestParameterMap) { + + PageRequestConfiguration pageRequestConfiguration=new PageRequestConfiguration(httpRequestParameterMap,0,20); + if(httpRequestParameterMap.containsKey("page")){ + httpRequestParameterMap.remove("page"); } - if(parmMap.containsKey("size")){ - size = Integer.parseInt(parmMap.get("size").toString()); - parmMap.remove("size"); + if(httpRequestParameterMap.containsKey("size")){ + httpRequestParameterMap.remove("size"); } - - projectService.findById(projectId); - - return metaDataRepository.findByProjectIdWithPaging(projectId, page, size, parmMap); + throwGlobalExceptionWhenProjectNotExist(projectId); + return metaDataRepository.findByProjectIdWithPaging(projectId, + pageRequestConfiguration.getPageNumber(), pageRequestConfiguration.getSize(), httpRequestParameterMap); } @Transactional - public void insert(MetaDataCreateRequestDto metaDataCreateRequestDto){ + public void save(MetaDataCreateRequestDto metaDataCreateRequestDto){ - projectService.findById(metaDataCreateRequestDto.getProjectId()); // 존재하는 프로젝트 id인지 확인. + throwGlobalExceptionWhenProjectNotExist(metaDataCreateRequestDto.getProjectId()); MetaData metaData = new MetaData().builder() .projectId(metaDataCreateRequestDto.getProjectId()) .body(metaDataCreateRequestDto.getBody()).build(); - patientService.addProjectCount(metaData.getPatientIdFromBody()); // patient 처리. + patientService.addProjectCount(metaData.getPatientIdFromBody()); - metaDataRepository.save(metaData); // 저장 + metaDataRepository.save(metaData); } @Transactional public void insertAllByMetaDataList(MetaDataCreateAllRequestDto metaDataCreateAllRequestDto){ - List metaDataList=new ArrayList(); - - projectService.findById(metaDataCreateAllRequestDto.getProjectId()); // 존재하는 프로젝트 id인지 확인. + String projectId = metaDataCreateAllRequestDto.getProjectId(); + throwGlobalExceptionWhenProjectNotExist(projectId); if(metaDataCreateAllRequestDto.getBodyList() != null){ - - ListbodyList = metaDataCreateAllRequestDto.getBodyList(); - - String projectId = metaDataCreateAllRequestDto.getProjectId(); - - for(Document body : bodyList){ - MetaData metaData = new MetaData().builder() - .projectId(projectId) - .body(body).build(); - metaDataList.add(metaData); - patientService.addProjectCount(metaData.getPatientIdFromBody()); - } - + List metaDataList = getMetaDataFromMetaDataCreateAllRequestDto(metaDataCreateAllRequestDto, projectId); + metaDataList.forEach(metaData -> patientService.addProjectCount(metaData.getPatientIdFromBody())); int chunk_size = 1000; - for (List batch : Lists.partition(metaDataList,chunk_size)) { - metaDataRepository.saveAll(batch); - } - + Lists.partition(metaDataList,chunk_size).forEach(batch -> metaDataRepository.saveAll(batch) ); } } + @NotNull + private List getMetaDataFromMetaDataCreateAllRequestDto(MetaDataCreateAllRequestDto metaDataCreateAllRequestDto, String projectId) { + return metaDataCreateAllRequestDto.getBodyList().stream() + .map(body -> new MetaData().builder().projectId(projectId).body(body).build()) + .collect(Collectors.toList()); + } + @Transactional public void deleteAllByMetaDataIdList(MetaDataDeleteAllRequestDto metaDataDeleteAllRequestDto){ - projectService.findById(metaDataDeleteAllRequestDto.getProjectId()); // 존재하는 프로젝트 id인지 확인. + throwGlobalExceptionWhenProjectNotExist((metaDataDeleteAllRequestDto.getProjectId())); List metaDataList = metaDataDeleteAllRequestDto.getMetadataIdList().stream() .map( metadataId -> metaDataRepository.findById(metadataId).orElseThrow(()-> new MetaDataNotFoundException(ErrorCode.METADATA_NOT_FOUND)))