From 802d1361534d1c2666540d1dcb41d28580cc546a Mon Sep 17 00:00:00 2001 From: hykim02 Date: Thu, 6 Mar 2025 01:05:49 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[Refactor]DishServiceV2-=EC=8B=9D=EB=8B=A8?= =?UTF-8?q?=20=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20getDietList=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20error=20=EB=B0=9C=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jinus/controller/v2/DishControllerV2.java | 45 +------- .../service/v2/cafeteria/DietServiceV2.java | 101 ++++++++++++++++-- 2 files changed, 95 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java b/src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java index eba0617..93b489f 100644 --- a/src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java @@ -2,57 +2,20 @@ import com.example.Jinus.dto.request.RequestDto; import com.example.Jinus.service.v2.cafeteria.DietServiceV2; -import com.example.Jinus.service.v2.userInfo.UserServiceV2; -import com.example.Jinus.utility.SimpleTextResponse; -import org.h2.engine.User; +import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.time.LocalTime; - @RestController @RequestMapping("/api/spring") +@RequiredArgsConstructor public class DishControllerV2 { private final DietServiceV2 dietServiceV2; - private final UserServiceV2 userServiceV2; - - public DishControllerV2(DietServiceV2 dietServiceV2, - UserServiceV2 userServiceV2) { - this.dietServiceV2 = dietServiceV2; - this.userServiceV2 = userServiceV2; - } @PostMapping("/dish/v2") - public void handleRequest(@RequestBody RequestDto requestDto) { - String kakaoId = requestDto.getUserRequest().getUser().getId(); - int campusId = userServiceV2.getUserCampusId(kakaoId); - - // 일반 파라미터 null값 여부 확인 - String sysCampusName = requestDto.getAction().getParams().getSys_campus_name(); - String sysDate = requestDto.getAction().getParams().getSys_date(); - String sysPeriod = requestDto.getAction().getParams().getSys_time_period(); - // 필수 파라미터 - String sysCafeteriaName = requestDto.getAction().getParams().getSys_cafeteria_name(); - - // 현재 시간 파악 - LocalTime time = dietServiceV2.getCurrentTime(); - // 일반 파라미터 값 채우기 - if (sysCampusName == null) { - sysCampusName = dietServiceV2.getCampusName(kakaoId); - } else if (sysDate == null) { - sysDate = dietServiceV2.getDay(time); - } else if (sysPeriod == null) { - sysPeriod = dietServiceV2.getPeriodOfDay(time); - } - - // sysDate로 날짜 계산하기 - String dateTime = dietServiceV2.getCurrentDateTime(sysDate); - String dietDescription = dietServiceV2.getDietDescription(sysCafeteriaName, campusId, sysPeriod, dateTime); - // 식당 imgUrl 찾기 - String imgUrl = dietServiceV2.getImageUrl(campusId); + public String handleRequest(@RequestBody RequestDto requestDto) { + return dietServiceV2.requestHandler(requestDto); } - - } diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java index 09e41b4..75819de 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java @@ -1,10 +1,15 @@ package com.example.Jinus.service.v2.cafeteria; +import com.example.Jinus.dto.request.RequestDto; +import com.example.Jinus.dto.response.*; import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; import com.example.Jinus.repository.v2.cafeteria.CampusRepositoryV2; import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; import com.example.Jinus.repository.v2.userInfo.UserRepositoryV2; +import com.example.Jinus.service.v2.userInfo.UserServiceV2; +import com.example.Jinus.utility.JsonUtils; import com.example.Jinus.utility.SimpleTextResponse; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -17,22 +22,98 @@ import java.util.stream.Collectors; @Service +@RequiredArgsConstructor public class DietServiceV2 { private final DietRepositoryV2 dietRepositoryV2; private final UserRepositoryV2 userRepositoryV2; private final CampusRepositoryV2 campusRepositoryV2; private final CafeteriaRepositoryV2 cafeteriaRepositoryV2; + private final UserServiceV2 userServiceV2; + + // request data 받아오기 + public String requestHandler(RequestDto requestDto) { + String kakaoId = requestDto.getUserRequest().getUser().getId(); + + // 현재 시간 파악 + LocalTime time = getCurrentTime(); + + // 요청 일반 파라미터 추출 (-> null이면 값 초기화하기) + String campusName = getOrDefault( + requestDto.getAction().getParams().getSys_campus_name(), getCampusName(kakaoId)); + String day = getOrDefault( + requestDto.getAction().getParams().getSys_date(), getDay(time)); // 오늘/내일 + String period = getOrDefault( + requestDto.getAction().getParams().getSys_time_period(), getPeriodOfDay(time)); // 아침/점심/저녁 + // 요청 필수 파라미터 추출 + String cafeteriaName = requestDto.getAction().getParams().getSys_cafeteria_name(); + + return makeParametersToFindDiet(kakaoId, day, cafeteriaName, period, campusName); + } + + // 식단 데이터 찾기 위해 필요한 파라미터들 초기화 + // 식당 id, 날짜, 식사 시간대(아침/점심/저녁) + private String makeParametersToFindDiet(String kakaoId, String day, String cafeteriaName, + String period, String campusName) { + int campusId = userServiceV2.getUserCampusId(kakaoId); + + // sysDay로 식단 날짜 설정하기 + String dietDate = getCurrentDateTime(day); + String dietDescription = getDietDescription(cafeteriaName, campusId, period, dietDate); + // 식당 imgUrl 찾기 + String imgUrl = getImageUrl(campusId); - public DietServiceV2(DietRepositoryV2 dietRepositoryV2, - UserRepositoryV2 userRepositoryV2, - CampusRepositoryV2 campusRepositoryV2, - CafeteriaRepositoryV2 cafeteriaRepositoryV2) { - this.dietRepositoryV2 = dietRepositoryV2; - this.userRepositoryV2 = userRepositoryV2; - this.campusRepositoryV2 = campusRepositoryV2; - this.cafeteriaRepositoryV2 = cafeteriaRepositoryV2; + String title = "\uD83C\uDF71 " + cafeteriaName + "(" + campusName.substring(0,2) + ") 메뉴"; + String description = dietDate + "\n\n" + dietDescription; + + return mappingResponse(cafeteriaName, campusName, imgUrl, period, day, title, description); } + // 응답 객체 매핑 + public String mappingResponse(String cafeteriaName, String campusName, String imgUrl, + String period, String day, String title, String description) { + // imgUrl 객체 생성 + ThumbnailDto thumbnail = new ThumbnailDto(imgUrl); + + // 버튼 리스트 객체 생성 + List buttonList = List.of(new ButtonDto("공유하기", "share")); + + // 아이템 객체 생성 + BasicCardDto basicCardDto = new BasicCardDto(title, description, thumbnail, buttonList); + List outputs = List.of(new ComponentDto(basicCardDto)); + + List quickReplies = mappingQuickReply(period, campusName, cafeteriaName, day); + + TemplateDto templateDto = new TemplateDto(outputs, quickReplies); + ResponseDto responseDto = new ResponseDto("2.0", templateDto); + + return JsonUtils.toJsonResponse(responseDto); + } + + // quickReply 객체 생성 + private List mappingQuickReply(String period, String campusName, String cafeteriaName, String day) { + return switch (period) { + case "아침" -> List.of( + new QuickReplyDto("점심", "message", campusName + " " + cafeteriaName + " " + day + " 점심 메뉴"), + new QuickReplyDto("저녁", "message", campusName + " " + cafeteriaName + " " + day + " 저녁 메뉴") + ); + case "점심" -> List.of( + new QuickReplyDto("아침", "message", campusName + " " + cafeteriaName + " " + day + " 아침 메뉴"), + new QuickReplyDto("저녁", "message", campusName + " " + cafeteriaName + " " + day + " 저녁 메뉴") + ); + default -> List.of( + new QuickReplyDto("아침", "message", campusName + " " + cafeteriaName + " " + day + " 아침 메뉴"), + new QuickReplyDto("점심", "message", campusName + " " + cafeteriaName + " " + day + " 점심 메뉴") + ); + }; + } + + + // Null 체크 후 기본값 설정 + private String getOrDefault(String defaultValue, String getValue) { + return (defaultValue != null) ? defaultValue : getValue; + } + + // cafeteria_id 존재여부 확인(캠퍼스에 식당이 존재하는지) public String getDietDescription(String cafeteriaName, int campusId, String period, String dateTime) { int cafeteriaId = cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); @@ -71,7 +152,7 @@ public StringBuilder processDietList(MultiValueMap dietList) { for (String key : keys) { description.append("[").append(key).append("]").append("\n"); - dietList.get(key).forEach(diet -> description.append(diet).append("\n")); + dietList.get(key).forEach(diet -> description.append(diet).append("\n\n")); } return description; } @@ -119,7 +200,7 @@ public LocalTime getCurrentTime() { return LocalTime.parse(timeSplit[0]); } - // sys_date 파라미터 값으로 조회할 날짜 찾는 함수 + // sysDay 파라미터 값으로 조회할 날짜 찾는 함수 public String getCurrentDateTime(String sysDate) { // 현재 날짜 LocalDate currentDate = LocalDateTime.now(ZoneId.of("Asia/Seoul")).toLocalDate(); From 80b0bd5ddefb5788b9993ca042ebc92c2fb2271a Mon Sep 17 00:00:00 2001 From: hykim02 Date: Thu, 6 Mar 2025 14:27:48 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[Refactor]DietServiceV2-=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=20=EB=B3=80=EC=88=98=EB=93=A4=20DTO=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jinus/dto/request/HandleRequestDto.java | 23 ++++++++ .../entity/cafeteria/CafeteriaDietEntity.java | 4 +- .../service/v2/cafeteria/DietServiceV2.java | 55 +++++++++++-------- 3 files changed, 56 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/example/Jinus/dto/request/HandleRequestDto.java diff --git a/src/main/java/com/example/Jinus/dto/request/HandleRequestDto.java b/src/main/java/com/example/Jinus/dto/request/HandleRequestDto.java new file mode 100644 index 0000000..aa4ad92 --- /dev/null +++ b/src/main/java/com/example/Jinus/dto/request/HandleRequestDto.java @@ -0,0 +1,23 @@ +package com.example.Jinus.dto.request; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class HandleRequestDto { + private final String kakaoId; + private final String campusName; + private final String day; + private final String period; + private final String cafeteriaName; + + public HandleRequestDto(String kakaoId, String campusName, String day, String period, String cafeteriaName) { + this.kakaoId = kakaoId; + this.campusName = campusName; + this.day = day; + this.period = period; + this.cafeteriaName = cafeteriaName; + } + +} diff --git a/src/main/java/com/example/Jinus/entity/cafeteria/CafeteriaDietEntity.java b/src/main/java/com/example/Jinus/entity/cafeteria/CafeteriaDietEntity.java index 9809b9a..c74e373 100644 --- a/src/main/java/com/example/Jinus/entity/cafeteria/CafeteriaDietEntity.java +++ b/src/main/java/com/example/Jinus/entity/cafeteria/CafeteriaDietEntity.java @@ -20,8 +20,8 @@ public class CafeteriaDietEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private int dietId; - @Column(name = "date", columnDefinition = "TIMESTAMP WITH TIME ZONE") - private LocalDateTime dateTime; // 날짜 + 시간 + 시간대 + @Column(name = "date") + private String dateTime; // 날짜 + 시간 + 시간대 // @Column(name = "date") // private LocalTime date; diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java index 75819de..f76dc8f 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java @@ -1,5 +1,6 @@ package com.example.Jinus.service.v2.cafeteria; +import com.example.Jinus.dto.request.HandleRequestDto; import com.example.Jinus.dto.request.RequestDto; import com.example.Jinus.dto.response.*; import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; @@ -18,8 +19,10 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; -import java.util.*; -import java.util.stream.Collectors; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; @Service @RequiredArgsConstructor @@ -47,30 +50,31 @@ public String requestHandler(RequestDto requestDto) { // 요청 필수 파라미터 추출 String cafeteriaName = requestDto.getAction().getParams().getSys_cafeteria_name(); - return makeParametersToFindDiet(kakaoId, day, cafeteriaName, period, campusName); + // 요청 파라미터 객체 생성 + HandleRequestDto parameters = new HandleRequestDto(kakaoId, campusName, day, period, cafeteriaName); + + return makeParametersToFindDiet(parameters); } // 식단 데이터 찾기 위해 필요한 파라미터들 초기화 // 식당 id, 날짜, 식사 시간대(아침/점심/저녁) - private String makeParametersToFindDiet(String kakaoId, String day, String cafeteriaName, - String period, String campusName) { - int campusId = userServiceV2.getUserCampusId(kakaoId); + private String makeParametersToFindDiet(HandleRequestDto parameters) { + int campusId = userServiceV2.getUserCampusId(parameters.getKakaoId()); // sysDay로 식단 날짜 설정하기 - String dietDate = getCurrentDateTime(day); - String dietDescription = getDietDescription(cafeteriaName, campusId, period, dietDate); + String dietDate = getCurrentDateTime(parameters.getDay()); + String dietDescription = getDietDescription(parameters, campusId, dietDate); // 식당 imgUrl 찾기 String imgUrl = getImageUrl(campusId); - String title = "\uD83C\uDF71 " + cafeteriaName + "(" + campusName.substring(0,2) + ") 메뉴"; + String title = "\uD83C\uDF71 " + parameters.getCafeteriaName() + "(" + parameters.getCampusName().substring(0,2) + ") 메뉴"; String description = dietDate + "\n\n" + dietDescription; - return mappingResponse(cafeteriaName, campusName, imgUrl, period, day, title, description); + return mappingResponse(parameters, imgUrl, title, description); } // 응답 객체 매핑 - public String mappingResponse(String cafeteriaName, String campusName, String imgUrl, - String period, String day, String title, String description) { + public String mappingResponse(HandleRequestDto parameters, String imgUrl, String title, String description) { // imgUrl 객체 생성 ThumbnailDto thumbnail = new ThumbnailDto(imgUrl); @@ -81,7 +85,7 @@ public String mappingResponse(String cafeteriaName, String campusName, String im BasicCardDto basicCardDto = new BasicCardDto(title, description, thumbnail, buttonList); List outputs = List.of(new ComponentDto(basicCardDto)); - List quickReplies = mappingQuickReply(period, campusName, cafeteriaName, day); + List quickReplies = mappingQuickReply(parameters); TemplateDto templateDto = new TemplateDto(outputs, quickReplies); ResponseDto responseDto = new ResponseDto("2.0", templateDto); @@ -90,19 +94,19 @@ public String mappingResponse(String cafeteriaName, String campusName, String im } // quickReply 객체 생성 - private List mappingQuickReply(String period, String campusName, String cafeteriaName, String day) { - return switch (period) { + private List mappingQuickReply(HandleRequestDto parameters) { + return switch (parameters.getPeriod()) { case "아침" -> List.of( - new QuickReplyDto("점심", "message", campusName + " " + cafeteriaName + " " + day + " 점심 메뉴"), - new QuickReplyDto("저녁", "message", campusName + " " + cafeteriaName + " " + day + " 저녁 메뉴") + new QuickReplyDto("점심", "message", parameters.getCampusName() + " " + parameters.getCafeteriaName() + " " + parameters.getDay() + " 점심 메뉴"), + new QuickReplyDto("저녁", "message", parameters.getCampusName() + " " + parameters.getCafeteriaName() + " " + parameters.getDay() + " 저녁 메뉴") ); case "점심" -> List.of( - new QuickReplyDto("아침", "message", campusName + " " + cafeteriaName + " " + day + " 아침 메뉴"), - new QuickReplyDto("저녁", "message", campusName + " " + cafeteriaName + " " + day + " 저녁 메뉴") + new QuickReplyDto("아침", "message", parameters.getCampusName() + " " + parameters.getCafeteriaName() + " " + parameters.getDay() + " 아침 메뉴"), + new QuickReplyDto("저녁", "message", parameters.getCampusName() + " " + parameters.getCafeteriaName() + " " + parameters.getDay() + " 저녁 메뉴") ); default -> List.of( - new QuickReplyDto("아침", "message", campusName + " " + cafeteriaName + " " + day + " 아침 메뉴"), - new QuickReplyDto("점심", "message", campusName + " " + cafeteriaName + " " + day + " 점심 메뉴") + new QuickReplyDto("아침", "message", parameters.getCampusName() + " " + parameters.getCafeteriaName() + " " + parameters.getDay() + " 아침 메뉴"), + new QuickReplyDto("점심", "message", parameters.getCampusName() + " " + parameters.getCafeteriaName() + " " + parameters.getDay() + " 점심 메뉴") ); }; } @@ -115,12 +119,12 @@ private String getOrDefault(String defaultValue, String getValue) { // cafeteria_id 존재여부 확인(캠퍼스에 식당이 존재하는지) - public String getDietDescription(String cafeteriaName, int campusId, String period, String dateTime) { - int cafeteriaId = cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); + public String getDietDescription(HandleRequestDto parameters, int campusId,String dateTime) { + int cafeteriaId = cafeteriaRepositoryV2.findCafeteriaId(parameters.getCafeteriaName(), campusId).orElse(-1); // 존재한다면 if (cafeteriaId != -1) { // 해당 식당 메뉴 찾아오기 - return getDietList(cafeteriaId, period, dateTime).toString(); + return getDietList(cafeteriaId, parameters.getPeriod(), dateTime).toString(); } else { // 존재하지 않는다면 // 오류메시지 반환 return SimpleTextResponse.simpleTextResponse("\"식당을 찾지 못했어!\\n어떤 캠퍼스에 있는 식당인지 정확히 알려줘!\""); @@ -130,9 +134,12 @@ public String getDietDescription(String cafeteriaName, int campusId, String peri // 해당 식당 메뉴 찾아오기 public StringBuilder getDietList(int cafeteriaId, String period, String dateTime) { List dietObject = dietRepositoryV2.findDietList(dateTime, period, cafeteriaId); + System.out.println("dietObject: " + dietObject); + System.out.println("dietObject.size: " + dietObject.size()); MultiValueMap dietList = new LinkedMultiValueMap<>(); // 중복 키 허용(값을 리스트로 반환) for (Object[] o : dietObject) { + System.out.println("o: "+ Arrays.toString(o)); String dishName = (String) o[2]; String key = (o[0] != null) ? (String)o[0] // dishCategory From ce0c549aea361179fef0973280e184f2334833e0 Mon Sep 17 00:00:00 2001 From: hykim02 Date: Thu, 6 Mar 2025 19:51:04 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[Refactor]=EC=8B=9D=EB=8B=A8=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jinus/controller/v2/DishControllerV2.java | 5 + .../entity/cafeteria/CafeteriaDietEntity.java | 7 +- .../v2/cafeteria/CafeteriaRepositoryV2.java | 4 - .../v2/cafeteria/CampusRepositoryV2.java | 8 ++ .../v2/cafeteria/DietRepositoryV2.java | 7 +- .../v2/cafeteria/CafeteriaServiceV2.java | 5 + .../service/v2/cafeteria/CampusServiceV2.java | 10 ++ .../service/v2/cafeteria/DietServiceV2.java | 109 ++++++++++-------- 8 files changed, 91 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java b/src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java index 93b489f..09b3a95 100644 --- a/src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java @@ -18,4 +18,9 @@ public class DishControllerV2 { public String handleRequest(@RequestBody RequestDto requestDto) { return dietServiceV2.requestHandler(requestDto); } + +// @PostMapping("/dish/v2") +// public void handleRequest(@RequestBody String request) { +// System.out.println(request); +// } } diff --git a/src/main/java/com/example/Jinus/entity/cafeteria/CafeteriaDietEntity.java b/src/main/java/com/example/Jinus/entity/cafeteria/CafeteriaDietEntity.java index c74e373..ae8c42b 100644 --- a/src/main/java/com/example/Jinus/entity/cafeteria/CafeteriaDietEntity.java +++ b/src/main/java/com/example/Jinus/entity/cafeteria/CafeteriaDietEntity.java @@ -6,7 +6,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; -import java.time.LocalDateTime; +import java.sql.Date; @Entity @Getter @@ -21,10 +21,7 @@ public class CafeteriaDietEntity { private int dietId; @Column(name = "date") - private String dateTime; // 날짜 + 시간 + 시간대 - -// @Column(name = "date") -// private LocalTime date; + private Date dietDate; @Column(name = "day") private String day_of_week; diff --git a/src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java b/src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java index 467eda2..3dbdd2c 100644 --- a/src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java @@ -19,8 +19,4 @@ public interface CafeteriaRepositoryV2 extends JpaRepository findCafeteriaId(@Param("cafeteriaName") String cafeteriaName, @Param("campusId") int campusId); - - // 식당 url 찾기 - @Query("SELECT c.thumbnailUrl FROM CafeteriaEntity c WHERE c.campusId = :campusId") - String findCafeteriaUrlByCampusId(@Param("campusId")int campusId); } diff --git a/src/main/java/com/example/Jinus/repository/v2/cafeteria/CampusRepositoryV2.java b/src/main/java/com/example/Jinus/repository/v2/cafeteria/CampusRepositoryV2.java index 7aba879..4565376 100644 --- a/src/main/java/com/example/Jinus/repository/v2/cafeteria/CampusRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/v2/cafeteria/CampusRepositoryV2.java @@ -17,4 +17,12 @@ public interface CampusRepositoryV2 extends JpaRepository // campusId가 5보다 작은 캠퍼스들 찾기 @Query("SELECT c FROM CampusEntity c WHERE c.id < 5") List findCampusList(); + + // campusName으로 imgUrl 찾기 + @Query("SELECT c.thumbnailUrl FROM CampusEntity c WHERE c.campusNameKo = :campusName") + String findCampusImgUrlByCampusName(@Param("campusName")String campusName); + + // campusName으로 id 찾기 + @Query("SELECT c.id FROM CampusEntity c WHERE c.campusNameKo = :campusName") + int findCampusIdByName(@Param("campusName")String campusName); } diff --git a/src/main/java/com/example/Jinus/repository/v2/cafeteria/DietRepositoryV2.java b/src/main/java/com/example/Jinus/repository/v2/cafeteria/DietRepositoryV2.java index 683a592..42dd8e9 100644 --- a/src/main/java/com/example/Jinus/repository/v2/cafeteria/DietRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/v2/cafeteria/DietRepositoryV2.java @@ -6,16 +6,15 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.time.LocalDateTime; -import java.time.OffsetDateTime; +import java.sql.Date; import java.util.List; @Repository public interface DietRepositoryV2 extends JpaRepository { @Query("SELECT c.dishCategory, c.dishType, c.dishName FROM CafeteriaDietEntity c " + - "WHERE c.dateTime = :dateTime " + + "WHERE c.dietDate = :dietDate " + "AND c.time = :period AND c.cafeteriaId = :cafeteriaId") - List findDietList(@Param("dateTime") String dateTime, + List findDietList(@Param("dietDate") Date dietDate, @Param("period") String period, @Param("cafeteriaId") int cafeteriaId); } diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java index 640e478..9ba9ba7 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java @@ -31,6 +31,11 @@ public List getCafeteriaList(int campusId) { return cafeteriaRepositoryV2.findCafeteriaListByCampusId(campusId); } + // 캠퍼스에 식당이 존재한다면 cafeteriaId 찾기 + public int getCafeteriaId(String cafeteriaName, int campusId) { + return cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); + } + // 식당 리스트 반환 메소드 public String makeCafeteriaListCard(int campusId) { String campusName = campusServiceV2.getUserCampusName(campusId); diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java index 748627a..86a6460 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java @@ -33,6 +33,16 @@ public List getCampusList() { return campusRepositoryV2.findCampusList(); } + // 캠퍼스 이름으로 url 찾기 + public String getCampusImgUrl(String campusName) { + return campusRepositoryV2.findCampusImgUrlByCampusName(campusName); + } + + // 캠퍼스 이름으로 id 찾기 + public int getCampusId(String campusName) { + return campusRepositoryV2.findCampusIdByName(campusName); + } + // 캠퍼스 리스트 반환 메소드 public String makeCampusListCard() { List campusList = getCampusList(); diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java index f76dc8f..d2d3fcc 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java @@ -1,5 +1,6 @@ package com.example.Jinus.service.v2.cafeteria; +import com.example.Jinus.dto.request.DetailParamsItemFieldDto; import com.example.Jinus.dto.request.HandleRequestDto; import com.example.Jinus.dto.request.RequestDto; import com.example.Jinus.dto.response.*; @@ -7,7 +8,6 @@ import com.example.Jinus.repository.v2.cafeteria.CampusRepositoryV2; import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; import com.example.Jinus.repository.v2.userInfo.UserRepositoryV2; -import com.example.Jinus.service.v2.userInfo.UserServiceV2; import com.example.Jinus.utility.JsonUtils; import com.example.Jinus.utility.SimpleTextResponse; import lombok.RequiredArgsConstructor; @@ -15,11 +15,11 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import java.sql.Date; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; -import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -30,8 +30,8 @@ public class DietServiceV2 { private final DietRepositoryV2 dietRepositoryV2; private final UserRepositoryV2 userRepositoryV2; private final CampusRepositoryV2 campusRepositoryV2; - private final CafeteriaRepositoryV2 cafeteriaRepositoryV2; - private final UserServiceV2 userServiceV2; + private final CampusServiceV2 campusServiceV2; + private final CafeteriaServiceV2 cafeteriaServiceV2; // request data 받아오기 public String requestHandler(RequestDto requestDto) { @@ -40,37 +40,56 @@ public String requestHandler(RequestDto requestDto) { // 현재 시간 파악 LocalTime time = getCurrentTime(); - // 요청 일반 파라미터 추출 (-> null이면 값 초기화하기) - String campusName = getOrDefault( - requestDto.getAction().getParams().getSys_campus_name(), getCampusName(kakaoId)); - String day = getOrDefault( - requestDto.getAction().getParams().getSys_date(), getDay(time)); // 오늘/내일 - String period = getOrDefault( - requestDto.getAction().getParams().getSys_time_period(), getPeriodOfDay(time)); // 아침/점심/저녁 + // 요청 일반 파라미터 추출 + DetailParamsItemFieldDto campusName = requestDto.getAction().getDetailParams().getSys_campus_name(); + DetailParamsItemFieldDto day = requestDto.getAction().getDetailParams().getSys_date(); + DetailParamsItemFieldDto period = requestDto.getAction().getDetailParams().getSys_time_period(); + // null이면 값 초기화하기 + String campusNameValue = (campusName != null) ? campusName.getOrigin() : getCampusName(kakaoId); + String dayValue = (day != null) ? day.getOrigin() : getDay(time); // 오늘, 내일 + // 아침, 점심, 저녁 + String periodValue = (period != null) ? period.getOrigin() : getPeriodOfDay(time); + // 요청 필수 파라미터 추출 String cafeteriaName = requestDto.getAction().getParams().getSys_cafeteria_name(); + System.out.println("sysCampusName:" + requestDto.getAction().getDetailParams().getSys_campus_name()); + System.out.println("sysDate:" + requestDto.getAction().getDetailParams().getSys_date()); + System.out.println("sysTimePeriod:" + requestDto.getAction().getDetailParams().getSys_time_period()); + + System.out.println("campusName: " + campusNameValue); + System.out.println("day: " + dayValue); + System.out.println("period: " + periodValue); + System.out.println("cafeteriaName: " + cafeteriaName); + // 요청 파라미터 객체 생성 - HandleRequestDto parameters = new HandleRequestDto(kakaoId, campusName, day, period, cafeteriaName); + HandleRequestDto parameters = new HandleRequestDto(kakaoId, campusNameValue, dayValue, periodValue, cafeteriaName); - return makeParametersToFindDiet(parameters); + return makeContentsToFindDiet(parameters); } + // 식단 데이터 찾기 위해 필요한 파라미터들 초기화 // 식당 id, 날짜, 식사 시간대(아침/점심/저녁) - private String makeParametersToFindDiet(HandleRequestDto parameters) { - int campusId = userServiceV2.getUserCampusId(parameters.getKakaoId()); + private String makeContentsToFindDiet(HandleRequestDto parameters) { + int campusId = campusServiceV2.getCampusId(parameters.getCampusName()); // sysDay로 식단 날짜 설정하기 - String dietDate = getCurrentDateTime(parameters.getDay()); + Date dietDate = getCurrentDate(parameters.getDay()); String dietDescription = getDietDescription(parameters, campusId, dietDate); // 식당 imgUrl 찾기 - String imgUrl = getImageUrl(campusId); + String imgUrl = campusServiceV2.getCampusImgUrl(parameters.getCampusName()); - String title = "\uD83C\uDF71 " + parameters.getCafeteriaName() + "(" + parameters.getCampusName().substring(0,2) + ") 메뉴"; - String description = dietDate + "\n\n" + dietDescription; + // title 데이터 연결 + StringBuilder title = new StringBuilder("\uD83C\uDF71 ") + .append(parameters.getCafeteriaName()).append("(") + .append(parameters.getCampusName(), 0, 2).append(") 메뉴"); - return mappingResponse(parameters, imgUrl, title, description); + // 메뉴 연결 + StringBuilder description = new StringBuilder(String.valueOf(dietDate)) + .append(" ").append(parameters.getPeriod()).append(dietDescription); + + return mappingResponse(parameters, imgUrl, title.toString(), description.toString()); } // 응답 객체 매핑 @@ -111,20 +130,13 @@ private List mappingQuickReply(HandleRequestDto parameters) { }; } - - // Null 체크 후 기본값 설정 - private String getOrDefault(String defaultValue, String getValue) { - return (defaultValue != null) ? defaultValue : getValue; - } - - // cafeteria_id 존재여부 확인(캠퍼스에 식당이 존재하는지) - public String getDietDescription(HandleRequestDto parameters, int campusId,String dateTime) { - int cafeteriaId = cafeteriaRepositoryV2.findCafeteriaId(parameters.getCafeteriaName(), campusId).orElse(-1); + public String getDietDescription(HandleRequestDto parameters, int campusId,Date dietDate) { + int cafeteriaId = cafeteriaServiceV2.getCafeteriaId(parameters.getCafeteriaName(), campusId); // 존재한다면 if (cafeteriaId != -1) { // 해당 식당 메뉴 찾아오기 - return getDietList(cafeteriaId, parameters.getPeriod(), dateTime).toString(); + return getDietList(cafeteriaId, parameters.getPeriod(), dietDate).toString(); } else { // 존재하지 않는다면 // 오류메시지 반환 return SimpleTextResponse.simpleTextResponse("\"식당을 찾지 못했어!\\n어떤 캠퍼스에 있는 식당인지 정확히 알려줘!\""); @@ -132,14 +144,11 @@ public String getDietDescription(HandleRequestDto parameters, int campusId,Strin } // 해당 식당 메뉴 찾아오기 - public StringBuilder getDietList(int cafeteriaId, String period, String dateTime) { - List dietObject = dietRepositoryV2.findDietList(dateTime, period, cafeteriaId); - System.out.println("dietObject: " + dietObject); - System.out.println("dietObject.size: " + dietObject.size()); + public StringBuilder getDietList(int cafeteriaId, String period, Date dietDate) { + List dietObject = dietRepositoryV2.findDietList(dietDate, period, cafeteriaId); MultiValueMap dietList = new LinkedMultiValueMap<>(); // 중복 키 허용(값을 리스트로 반환) for (Object[] o : dietObject) { - System.out.println("o: "+ Arrays.toString(o)); String dishName = (String) o[2]; String key = (o[0] != null) ? (String)o[0] // dishCategory @@ -158,8 +167,8 @@ public StringBuilder processDietList(MultiValueMap dietList) { StringBuilder description = new StringBuilder(); for (String key : keys) { - description.append("[").append(key).append("]").append("\n"); - dietList.get(key).forEach(diet -> description.append(diet).append("\n\n")); + description.append("\n[").append(key).append("]").append("\n"); + dietList.get(key).forEach(diet -> description.append(diet).append("\n")); } return description; } @@ -168,6 +177,7 @@ public StringBuilder processDietList(MultiValueMap dietList) { // 일반 파라미터 값 채우기 // sys_campus_name 파라미터 초기화 public String getCampusName(String kakaoId) { + System.out.println("getCampusName 실행"); // 학과 등록 여부 확인 int campusId = userRepositoryV2.findCampusIdById(kakaoId).orElse(-1); // 학과 등록한 경우 campusId가 존재함 @@ -180,6 +190,7 @@ public String getCampusName(String kakaoId) { // sys_date 파라미터 초기화 - 시간 범위에 따라 오늘, 내일 판별 public String getDay(LocalTime time) { + System.out.println("getDay 실행"); if (time.isAfter(LocalTime.parse("00:00:00")) && time.isBefore(LocalTime.parse("19:00:00"))) { return "오늘"; } else { @@ -188,10 +199,12 @@ public String getDay(LocalTime time) { } // sys_period 파라미터 초기화 - 시간 범위에 따라 아침, 점심, 저녁을 판별 - public String getPeriodOfDay(LocalTime time) { - if (time.isAfter(LocalTime.parse("19:00:00")) && time.isBefore(LocalTime.parse("09:30:00"))) { + public static String getPeriodOfDay(LocalTime time) { + System.out.println("getPeriodOfDay 실행"); + + if (time.isAfter(LocalTime.parse("19:00:00")) || time.isBefore(LocalTime.parse("09:30:00"))) { return "아침"; - } else if (time.isAfter(LocalTime.parse("09:30:00")) && time.isBefore(LocalTime.parse("13:30:00"))) { + } else if (!time.isBefore(LocalTime.parse("09:30:00")) && time.isBefore(LocalTime.parse("13:30:00"))) { return "점심"; } else { return "저녁"; @@ -208,21 +221,15 @@ public LocalTime getCurrentTime() { } // sysDay 파라미터 값으로 조회할 날짜 찾는 함수 - public String getCurrentDateTime(String sysDate) { + public Date getCurrentDate(String sysDate) { // 현재 날짜 - LocalDate currentDate = LocalDateTime.now(ZoneId.of("Asia/Seoul")).toLocalDate(); + LocalDate today = LocalDate.now(); + LocalDate tomorrow = today.plusDays(1); // 하루 뒤 날짜 계산 if (sysDate.equals("오늘")) { - return currentDate.toString(); + return Date.valueOf(today); } else { // 내일 - LocalDate tomorrowDate = currentDate.plusDays(1); - return tomorrowDate.toString(); + return Date.valueOf(tomorrow); } } - - // 식당 imgUrl 찾기 - public String getImageUrl(int campusId) { - return cafeteriaRepositoryV2.findCafeteriaUrlByCampusId(campusId); - } - } From 923423417e78fff75d9bdd318f1c511e5e29235e Mon Sep 17 00:00:00 2001 From: hykim02 Date: Fri, 7 Mar 2025 00:04:44 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[Refactor]DietControllerV2=20=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ontrollerV2.java => DietControllerV2.java} | 2 +- .../v2/cafeteria/CafeteriaRepositoryV2.java | 4 + .../v2/cafeteria/CafeteriaServiceV2.java | 5 + .../service/v2/cafeteria/DietServiceV2.java | 212 ++++++++++++------ 4 files changed, 154 insertions(+), 69 deletions(-) rename src/main/java/com/example/Jinus/controller/v2/{DishControllerV2.java => DietControllerV2.java} (96%) diff --git a/src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java b/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java similarity index 96% rename from src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java rename to src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java index 09b3a95..8a22d32 100644 --- a/src/main/java/com/example/Jinus/controller/v2/DishControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java @@ -11,7 +11,7 @@ @RestController @RequestMapping("/api/spring") @RequiredArgsConstructor -public class DishControllerV2 { +public class DietControllerV2 { private final DietServiceV2 dietServiceV2; @PostMapping("/dish/v2") diff --git a/src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java b/src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java index 3dbdd2c..390fbbd 100644 --- a/src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java @@ -19,4 +19,8 @@ public interface CafeteriaRepositoryV2 extends JpaRepository findCafeteriaId(@Param("cafeteriaName") String cafeteriaName, @Param("campusId") int campusId); + + // cafeteriaId로 imgUrl 찾기 + @Query("SELECT c.thumbnailUrl FROM CafeteriaEntity c WHERE c.id = :cafeteriaId") + String findImgUrlByCafeteriaId(@Param("cafeteriaId")int cafeteriaId); } diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java index 9ba9ba7..0341672 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java @@ -36,6 +36,11 @@ public int getCafeteriaId(String cafeteriaName, int campusId) { return cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); } + // 식당 imgUrl 찾기 + public String getImgUrl(int cafeteriaId) { + return cafeteriaRepositoryV2.findImgUrlByCafeteriaId(cafeteriaId); + } + // 식당 리스트 반환 메소드 public String makeCafeteriaListCard(int campusId) { String campusName = campusServiceV2.getUserCampusName(campusId); diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java index d2d3fcc..7a5b4da 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java @@ -4,7 +4,6 @@ import com.example.Jinus.dto.request.HandleRequestDto; import com.example.Jinus.dto.request.RequestDto; import com.example.Jinus.dto.response.*; -import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; import com.example.Jinus.repository.v2.cafeteria.CampusRepositoryV2; import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; import com.example.Jinus.repository.v2.userInfo.UserRepositoryV2; @@ -14,6 +13,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import org.springframework.web.servlet.View; import java.sql.Date; import java.time.LocalDate; @@ -32,8 +32,9 @@ public class DietServiceV2 { private final CampusRepositoryV2 campusRepositoryV2; private final CampusServiceV2 campusServiceV2; private final CafeteriaServiceV2 cafeteriaServiceV2; + private final View error; - // request data 받아오기 + // 식단 데이터 찾기 위해 필요한 파라미터 추출 및 초기화 public String requestHandler(RequestDto requestDto) { String kakaoId = requestDto.getUserRequest().getUser().getId(); @@ -45,49 +46,110 @@ public String requestHandler(RequestDto requestDto) { DetailParamsItemFieldDto day = requestDto.getAction().getDetailParams().getSys_date(); DetailParamsItemFieldDto period = requestDto.getAction().getDetailParams().getSys_time_period(); // null이면 값 초기화하기 - String campusNameValue = (campusName != null) ? campusName.getOrigin() : getCampusName(kakaoId); - String dayValue = (day != null) ? day.getOrigin() : getDay(time); // 오늘, 내일 - // 아침, 점심, 저녁 - String periodValue = (period != null) ? period.getOrigin() : getPeriodOfDay(time); - + String campusNameValue = (campusName != null) ? campusName.getValue() : getCampusName(kakaoId); + String dayValue = (day != null) ? day.getValue() : getDay(time); // 오늘, 내일 + String periodValue = (period != null) ? period.getValue() : getPeriodOfDay(time); // 아침, 점심, 저녁 // 요청 필수 파라미터 추출 String cafeteriaName = requestDto.getAction().getParams().getSys_cafeteria_name(); - System.out.println("sysCampusName:" + requestDto.getAction().getDetailParams().getSys_campus_name()); - System.out.println("sysDate:" + requestDto.getAction().getDetailParams().getSys_date()); - System.out.println("sysTimePeriod:" + requestDto.getAction().getDetailParams().getSys_time_period()); - - System.out.println("campusName: " + campusNameValue); - System.out.println("day: " + dayValue); - System.out.println("period: " + periodValue); - System.out.println("cafeteriaName: " + cafeteriaName); - // 요청 파라미터 객체 생성 HandleRequestDto parameters = new HandleRequestDto(kakaoId, campusNameValue, dayValue, periodValue, cafeteriaName); - return makeContentsToFindDiet(parameters); + return makeResponse(parameters); } + // response 생성 로직 + public String makeResponse(HandleRequestDto parameters) { + int campusId = campusServiceV2.getCampusId(parameters.getCampusName()); + int cafeteriaId = cafeteriaServiceV2.getCafeteriaId(parameters.getCafeteriaName(), campusId); + // 캠퍼스에 식당이 존재하는 경우 + if (checkIsThereCafeteria(parameters) != -1) { + // 식당 메뉴가 존재하는 경우 + if (checkThereIsDiet(parameters, cafeteriaId) != -1) { + // 메뉴 찾기 + MultiValueMap dietList = getDiets(parameters, cafeteriaId); + StringBuilder diets = processDietList(dietList); + return makeContents(parameters, cafeteriaId, diets); + } else { // 메뉴 존재하지 않는 경우 + StringBuilder diets = new StringBuilder("\n\n").append("메뉴가 존재하지 않습니다."); + return makeContents(parameters, cafeteriaId, diets); + } + } else { // 식당 존재하지 않는 경우 + return errorMsgThereIsNoCafeteria(); + } + } - // 식단 데이터 찾기 위해 필요한 파라미터들 초기화 - // 식당 id, 날짜, 식사 시간대(아침/점심/저녁) - private String makeContentsToFindDiet(HandleRequestDto parameters) { + // 캠퍼스에 식당 존재여부 확인 -> cafeteriaId 찾기 + // cafeteriaId가 -1이면 존재하지 않음 + private int checkIsThereCafeteria(HandleRequestDto parameters) { int campusId = campusServiceV2.getCampusId(parameters.getCampusName()); + return cafeteriaServiceV2.getCafeteriaId(parameters.getCafeteriaName(), campusId); + } + + // 캠퍼스에 식당이 존재하지 않는 경우 메시지 출력 + private String errorMsgThereIsNoCafeteria() { + return SimpleTextResponse + .simpleTextResponse("식당을 찾지 못했어!\n어떤 캠퍼스에 있는 식당인지 정확히 알려줘!"); + } - // sysDay로 식단 날짜 설정하기 + // 식당 메뉴 존재여부 확인 + private int checkThereIsDiet(HandleRequestDto parameters, int cafeteriaId) { + // 오늘, 내일 문자열로 날짜 설정하기 Date dietDate = getCurrentDate(parameters.getDay()); - String dietDescription = getDietDescription(parameters, campusId, dietDate); - // 식당 imgUrl 찾기 - String imgUrl = campusServiceV2.getCampusImgUrl(parameters.getCampusName()); + List dietObject = + dietRepositoryV2.findDietList(dietDate, parameters.getPeriod(), cafeteriaId); + return (!dietObject.isEmpty()) ? 1 : -1; + } + + // 카테고리별 메뉴 리스트 생성하기 + private MultiValueMap getDiets(HandleRequestDto parameters, int cafeteriaId) { + // 오늘, 내일 문자열로 날짜 설정하기 + Date dietDate = getCurrentDate(parameters.getDay()); + List dietObject = + dietRepositoryV2.findDietList(dietDate, parameters.getPeriod(), cafeteriaId); + MultiValueMap dietList = new LinkedMultiValueMap<>(); // 중복 키 허용(값을 리스트로 반환) + + for (Object[] o : dietObject) { + String key = (o[0] != null) ? (String)o[0] // dishCategory + : (o[1] != null) ? (String) o[1] // dishType + : "메뉴"; + + String dishName = (String) o[2]; + dietList.add(key, dishName); + } + return dietList; + } + + // 카테고리별 메뉴 문자열로 나열하기 + public StringBuilder processDietList(MultiValueMap dietList) { + // 키 추출 + Set keys = new TreeSet<>(dietList.keySet()); // 순서 보장 - 오름차순 + StringBuilder description = new StringBuilder(); + + for (String key : keys) { + description.append("\n[").append(key).append("]").append("\n"); + dietList.get(key).forEach(diet -> description.append(diet).append("\n")); + } + return description; + } + + + // 응답 내용 초기화 + private String makeContents(HandleRequestDto parameters, int cafeteriaId, StringBuilder diets) { + // 식당 img 찾기 + String imgUrl = cafeteriaServiceV2.getImgUrl(cafeteriaId); // title 데이터 연결 StringBuilder title = new StringBuilder("\uD83C\uDF71 ") .append(parameters.getCafeteriaName()).append("(") .append(parameters.getCampusName(), 0, 2).append(") 메뉴"); + // 식단 날짜 + Date dietDate = getCurrentDate(parameters.getDay()); // 메뉴 연결 - StringBuilder description = new StringBuilder(String.valueOf(dietDate)) - .append(" ").append(parameters.getPeriod()).append(dietDescription); + StringBuilder description = new StringBuilder(String.valueOf(dietDate)).append(" ") + .append(parameters.getPeriod()).append(diets); + System.out.println("description: " +description); return mappingResponse(parameters, imgUrl, title.toString(), description.toString()); } @@ -112,6 +174,40 @@ public String mappingResponse(HandleRequestDto parameters, String imgUrl, String return JsonUtils.toJsonResponse(responseDto); } + + + + +// private String makeContentsToFindDiet(HandleRequestDto parameters) { +// int campusId = campusServiceV2.getCampusId(parameters.getCampusName()); +// +// // sysDay로 식단 날짜 설정하기 +// Date dietDate = getCurrentDate(parameters.getDay()); +// String dietDescription = getDietDescription(parameters, campusId, dietDate); +// // 식당 imgUrl 찾기 +// String imgUrl = campusServiceV2.getCampusImgUrl(parameters.getCampusName()); +// +// // title 데이터 연결 +// StringBuilder title = new StringBuilder("\uD83C\uDF71 ") +// .append(parameters.getCafeteriaName()).append("(") +// .append(parameters.getCampusName(), 0, 2).append(") 메뉴"); +// +// // 메뉴 연결 +// StringBuilder description = new StringBuilder(); +// +// if (!dietDescription.equals("none")) { +// // 메뉴 연결 +// description.append(dietDate) +// .append(" ").append(parameters.getPeriod()).append(dietDescription); +// +// return mappingResponse(parameters, imgUrl, title.toString(), description.toString()); +// } else { +// return SimpleTextResponse.simpleTextResponse("식당을 찾지 못했어!\n어떤 캠퍼스에 있는 식당인지 정확히 알려줘!"); +// } +// } + + + // quickReply 객체 생성 private List mappingQuickReply(HandleRequestDto parameters) { return switch (parameters.getPeriod()) { @@ -130,54 +226,37 @@ private List mappingQuickReply(HandleRequestDto parameters) { }; } - // cafeteria_id 존재여부 확인(캠퍼스에 식당이 존재하는지) - public String getDietDescription(HandleRequestDto parameters, int campusId,Date dietDate) { - int cafeteriaId = cafeteriaServiceV2.getCafeteriaId(parameters.getCafeteriaName(), campusId); - // 존재한다면 - if (cafeteriaId != -1) { - // 해당 식당 메뉴 찾아오기 - return getDietList(cafeteriaId, parameters.getPeriod(), dietDate).toString(); - } else { // 존재하지 않는다면 - // 오류메시지 반환 - return SimpleTextResponse.simpleTextResponse("\"식당을 찾지 못했어!\\n어떤 캠퍼스에 있는 식당인지 정확히 알려줘!\""); - } - } +// // cafeteria_id 존재여부 확인(캠퍼스에 식당이 존재하는지) +// public String getDietDescription(HandleRequestDto parameters, int campusId,Date dietDate) { +// int cafeteriaId = cafeteriaServiceV2.getCafeteriaId(parameters.getCafeteriaName(), campusId); +// String diets = getDietList(cafeteriaId, parameters.getPeriod(), dietDate).toString(); +// return (cafeteriaId != -1) ? diets : "none"; +// } // 해당 식당 메뉴 찾아오기 - public StringBuilder getDietList(int cafeteriaId, String period, Date dietDate) { - List dietObject = dietRepositoryV2.findDietList(dietDate, period, cafeteriaId); - MultiValueMap dietList = new LinkedMultiValueMap<>(); // 중복 키 허용(값을 리스트로 반환) - - for (Object[] o : dietObject) { - String dishName = (String) o[2]; - - String key = (o[0] != null) ? (String)o[0] // dishCategory - : (o[1] != null) ? (String) o[1] // dishType - : "메뉴"; +// public StringBuilder getDietList(int cafeteriaId, String period, Date dietDate) { +// List dietObject = dietRepositoryV2.findDietList(dietDate, period, cafeteriaId); +// +// MultiValueMap dietList = new LinkedMultiValueMap<>(); // 중복 키 허용(값을 리스트로 반환) +// +// for (Object[] o : dietObject) { +// String dishName = (String) o[2]; +// +// String key = (o[0] != null) ? (String)o[0] // dishCategory +// : (o[1] != null) ? (String) o[1] // dishType +// : "메뉴"; +// +// dietList.add(key, dishName); +// } +// return processDietList(dietList); +// } - dietList.add(key, dishName); - } - return processDietList(dietList); - } - - // 식당 리스트 가공 - public StringBuilder processDietList(MultiValueMap dietList) { - // 키 추출 - Set keys = new TreeSet<>(dietList.keySet()); // 순서 보장 - 오름차순 - StringBuilder description = new StringBuilder(); - for (String key : keys) { - description.append("\n[").append(key).append("]").append("\n"); - dietList.get(key).forEach(diet -> description.append(diet).append("\n")); - } - return description; - } // 일반 파라미터 값 채우기 // sys_campus_name 파라미터 초기화 public String getCampusName(String kakaoId) { - System.out.println("getCampusName 실행"); // 학과 등록 여부 확인 int campusId = userRepositoryV2.findCampusIdById(kakaoId).orElse(-1); // 학과 등록한 경우 campusId가 존재함 @@ -190,7 +269,6 @@ public String getCampusName(String kakaoId) { // sys_date 파라미터 초기화 - 시간 범위에 따라 오늘, 내일 판별 public String getDay(LocalTime time) { - System.out.println("getDay 실행"); if (time.isAfter(LocalTime.parse("00:00:00")) && time.isBefore(LocalTime.parse("19:00:00"))) { return "오늘"; } else { @@ -200,8 +278,6 @@ public String getDay(LocalTime time) { // sys_period 파라미터 초기화 - 시간 범위에 따라 아침, 점심, 저녁을 판별 public static String getPeriodOfDay(LocalTime time) { - System.out.println("getPeriodOfDay 실행"); - if (time.isAfter(LocalTime.parse("19:00:00")) || time.isBefore(LocalTime.parse("09:30:00"))) { return "아침"; } else if (!time.isBefore(LocalTime.parse("09:30:00")) && time.isBefore(LocalTime.parse("13:30:00"))) { From ed3784ceaf90378965352516cc0705b928524038 Mon Sep 17 00:00:00 2001 From: hykim02 Date: Fri, 7 Mar 2025 01:10:28 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[Refactor]=EC=BA=A0=ED=8D=BC=EC=8A=A4,=20?= =?UTF-8?q?=EC=8B=9D=EB=8B=A8,=20=EA=B3=B5=EC=A7=80=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/v2/CafeteriaControllerV2.java | 28 ++++++-- .../Jinus/controller/v2/DietControllerV2.java | 9 +-- .../controller/v2/NoticeControllerV2.java | 6 +- .../service/v2/cafeteria/CampusServiceV2.java | 6 +- .../service/v2/cafeteria/DietServiceV2.java | 66 ++----------------- 5 files changed, 33 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java b/src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java index 17d704e..934c374 100644 --- a/src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java @@ -19,7 +19,7 @@ import java.util.Map; @RestController -@RequestMapping("/api/spring") +@RequestMapping("/api/v2/spring") public class CafeteriaControllerV2 { private final UserServiceV2 userServiceV2; @@ -37,18 +37,34 @@ public CafeteriaControllerV2( // 사용자 존재 여부에 따라 응답 - @PostMapping("/cafeteria/v2") + @PostMapping("/cafeteria") public String responseCafeteriaOrCampusListCard(@RequestBody RequestDto requestDto) { // userId로 campusId 찾기 String userId = requestDto.getUserRequest().getUser().getId(); int campusId = userServiceV2.getUserCampusId(userId); int sysCampusId = requestDto.getAction().getClientExtra().getSys_campus_id(); - // 사용자가 존재 & 식당 블록에서 캠퍼스 눌렀을 때 -> 식당 리스트 - if (campusId != -1 && sysCampusId != -1) { - return cafeteriaServiceV2.makeCafeteriaListCard(campusId); - } else { // 사용자가 존재 X & 식당 블록에서 더보기 버튼 눌렀을 때 -> 캠퍼스 리스트 + return campusOrCafeteria(campusId, sysCampusId); + } + + + // 반환 조건 설정 + private String campusOrCafeteria(int campusId, int sysCampusId) { + // 더보기 버튼 누른 경우 + if (sysCampusId == -1) { return campusServiceV2.makeCampusListCard(); } + + // 사용자가 원하는 캠퍼스가 있을 때 + if (sysCampusId > 0) { + return cafeteriaServiceV2.makeCafeteriaListCard(sysCampusId); + } + + // 사용자가 원하는 캠퍼스가 없을 때 + return (campusId != -1) + ? cafeteriaServiceV2.makeCafeteriaListCard(campusId) + : campusServiceV2.makeCampusListCard(); } + + } diff --git a/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java b/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java index 8a22d32..eea29e8 100644 --- a/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java @@ -9,18 +9,13 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/api/spring") +@RequestMapping("/api/v2/spring") @RequiredArgsConstructor public class DietControllerV2 { private final DietServiceV2 dietServiceV2; - @PostMapping("/dish/v2") + @PostMapping("/dish") public String handleRequest(@RequestBody RequestDto requestDto) { return dietServiceV2.requestHandler(requestDto); } - -// @PostMapping("/dish/v2") -// public void handleRequest(@RequestBody String request) { -// System.out.println(request); -// } } diff --git a/src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java b/src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java index 251cdba..9964f77 100644 --- a/src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java @@ -20,7 +20,7 @@ import static java.lang.String.valueOf; @RestController -@RequestMapping("/api/spring") +@RequestMapping("/api/v2/spring") public class NoticeControllerV2 { private final NoticeServiceV2 noticeServiceV2; @@ -39,7 +39,7 @@ public NoticeControllerV2(NoticeServiceV2 noticeServiceV2, } // 학교 공지사항 조회 - @PostMapping("/main-notice/v2") + @PostMapping("/main-notice") public String getMainNotice() { int departmentId = 117; // 학교 공지사항 id String departmentEng = "main"; // 학과 영문명 @@ -47,7 +47,7 @@ public String getMainNotice() { } // 학과 공지사항 조회 - @PostMapping("/department-notice/v2") + @PostMapping("/department-notice") public String responseDepartmentNotice(@RequestBody RequestDto requestDto) { String userId = requestDto.getUserRequest().getUser().getId(); int departmentId = userServiceV2.getUserDepartmentId(userId); diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java index 86a6460..e82fd8c 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java @@ -33,11 +33,6 @@ public List getCampusList() { return campusRepositoryV2.findCampusList(); } - // 캠퍼스 이름으로 url 찾기 - public String getCampusImgUrl(String campusName) { - return campusRepositoryV2.findCampusImgUrlByCampusName(campusName); - } - // 캠퍼스 이름으로 id 찾기 public int getCampusId(String campusName) { return campusRepositoryV2.findCampusIdByName(campusName); @@ -63,6 +58,7 @@ public List mappingCampusList(List campusList) { String imageUrl = campus.getThumbnailUrl(); Map extra = new HashMap<>(); extra.put("sys_campus_id", campus.getId()); + System.out.println("campusId: " + campus.getId()); // 캠퍼스 아이템 객체 생성 ListItemDto listItem = new ListItemDto(campusName, imageUrl, "block", "66067167cdd882158c759fc2", extra); diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java index 7a5b4da..c4d9bae 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java @@ -79,6 +79,7 @@ public String makeResponse(HandleRequestDto parameters) { } } + // 캠퍼스에 식당 존재여부 확인 -> cafeteriaId 찾기 // cafeteriaId가 -1이면 존재하지 않음 private int checkIsThereCafeteria(HandleRequestDto parameters) { @@ -86,12 +87,14 @@ private int checkIsThereCafeteria(HandleRequestDto parameters) { return cafeteriaServiceV2.getCafeteriaId(parameters.getCafeteriaName(), campusId); } + // 캠퍼스에 식당이 존재하지 않는 경우 메시지 출력 private String errorMsgThereIsNoCafeteria() { return SimpleTextResponse .simpleTextResponse("식당을 찾지 못했어!\n어떤 캠퍼스에 있는 식당인지 정확히 알려줘!"); } + // 식당 메뉴 존재여부 확인 private int checkThereIsDiet(HandleRequestDto parameters, int cafeteriaId) { // 오늘, 내일 문자열로 날짜 설정하기 @@ -101,6 +104,7 @@ private int checkThereIsDiet(HandleRequestDto parameters, int cafeteriaId) { return (!dietObject.isEmpty()) ? 1 : -1; } + // 카테고리별 메뉴 리스트 생성하기 private MultiValueMap getDiets(HandleRequestDto parameters, int cafeteriaId) { // 오늘, 내일 문자열로 날짜 설정하기 @@ -120,6 +124,7 @@ private MultiValueMap getDiets(HandleRequestDto parameters, int return dietList; } + // 카테고리별 메뉴 문자열로 나열하기 public StringBuilder processDietList(MultiValueMap dietList) { // 키 추출 @@ -149,7 +154,6 @@ private String makeContents(HandleRequestDto parameters, int cafeteriaId, String // 메뉴 연결 StringBuilder description = new StringBuilder(String.valueOf(dietDate)).append(" ") .append(parameters.getPeriod()).append(diets); - System.out.println("description: " +description); return mappingResponse(parameters, imgUrl, title.toString(), description.toString()); } @@ -175,39 +179,6 @@ public String mappingResponse(HandleRequestDto parameters, String imgUrl, String } - - - -// private String makeContentsToFindDiet(HandleRequestDto parameters) { -// int campusId = campusServiceV2.getCampusId(parameters.getCampusName()); -// -// // sysDay로 식단 날짜 설정하기 -// Date dietDate = getCurrentDate(parameters.getDay()); -// String dietDescription = getDietDescription(parameters, campusId, dietDate); -// // 식당 imgUrl 찾기 -// String imgUrl = campusServiceV2.getCampusImgUrl(parameters.getCampusName()); -// -// // title 데이터 연결 -// StringBuilder title = new StringBuilder("\uD83C\uDF71 ") -// .append(parameters.getCafeteriaName()).append("(") -// .append(parameters.getCampusName(), 0, 2).append(") 메뉴"); -// -// // 메뉴 연결 -// StringBuilder description = new StringBuilder(); -// -// if (!dietDescription.equals("none")) { -// // 메뉴 연결 -// description.append(dietDate) -// .append(" ").append(parameters.getPeriod()).append(dietDescription); -// -// return mappingResponse(parameters, imgUrl, title.toString(), description.toString()); -// } else { -// return SimpleTextResponse.simpleTextResponse("식당을 찾지 못했어!\n어떤 캠퍼스에 있는 식당인지 정확히 알려줘!"); -// } -// } - - - // quickReply 객체 생성 private List mappingQuickReply(HandleRequestDto parameters) { return switch (parameters.getPeriod()) { @@ -226,33 +197,6 @@ private List mappingQuickReply(HandleRequestDto parameters) { }; } -// // cafeteria_id 존재여부 확인(캠퍼스에 식당이 존재하는지) -// public String getDietDescription(HandleRequestDto parameters, int campusId,Date dietDate) { -// int cafeteriaId = cafeteriaServiceV2.getCafeteriaId(parameters.getCafeteriaName(), campusId); -// String diets = getDietList(cafeteriaId, parameters.getPeriod(), dietDate).toString(); -// return (cafeteriaId != -1) ? diets : "none"; -// } - - // 해당 식당 메뉴 찾아오기 -// public StringBuilder getDietList(int cafeteriaId, String period, Date dietDate) { -// List dietObject = dietRepositoryV2.findDietList(dietDate, period, cafeteriaId); -// -// MultiValueMap dietList = new LinkedMultiValueMap<>(); // 중복 키 허용(값을 리스트로 반환) -// -// for (Object[] o : dietObject) { -// String dishName = (String) o[2]; -// -// String key = (o[0] != null) ? (String)o[0] // dishCategory -// : (o[1] != null) ? (String) o[1] // dishType -// : "메뉴"; -// -// dietList.add(key, dishName); -// } -// return processDietList(dietList); -// } - - - // 일반 파라미터 값 채우기 // sys_campus_name 파라미터 초기화 From 4f03b0a4f48bc6f35578c9ed91cccf1eb1b4b1bc Mon Sep 17 00:00:00 2001 From: hykim02 Date: Fri, 7 Mar 2025 01:18:25 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[Fix]DietRepositoryTest=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cafeteria/DietRepositoryV2Test.java | 63 ------------------- 1 file changed, 63 deletions(-) delete mode 100644 src/test/java/com/example/Jinus/repository/cafeteria/DietRepositoryV2Test.java diff --git a/src/test/java/com/example/Jinus/repository/cafeteria/DietRepositoryV2Test.java b/src/test/java/com/example/Jinus/repository/cafeteria/DietRepositoryV2Test.java deleted file mode 100644 index 713457d..0000000 --- a/src/test/java/com/example/Jinus/repository/cafeteria/DietRepositoryV2Test.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.example.Jinus.repository.cafeteria; - -import com.example.Jinus.entity.cafeteria.CafeteriaDietEntity; -import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - - -@ExtendWith(SpringExtension.class) -@DataJpaTest -@ActiveProfiles("test") // application-test.properties 적용 -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) // H2 사용 -public class DietRepositoryV2Test { - @Autowired - private DietRepositoryV2 dietRepositoryV2; - - @BeforeEach - void setUp() { - // 날짜 + 시간 + 시간대 포함 (한국 시간: UTC+9) - LocalDateTime dateTime = LocalDateTime.of(25, 2, 11, 0, 0, 0); - CafeteriaDietEntity cafeteriaDietEntity = - new CafeteriaDietEntity(1, dateTime, "월", "점심", "A코스", "주식", "쌀밥", 7); - CafeteriaDietEntity cafeteriaDietEntity2 = - new CafeteriaDietEntity(1, dateTime, "월", "점심", "B코스", "주식", "달걀", 7); - dietRepositoryV2.save(cafeteriaDietEntity); - dietRepositoryV2.save(cafeteriaDietEntity2); - } - - @Test - @DisplayName("조건에 맞는 식단 찾기") - public void checkDiet_meetConditions() { - //given - String dateTime = "2025-03-09 00:00:00.000000 +09:00"; - String period = "점심"; - int cafeteriaId = 7; - - // 예상 데이터 - List dietList = new ArrayList<>(); - Object[] diet1 = {"A코스", "주식", "쌀밥"}; - Object[] diet2 = {"B코스", "주식", "달걀"}; - dietList.add(diet1); - dietList.add(diet2); - - // when - List result = dietRepositoryV2.findDietList(dateTime, period, cafeteriaId); - - // then - assertThat(result).usingRecursiveComparison().isEqualTo(dietList); - } -}