diff --git a/src/main/java/ssu/eatssu/domain/menu/entity/Meal.java b/src/main/java/ssu/eatssu/domain/menu/entity/Meal.java index 406f218..2062ea6 100644 --- a/src/main/java/ssu/eatssu/domain/menu/entity/Meal.java +++ b/src/main/java/ssu/eatssu/domain/menu/entity/Meal.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import ssu.eatssu.domain.restaurant.entity.Restaurant; +import ssu.eatssu.domain.restaurant.entity.TemporalRestaurant; import java.util.*; @@ -27,8 +28,7 @@ public class Meal { @Enumerated(EnumType.STRING) private TimePart timePart; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "restaurant_id") + @Embedded private Restaurant restaurant; @OneToMany(mappedBy = "meal", cascade = CascadeType.ALL) diff --git a/src/main/java/ssu/eatssu/domain/menu/entity/Menu.java b/src/main/java/ssu/eatssu/domain/menu/entity/Menu.java index 7c43e36..583221f 100644 --- a/src/main/java/ssu/eatssu/domain/menu/entity/Menu.java +++ b/src/main/java/ssu/eatssu/domain/menu/entity/Menu.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.*; import ssu.eatssu.domain.restaurant.entity.Restaurant; +import ssu.eatssu.domain.restaurant.entity.TemporalRestaurant; import java.util.ArrayList; import java.util.List; @@ -29,8 +30,7 @@ public class Menu { @OneToMany(mappedBy = "menu", cascade = CascadeType.ALL) private List mealMenus = new ArrayList<>(); - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "restaurant_id") + @Embedded private Restaurant restaurant; @Embedded @@ -42,14 +42,19 @@ private Menu(String name, Restaurant restaurant, Integer price) { this.price = price; } + private Menu(String name, Integer price) { + this.name = name; + this.price = price; + } + /** * 변동 메뉴를 생성합니다. * todo: 변동메뉴 식당이 아니라 고정 메뉴 식당으로 잘못 들어온다면 어떻게 처리? */ - public static Menu createChangeMenu(String name, Restaurant restaurant) { + public static Menu createVariable(String name, Restaurant restaurant) { int price = 0; - if (MenuType.isChanged(restaurant.getRestaurantName())) { - price = restaurant.getRestaurantName().getPrice(); + if (restaurant.isVariable()) { + price = restaurant.getPrice(); } return new Menu(name, restaurant, price); } @@ -58,7 +63,7 @@ public static Menu createChangeMenu(String name, Restaurant restaurant) { * 고정 메뉴를 생성합니다. * todo: 고정메뉴 식당이 아니라 변동 메뉴 식당으로 잘못 들어온다면 어떻게 처리? */ - public static Menu createFixedMenu(String name, Restaurant restaurant, Integer price) { + public static Menu createFixed(String name, Restaurant restaurant, Integer price) { return new Menu(name, restaurant, price); } diff --git a/src/main/java/ssu/eatssu/domain/menu/entity/MenuType.java b/src/main/java/ssu/eatssu/domain/menu/entity/MenuType.java index 5c1b34a..6baf67b 100644 --- a/src/main/java/ssu/eatssu/domain/menu/entity/MenuType.java +++ b/src/main/java/ssu/eatssu/domain/menu/entity/MenuType.java @@ -5,9 +5,9 @@ import java.util.Arrays; import java.util.List; -import ssu.eatssu.domain.restaurant.entity.RestaurantName; +import ssu.eatssu.domain.restaurant.entity.Restaurant; -import static ssu.eatssu.domain.restaurant.entity.RestaurantName.*; +import static ssu.eatssu.domain.restaurant.entity.Restaurant.*; @Getter @@ -16,21 +16,13 @@ public enum MenuType { VARIABLE("변동 메뉴", Arrays.asList(DODAM, DORMITORY, HAKSIK)); private final String description; - private final List restaurants; + private final List restaurants; - MenuType(String description, List restaurants) { + MenuType(String description, List restaurants) { this.description = description; this.restaurants = restaurants; } - public static boolean isFixed(RestaurantName restaurant) { - return FIXED.getRestaurants().contains(restaurant); - } - - public static boolean isChanged(RestaurantName restaurant) { - return VARIABLE.getRestaurants().contains(restaurant); - } - @JsonCreator public static MenuType from(String description) { return Arrays.stream(MenuType.values()) diff --git a/src/main/java/ssu/eatssu/domain/menu/presentation/MealController.java b/src/main/java/ssu/eatssu/domain/menu/presentation/MealController.java index 5266959..b97024f 100644 --- a/src/main/java/ssu/eatssu/domain/menu/presentation/MealController.java +++ b/src/main/java/ssu/eatssu/domain/menu/presentation/MealController.java @@ -26,7 +26,7 @@ import ssu.eatssu.domain.menu.dto.MenuRequest.CreateMealRequest; import ssu.eatssu.domain.menu.dto.MenuResponse.MealInformationResponse; import ssu.eatssu.domain.menu.service.MenuService; -import ssu.eatssu.domain.restaurant.entity.RestaurantName; +import ssu.eatssu.domain.restaurant.entity.Restaurant; import ssu.eatssu.global.handler.response.BaseException; import ssu.eatssu.global.handler.response.BaseResponse; @@ -52,10 +52,10 @@ public class MealController { @PostMapping("") public BaseResponse createMeal( @Parameter(description = "날짜(yyyyMMdd)") @RequestParam("date") @DateTimeFormat(pattern = "yyyyMMdd") Date date, - @Parameter(description = "식당이름") @RequestParam("restaurant") RestaurantName restaurantName, + @Parameter(description = "식당이름") @RequestParam("restaurant") Restaurant restaurantName, @Parameter(description = "시간대") @RequestParam("time") TimePart timePart, @RequestBody CreateMealRequest createMealRequest) { - if (RestaurantName.isFixed(restaurantName)) { + if (restaurantName.isFixed()) { throw new BaseException(NOT_SUPPORT_RESTAURANT); } @@ -76,9 +76,9 @@ public BaseResponse createMeal( @GetMapping("") public BaseResponse> getMeal( @Parameter(description = "날짜(yyyyMMdd)") @RequestParam("date") @DateTimeFormat(pattern = "yyyyMMdd") Date date, - @Parameter(description = "식당 이름") @RequestParam("restaurant") RestaurantName restaurantName, + @Parameter(description = "식당 이름") @RequestParam("restaurant") Restaurant restaurantName, @Parameter(description = "시간대") @RequestParam("time") TimePart timePart) { - if (RestaurantName.isFixed(restaurantName)) { + if (restaurantName.isFixed()) { throw new BaseException(NOT_SUPPORT_RESTAURANT); } diff --git a/src/main/java/ssu/eatssu/domain/menu/presentation/MenuController.java b/src/main/java/ssu/eatssu/domain/menu/presentation/MenuController.java index ca4d8f6..d4074d1 100644 --- a/src/main/java/ssu/eatssu/domain/menu/presentation/MenuController.java +++ b/src/main/java/ssu/eatssu/domain/menu/presentation/MenuController.java @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.*; import ssu.eatssu.domain.menu.dto.MenuResponse.MenuInformationResponse; import ssu.eatssu.domain.menu.dto.MenuResponse.MenusInformationResponse; -import ssu.eatssu.domain.restaurant.entity.RestaurantName; +import ssu.eatssu.domain.restaurant.entity.Restaurant; import ssu.eatssu.global.handler.response.BaseException; import ssu.eatssu.domain.menu.service.MenuService; @@ -39,8 +39,8 @@ public class MenuController { }) @GetMapping("") public BaseResponse> getMenus( - @RequestParam("restaurant") RestaurantName restaurantName) { - if (RestaurantName.isVariable(restaurantName)) { + @RequestParam("restaurant") Restaurant restaurantName) { + if (restaurantName.isVariable()) { throw new BaseException(NOT_SUPPORT_RESTAURANT); } return BaseResponse.success(menuService.findMenusByRestaurant(restaurantName)); diff --git a/src/main/java/ssu/eatssu/domain/menu/repository/MealRepository.java b/src/main/java/ssu/eatssu/domain/menu/repository/MealRepository.java index 29cb3c5..e8bd8de 100644 --- a/src/main/java/ssu/eatssu/domain/menu/repository/MealRepository.java +++ b/src/main/java/ssu/eatssu/domain/menu/repository/MealRepository.java @@ -3,11 +3,14 @@ import org.springframework.data.jpa.repository.JpaRepository; import ssu.eatssu.domain.menu.entity.Meal; import ssu.eatssu.domain.restaurant.entity.Restaurant; +import ssu.eatssu.domain.restaurant.entity.TemporalRestaurant; import ssu.eatssu.domain.menu.entity.TimePart; import java.util.Date; import java.util.List; public interface MealRepository extends JpaRepository { - List findAllByDateAndTimePartAndRestaurant(Date date, TimePart timePart, Restaurant restaurant); + + List findAllByDateAndTimePartAndRestaurant(Date date, TimePart timePart, + Restaurant restaurant); } diff --git a/src/main/java/ssu/eatssu/domain/menu/repository/MenuRepository.java b/src/main/java/ssu/eatssu/domain/menu/repository/MenuRepository.java index da3b760..0d03ad9 100644 --- a/src/main/java/ssu/eatssu/domain/menu/repository/MenuRepository.java +++ b/src/main/java/ssu/eatssu/domain/menu/repository/MenuRepository.java @@ -3,6 +3,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import ssu.eatssu.domain.menu.entity.Menu; import ssu.eatssu.domain.restaurant.entity.Restaurant; +import ssu.eatssu.domain.restaurant.entity.TemporalRestaurant; import java.util.List; import java.util.Optional; diff --git a/src/main/java/ssu/eatssu/domain/menu/service/MenuService.java b/src/main/java/ssu/eatssu/domain/menu/service/MenuService.java index 7bc50b6..8e4bdf9 100644 --- a/src/main/java/ssu/eatssu/domain/menu/service/MenuService.java +++ b/src/main/java/ssu/eatssu/domain/menu/service/MenuService.java @@ -13,7 +13,7 @@ import ssu.eatssu.domain.menu.entity.MealMenu; import ssu.eatssu.domain.menu.entity.Menu; import ssu.eatssu.domain.restaurant.entity.Restaurant; -import ssu.eatssu.domain.restaurant.entity.RestaurantName; +import ssu.eatssu.domain.restaurant.entity.TemporalRestaurant; import ssu.eatssu.domain.menu.entity.TimePart; import ssu.eatssu.domain.menu.repository.MealMenuRepository; import ssu.eatssu.domain.menu.repository.MealRepository; @@ -35,10 +35,8 @@ public class MenuService { private final MenuRepository menuRepository; private final MealRepository mealRepository; private final MealMenuRepository mealMenuRepository; - private final RestaurantRepository restaurantRepository; - public List findMenusByRestaurant(RestaurantName restaurantName) { - Restaurant restaurant = getRestaurant(restaurantName); + public List findMenusByRestaurant(Restaurant restaurant) { List menus = menuRepository.findAllByRestaurant(restaurant); return menus.stream() @@ -47,9 +45,8 @@ public List findMenusByRestaurant(RestaurantName restau } public List findSpecificMeals(Date date, - RestaurantName restaurantName, + Restaurant restaurant, TimePart timePart) { - Restaurant restaurant = getRestaurant(restaurantName); List meals = getMeals(date, timePart, restaurant); return meals.stream() @@ -57,9 +54,8 @@ public List findSpecificMeals(Date date, .toList(); } - public void createMeal(Date date, RestaurantName restaurantName, TimePart timePart, + public void createMeal(Date date, Restaurant restaurant, TimePart timePart, CreateMealRequest request) { - Restaurant restaurant = getRestaurant(restaurantName); List meals = getMeals(date, timePart, restaurant); if (MenuValidator.validateExistedMeal(meals, @@ -95,10 +91,10 @@ private void addMenu(Meal meal, CreateMealRequest request) { private void checkAndCreateMenu(String menuName, Restaurant restaurant) { if (!menuRepository.existsByNameAndRestaurant(menuName, restaurant)) { - menuRepository.save(Menu.createChangeMenu(menuName, restaurant)); + menuRepository.save(Menu.createVariable(menuName, restaurant)); } - menuRepository.save(Menu.createChangeMenu(menuName, restaurant)); + menuRepository.save(Menu.createVariable(menuName, restaurant)); } public MenusInformationResponse findMenusInMeal(Long mealId) { @@ -119,7 +115,7 @@ public void deleteMeal(Long mealId) { cleanupGarbageMenu(menus); } - public void cleanupGarbageMenu(List menuList) { + private void cleanupGarbageMenu(List menuList) { for (Menu menu : menuList) { if (menu.getMealMenus().isEmpty()) { menuRepository.delete(menu); @@ -144,10 +140,4 @@ private List getMeals(Date date, TimePart timePart, Restaurant restaurant) timePart, restaurant); return meals; } - - private Restaurant getRestaurant(RestaurantName restaurantName) { - Restaurant restaurant = restaurantRepository.findByRestaurantName(restaurantName) - .orElseThrow(() -> new BaseException(BaseResponseStatus.NOT_FOUND_RESTAURANT)); - return restaurant; - } } diff --git a/src/main/java/ssu/eatssu/domain/menu/util/MenuValidator.java b/src/main/java/ssu/eatssu/domain/menu/util/MenuValidator.java index 05d6b01..10bb217 100644 --- a/src/main/java/ssu/eatssu/domain/menu/util/MenuValidator.java +++ b/src/main/java/ssu/eatssu/domain/menu/util/MenuValidator.java @@ -2,13 +2,10 @@ import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.List; import lombok.RequiredArgsConstructor; -import ssu.eatssu.domain.menu.entity.TimePart; import ssu.eatssu.domain.menu.dto.MenuRequest.CreateMealRequest; import ssu.eatssu.domain.menu.entity.Meal; -import ssu.eatssu.domain.restaurant.entity.Restaurant; @RequiredArgsConstructor public class MenuValidator { diff --git a/src/main/java/ssu/eatssu/domain/restaurant/entity/Restaurant.java b/src/main/java/ssu/eatssu/domain/restaurant/entity/Restaurant.java index 73b9f05..2f6dcb1 100644 --- a/src/main/java/ssu/eatssu/domain/restaurant/entity/Restaurant.java +++ b/src/main/java/ssu/eatssu/domain/restaurant/entity/Restaurant.java @@ -1,29 +1,43 @@ package ssu.eatssu.domain.restaurant.entity; -import jakarta.persistence.*; -import lombok.AccessLevel; +import com.fasterxml.jackson.annotation.JsonCreator; +import java.util.Arrays; import lombok.Getter; -import lombok.NoArgsConstructor; -import java.util.List; -import ssu.eatssu.domain.menu.entity.Meal; -import ssu.eatssu.domain.menu.entity.Menu; +import ssu.eatssu.global.handler.response.BaseException; +import ssu.eatssu.global.handler.response.BaseResponseStatus; -@Entity @Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Restaurant { +public enum Restaurant { + DODAM(RestaurantType.VARIABLE, "도담 식당", 6000), + DORMITORY(RestaurantType.VARIABLE, "기숙사 식당", 5000), + FOOD_COURT(RestaurantType.FIXED, "푸드 코트", null), + SNACK_CORNER(RestaurantType.FIXED, "스낵 코너", null), + HAKSIK(RestaurantType.VARIABLE, "학생 식당", 5000); - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "restaurant_id") - private Long id; + private RestaurantType restaurantType; + private String restaurantName; + private Integer price; - @Enumerated(EnumType.STRING) - private RestaurantName restaurantName; + @JsonCreator + public static Restaurant from(String restaurantName) { + return Arrays.stream(Restaurant.values()) + .filter(r -> r.getRestaurantName().equals(restaurantName)) + .findAny() + .orElseThrow(() -> new BaseException(BaseResponseStatus.NOT_FOUND_RESTAURANT)); + } - @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL) - private List menus; + Restaurant(RestaurantType restaurantType, String description, Integer price) { + this.restaurantType = restaurantType; + this.restaurantName = description; + this.price = price; + } - @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL) - private List meals; + public boolean isFixed() { + return this.restaurantType == RestaurantType.FIXED; + } + + public boolean isVariable() { + return this.restaurantType == RestaurantType.VARIABLE; + } } diff --git a/src/main/java/ssu/eatssu/domain/restaurant/entity/RestaurantName.java b/src/main/java/ssu/eatssu/domain/restaurant/entity/RestaurantName.java deleted file mode 100644 index d5dd016..0000000 --- a/src/main/java/ssu/eatssu/domain/restaurant/entity/RestaurantName.java +++ /dev/null @@ -1,43 +0,0 @@ -package ssu.eatssu.domain.restaurant.entity; - -import com.fasterxml.jackson.annotation.JsonCreator; -import java.util.Arrays; -import lombok.Getter; - -import ssu.eatssu.global.handler.response.BaseException; -import ssu.eatssu.global.handler.response.BaseResponseStatus; - -@Getter -public enum RestaurantName { - DODAM(RestaurantType.VARIABLE, "도담 식당", 6000), - DORMITORY(RestaurantType.VARIABLE, "기숙사 식당", 5000), - FOOD_COURT(RestaurantType.FIXED, "푸드 코트", null), - SNACK_CORNER(RestaurantType.FIXED, "스낵 코너", null), - HAKSIK(RestaurantType.VARIABLE, "학생 식당", 5000); - - private RestaurantType restaurantType; - private String description; - private Integer price; - - @JsonCreator - public static RestaurantName from(String description) { - return Arrays.stream(RestaurantName.values()) - .filter(d -> d.getDescription().equals(description)) - .findAny() - .orElseThrow(() -> new BaseException(BaseResponseStatus.NOT_FOUND_RESTAURANT)); - } - - RestaurantName(RestaurantType restaurantType, String description, Integer price) { - this.restaurantType = restaurantType; - this.description = description; - this.price = price; - } - - public static boolean isFixed(RestaurantName restaurantName) { - return restaurantName.getRestaurantType() == RestaurantType.FIXED; - } - - public static boolean isVariable(RestaurantName restaurantName) { - return restaurantName.getRestaurantType() == RestaurantType.VARIABLE; - } -} diff --git a/src/main/java/ssu/eatssu/domain/restaurant/entity/TemporalRestaurant.java b/src/main/java/ssu/eatssu/domain/restaurant/entity/TemporalRestaurant.java new file mode 100644 index 0000000..47ccf47 --- /dev/null +++ b/src/main/java/ssu/eatssu/domain/restaurant/entity/TemporalRestaurant.java @@ -0,0 +1,29 @@ +package ssu.eatssu.domain.restaurant.entity; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; +import ssu.eatssu.domain.menu.entity.Meal; +import ssu.eatssu.domain.menu.entity.Menu; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class TemporalRestaurant { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "restaurant_id") + private Long id; + + @Enumerated(EnumType.STRING) + private Restaurant restaurantName; + + @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL) + private List menus; + + @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL) + private List meals; +} diff --git a/src/main/java/ssu/eatssu/domain/restaurant/repository/RestaurantRepository.java b/src/main/java/ssu/eatssu/domain/restaurant/repository/RestaurantRepository.java index c70df85..072113c 100644 --- a/src/main/java/ssu/eatssu/domain/restaurant/repository/RestaurantRepository.java +++ b/src/main/java/ssu/eatssu/domain/restaurant/repository/RestaurantRepository.java @@ -2,12 +2,12 @@ import org.springframework.data.jpa.repository.JpaRepository; import ssu.eatssu.domain.restaurant.entity.Restaurant; -import ssu.eatssu.domain.restaurant.entity.RestaurantName; +import ssu.eatssu.domain.restaurant.entity.TemporalRestaurant; import java.util.Optional; -public interface RestaurantRepository extends JpaRepository { +public interface RestaurantRepository extends JpaRepository { - Optional findByRestaurantName(RestaurantName restaurantName); + Optional findByRestaurantName(Restaurant restaurantName); }