Skip to content
14 changes: 13 additions & 1 deletion src/main/java/ssu/eatssu/domain/menu/entity/Menu.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,16 @@
import ssu.eatssu.domain.restaurant.entity.Restaurant;
import ssu.eatssu.domain.review.entity.Review;
import ssu.eatssu.domain.review.entity.Reviews;
import ssu.eatssu.domain.user.entity.Language;
import ssu.eatssu.global.i18n.Localizable;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Menu {
public class Menu implements Localizable {

// TODO : 삭제되어야 함
@Embedded
Expand All @@ -40,6 +42,12 @@ public class Menu {
@Column(name = "menu_id")
private Long id;
private String name;
@Column(name = "name_en")
private String nameEn;
@Column(name = "name_ja")
private String nameJa;
@Column(name = "name_vi")
private String nameVi;
private Integer price;
@Enumerated(EnumType.STRING)
private Restaurant restaurant;
Expand Down Expand Up @@ -67,6 +75,10 @@ public static Menu createFixed(String name, Restaurant restaurant, Integer price
return new Menu(name, restaurant, price, category);
}

public String getNameByLanguage(Language language) {
return getLocalizedValue(language, name, nameEn, nameJa, nameVi);
}
Comment on lines +78 to +80

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

[작성자: 김철수, 날짜: 2026-07-05] Menu 엔티티에 다국어 이름 필드(nameEn, nameJa, nameVi)가 추가되었으나 이를 설정하거나 수정할 수 있는 메서드가 없습니다. 다국어 이름을 업데이트할 수 있는 메서드를 추가하는 것을 권장합니다.

    public String getNameByLanguage(Language language) {
        return getLocalizedValue(language, name, nameEn, nameJa, nameVi);
    }

    public void updateNames(String nameEn, String nameJa, String nameVi) {
        this.nameEn = nameEn;
        this.nameJa = nameJa;
        this.nameVi = nameVi;
    }
References
  1. 댓글은 가급적 단일 행으로 작성하고 작성자 이름과 날짜를 포함해야 하며, 당장 예외 처리가 필요하지 않은 잠재적 문제가 있는 부분에는 IntelliJ 기본 형식인 FIXME 주석 사용을 권장합니다. (link)


public void addReview(Review review) {
reviews.add(review);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import ssu.eatssu.domain.menu.entity.Menu;
import ssu.eatssu.domain.user.entity.Language;

@Getter
@NoArgsConstructor
Expand All @@ -24,7 +25,7 @@ public class MenuResponse {
@Schema(description = "메뉴 평점 (평점이 없으면 null) ", example = "4.4")
private Double rating;

public static MenuResponse from(Menu menu, Double rating) {
return new MenuResponse(menu.getId(), menu.getName(), menu.getPrice(), rating);
public static MenuResponse from(Menu menu, Double rating, Language language) {
return new MenuResponse(menu.getId(), menu.getNameByLanguage(language), menu.getPrice(), rating);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import ssu.eatssu.domain.menu.presentation.dto.response.MenuRestaurantResponse;
import ssu.eatssu.domain.menu.service.MenuService;
import ssu.eatssu.domain.restaurant.entity.Restaurant;
import ssu.eatssu.domain.user.entity.Language;
import ssu.eatssu.global.handler.response.BaseResponse;

@RestController
Expand All @@ -38,8 +39,9 @@ public class MenuController {
})
@GetMapping
public BaseResponse<MenuRestaurantResponse> getMenus(
@RequestParam("restaurant") Restaurant restaurant) {
@RequestParam("restaurant") Restaurant restaurant,
@RequestParam(required = false) Language language) {

return BaseResponse.success(menuService.getMenusByRestaurant(restaurant));
return BaseResponse.success(menuService.getMenusByRestaurant(restaurant, language));
}
}
14 changes: 11 additions & 3 deletions src/main/java/ssu/eatssu/domain/menu/service/MenuService.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import ssu.eatssu.domain.menu.presentation.dto.response.MenuRestaurantResponse;
import ssu.eatssu.domain.restaurant.entity.Restaurant;
import ssu.eatssu.domain.restaurant.entity.RestaurantType;
import ssu.eatssu.domain.user.entity.Language;
import ssu.eatssu.global.handler.response.BaseException;
import ssu.eatssu.global.handler.response.BaseResponseStatus;

Expand All @@ -38,6 +39,10 @@ private static void validateMenuRestaurant(Restaurant restaurant) {
}

public MenuRestaurantResponse getMenusByRestaurant(Restaurant restaurant) {
return getMenusByRestaurant(restaurant, null);
}

public MenuRestaurantResponse getMenusByRestaurant(Restaurant restaurant, Language language) {
validateMenuRestaurant(restaurant);

List<MenuCategory> categories = findCategoriesByRestaurant(restaurant);
Expand All @@ -46,7 +51,8 @@ public MenuRestaurantResponse getMenusByRestaurant(Restaurant restaurant) {

for (MenuCategory category : categories) {
List<MenuResponse> menus = getMenuResponsesByRestaurantAndCategory(restaurant,
category);
category,
language);
response.add(CategoryWithMenusResponse.of(category.getName(), menus));
}

Expand All @@ -59,12 +65,14 @@ private List<MenuCategory> findCategoriesByRestaurant(Restaurant restaurant) {

@NotNull
private List<MenuResponse> getMenuResponsesByRestaurantAndCategory(Restaurant restaurant,
MenuCategory category) {
MenuCategory category,
Language language) {
return menuRepository.findAllByRestaurantAndCategory(restaurant, category)
.stream()
.filter(Menu::isContinued)
.map(menu -> MenuResponse.from(menu,
menuRatingService.getMainRatingAverage(menu.getId())))
menuRatingService.getMainRatingAverage(menu.getId()),
language))
.toList();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import ssu.eatssu.domain.partnership.entity.Partnership;
import ssu.eatssu.domain.partnership.entity.PartnershipRestaurant;
import ssu.eatssu.domain.partnership.entity.PeriodType;
import ssu.eatssu.domain.user.entity.Language;

import java.time.LocalDate;

Expand All @@ -23,10 +24,11 @@ public class PartnershipInfo {

public static PartnershipInfo fromEntity(Partnership partnership,
PartnershipRestaurant restaurant,
boolean isLiked) {
boolean isLiked,
Language language) {
return PartnershipInfo.builder()
.id(partnership.getId())
.description(partnership.getDescription())
.description(partnership.getDescriptionByLanguage(language))
.startDate(partnership.getStartDate())
.endDate(partnership.getEndDate())
.periodType(partnership.getPeriodType())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ public static PartnershipResponse fromEntity(PartnershipRestaurant restaurant, L
List<PartnershipInfo> infos = restaurant.getPartnerships().stream()
.map(partnership -> PartnershipInfo.fromEntity(partnership,
restaurant,
isLiked))
isLiked,
language))
Comment on lines 27 to +31

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

[작성자: 김철수, 날짜: 2026-07-05] PartnershipResponse.fromEntity 메서드 내에서 지연 로딩(Lazy Loading)으로 설정된 restaurant.getPartnerships()를 호출하고 있습니다. 이를 호출하는 서비스 메서드에 @transactional(readOnly = true) 선언이 누락되어 있을 경우 LazyInitializationException이 발생할 수 있으므로 주의가 필요합니다.

References
  1. 댓글은 가급적 단일 행으로 작성하고 작성자 이름과 날짜를 포함해야 합니다. (link)

.collect(Collectors.toList());

return PartnershipResponse.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import org.hibernate.annotations.Where;
import ssu.eatssu.domain.user.department.entity.College;
import ssu.eatssu.domain.user.department.entity.Department;
import ssu.eatssu.domain.user.entity.Language;
import ssu.eatssu.global.i18n.Localizable;

import java.time.LocalDate;

Expand All @@ -27,7 +29,7 @@
@Builder
@AllArgsConstructor
@Where(clause = "end_date >= CURRENT_DATE")
public class Partnership {
public class Partnership implements Localizable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "partnership_id")
Expand All @@ -36,6 +38,15 @@ public class Partnership {
@Column(name = "description", nullable = false)
private String description;

@Column(name = "description_en", columnDefinition = "TEXT")
private String descriptionEn;

@Column(name = "description_ja", columnDefinition = "TEXT")
private String descriptionJa;

@Column(name = "description_vi", columnDefinition = "TEXT")
private String descriptionVi;

@Column(name = "start_date", nullable = false)
private LocalDate startDate;

Expand All @@ -59,6 +70,10 @@ public class Partnership {
@JoinColumn(name = "partnership_restaurant_id")
private PartnershipRestaurant partnershipRestaurant;

public String getDescriptionByLanguage(Language language) {
return getLocalizedValue(language, description, descriptionEn, descriptionJa, descriptionVi);
}

public void setPartnershipCollege(College partnershipCollege) {
this.partnershipCollege = partnershipCollege;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
ALTER TABLE partnership
ADD COLUMN description_en TEXT NULL,
ADD COLUMN description_ja TEXT NULL,
ADD COLUMN description_vi TEXT NULL;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
ALTER TABLE menu
ADD COLUMN name_en VARCHAR(255) NULL,
ADD COLUMN name_ja VARCHAR(255) NULL,
ADD COLUMN name_vi VARCHAR(255) NULL;
Loading