diff --git a/src/main/java/com/muji_backend/kw_muji/mainpage/service/MainService.java b/src/main/java/com/muji_backend/kw_muji/mainpage/service/MainService.java index 46951610..42b81da4 100644 --- a/src/main/java/com/muji_backend/kw_muji/mainpage/service/MainService.java +++ b/src/main/java/com/muji_backend/kw_muji/mainpage/service/MainService.java @@ -15,6 +15,8 @@ import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; @Service @@ -28,43 +30,66 @@ public class MainService { public MainResponseDto getMainInfo(UserEntity userInfo, String yearMonth) { - // 공지사항 불러오기 및 매핑 (각 카테고리별 상위 6개씩) - MainResponseDto.Notices notices = new MainResponseDto.Notices( - mapToNoticeItems(noticeService.getKwHomeNotices(1, "", "").getNotices()), - mapToNoticeItems(noticeService.getKwHomeNotices(1, "", "0").getNotices()), - mapToNoticeItems(noticeService.getKwHomeNotices(1, "", "1").getNotices()), - mapToNoticeItems(noticeService.getKwHomeNotices(1, "", "2").getNotices()), - mapToNoticeItems(noticeService.getKwHomeNotices(1, "", "4").getNotices()) - ); + try { + // 공지사항 비동기 호출 + CompletableFuture> generalNotices = CompletableFuture.supplyAsync(() -> + mapToNoticeItems(noticeService.getKwHomeNotices(1, "", "").getNotices())); + CompletableFuture> category0Notices = CompletableFuture.supplyAsync(() -> + mapToNoticeItems(noticeService.getKwHomeNotices(1, "", "0").getNotices())); + CompletableFuture> category1Notices = CompletableFuture.supplyAsync(() -> + mapToNoticeItems(noticeService.getKwHomeNotices(1, "", "1").getNotices())); + CompletableFuture> category2Notices = CompletableFuture.supplyAsync(() -> + mapToNoticeItems(noticeService.getKwHomeNotices(1, "", "2").getNotices())); + CompletableFuture> category4Notices = CompletableFuture.supplyAsync(() -> + mapToNoticeItems(noticeService.getKwHomeNotices(1, "", "4").getNotices())); - // 설문조사 불러오기 (최대 4개) - List surveys = (surveyService.getSurveys("", 0) != null) - ? surveyService.getSurveys("", 0).getSurveys().stream() - .limit(4) - .collect(Collectors.toList()) - : List.of(); + // 모든 공지사항 작업 완료 대기 + CompletableFuture.allOf( + generalNotices, category0Notices, category1Notices, + category2Notices, category4Notices + ).join(); - // 캘린더 이벤트 불러오기 - 캘린더 이벤트는 로그인한 사용자만 조회 가능 - CalendarResponseDto.EventGroup events = null; - if (userInfo != null) { - CalendarResponseDto calendarResponseDto = calendarService.getCalendarEvents(userInfo, yearMonth); - events = (calendarResponseDto != null) ? calendarResponseDto.getEvents() : new CalendarResponseDto.EventGroup(); - } + // 공지사항 결과 병합 + MainResponseDto.Notices notices = new MainResponseDto.Notices( + generalNotices.get(), + category0Notices.get(), + category1Notices.get(), + category2Notices.get(), + category4Notices.get() + ); + + // 설문조사 불러오기 (최대 4개) + List surveys = (surveyService.getSurveys("", 0) != null) + ? surveyService.getSurveys("", 0).getSurveys().stream() + .limit(4) + .collect(Collectors.toList()) + : List.of(); + + // 캘린더 이벤트 불러오기 - 캘린더 이벤트는 로그인한 사용자만 조회 가능 + CalendarResponseDto.EventGroup events = null; + if (userInfo != null) { + CalendarResponseDto calendarResponseDto = calendarService.getCalendarEvents(userInfo, yearMonth); + events = (calendarResponseDto != null) ? calendarResponseDto.getEvents() : new CalendarResponseDto.EventGroup(); + } - // 팀플 모집 (최대 4개) - Map result = teamService.getOnGoingProjects(0, ""); - List projects = result.get("projects") != null - ? ((List) result.get("projects")).stream() - .limit(4) - .toList() - : List.of(); + // 팀플 모집 (최대 4개) + Map result = teamService.getOnGoingProjects(0, ""); + List projects = result.get("projects") != null + ? ((List) result.get("projects")).stream() + .limit(4) + .toList() + : List.of(); - return MainResponseDto.builder() - .notices(notices) - .surveys(surveys) - .events(events) - .projects(projects) - .build(); + return MainResponseDto.builder() + .notices(notices) + .surveys(surveys) + .events(events) + .projects(projects) + .build(); + + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException("공지사항 병렬 처리 중 오류 발생", e); + } } // == Private Methods == diff --git a/src/main/java/com/muji_backend/kw_muji/survey/controller/SurveyController.java b/src/main/java/com/muji_backend/kw_muji/survey/controller/SurveyController.java index 879d46f8..a2fdc2a1 100644 --- a/src/main/java/com/muji_backend/kw_muji/survey/controller/SurveyController.java +++ b/src/main/java/com/muji_backend/kw_muji/survey/controller/SurveyController.java @@ -28,7 +28,15 @@ public class SurveyController { public ResponseEntity getSurveyList(@RequestParam(value = "search", required = false) String search, @RequestParam(value = "page", defaultValue = "0") int page) { try { + // 시작 시간 측정 + long startTime = System.nanoTime(); SurveyResponseDto response = surveyService.getSurveys(search, page); + // 끝 시간 측정 + long endTime = System.nanoTime(); + + // 실행 시간 계산 (밀리초 단위로 변환) + double executionTime = (endTime - startTime) / 1_000_000_000.0;; + System.out.println(executionTime + " s"); return ResponseEntity.ok().body(Map.of("code", 200, "data", response)); } catch (IllegalArgumentException e) { return ResponseEntity.badRequest().body(Map.of("code", 400, "message", e.getMessage()));