이번에는 더미데이터와
더미데이터를 추가해서 실제로 데이터를 넘기는 과정을 진행함
더미 데이터 생성 때 참조키나 왜래키가 너무 많아서 작성하는데 좀 애를 먹음
main 에서 값 불러오는 작업은 잘 진행이 됐고
main에서 메뉴를 클릭했을 때 info에 정보를 띄워주는 것도 완료를 함
비동기 일 때 json 때문에 DTO추가해서 작업함
MenuDTO - 참조하던 클래스를 제외한 속성을 가짐
package kr.ganjuproject.dto;
import lombok.Data;
@Data
public class MenuDTO {
private Long id;
private String name;
private Integer price;
private String menuImage;
private String info;
// 메뉴가 속한 카테고리의 ID. 필요에 따라 카테고리 이름 등 추가 정보 포함 가능
private Long categoryId;
}
CategoryDTO - 마찬가지로 category 엔티티에 있는 클래스를 제외한 값들을 가짐
package kr.ganjuproject.dto;
import lombok.Data;
@Data
public class CategoryDTO {
private Long id;
private String name;
// 카테고리의 순서. 필요에 따라 추가적인 정보 포함 가능
private Integer turn;
}
BoardDTO - 위랑 마찬가지
package kr.ganjuproject.dto;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class BoardDTO {
private Long id;
private String name;
private String title;
private String content;
private LocalDateTime regDate;
private String boardCategory; // Enum 타입을 String으로 변환
}
ReviewDTO - 마찬가지
package kr.ganjuproject.dto;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ReviewDTO {
private Long id;
private String name;
private String content;
private Integer star;
private LocalDateTime regDate;
private int secret;
}
해당 DTO 들은 레파지토리에서 서비스로 넘어올 때 DTO로 변환
MenuService
package kr.ganjuproject.service;
import kr.ganjuproject.dto.MenuDTO;
import kr.ganjuproject.entity.Menu;
import kr.ganjuproject.repository.MenuRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MenuService {
private final MenuRepository menuRepository;
// 레스토랑 id 값으로 메뉴 전체 불러오기
public List<MenuDTO> findMenusByRestaurantId(Long restaurantId) {
// 리포지토리에서 메뉴 엔티티 리스트 조회
List<Menu> menus = menuRepository.findByRestaurantId(restaurantId);
// Menu 엔티티 리스트를 MenuDTO 리스트로 변환
return menus.stream().map(menu -> {
MenuDTO dto = new MenuDTO();
dto.setId(menu.getId());
dto.setName(menu.getName());
dto.setInfo(menu.getInfo());
dto.setPrice(menu.getPrice());
dto.setMenuImage(menu.getMenuImage());
dto.setCategoryId(menu.getCategory().getId());
return dto;
}).collect(Collectors.toList());
}
// 여기도 마찬가지로 DTO 말고 Menu 값 보내는거
public List<Menu> findByRestaurantId(Long restaurantId) {
// 리포지토리에서 메뉴 엔티티 리스트 조회
List<Menu> menus = menuRepository.findByRestaurantId(restaurantId);
// Menu 엔티티 리스트를 MenuDTO 리스트로 변환
return menus;
}
public Optional<Menu> findById(Long id){
return menuRepository.findById(id);
}
@Transactional
public void delete(Long id) {
menuRepository.deleteById(id);
}
@Transactional
public void add(Menu menu) {
menuRepository.save(menu);
}
}
다른 Service는 귀찮으니 패스
레파지토리에서 바뀐점은 이제 식당이 여러개니 RestaurantId 값으로 가져옴
MenuController 도 조금 바뀜
package kr.ganjuproject.controller;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import kr.ganjuproject.dto.CategoryDTO;
import kr.ganjuproject.dto.MenuDTO;
import kr.ganjuproject.entity.Category;
import kr.ganjuproject.entity.Menu;
import kr.ganjuproject.entity.MenuOption;
import kr.ganjuproject.entity.MenuOptionValue;
import kr.ganjuproject.service.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@Controller
@Slf4j
@RequestMapping("/menu")
@RequiredArgsConstructor
public class MenuController {
private final MenuService menuService;
private final MenuOptionService menuOptionService;
private final MenuOptionValueService menuOptionValueService;
private final CategoryService categoryService;
private final ReviewService reviewService;
// 메인 메뉴 첫 페이지
@GetMapping("/main")
public String main(Model model) {
List<CategoryDTO> categories = categoryService.findCategoriesByRestaurantId(1L);
model.addAttribute("categories", categories);
List<MenuDTO> menus = menuService.findMenusByRestaurantId(1L);
model.addAttribute("menus", menus);
// 리뷰 평균 점수
model.addAttribute("staAve", reviewService.getAverageRating(1L));
return "user/main";
}
// 비동기 메인 메뉴 데이터
@GetMapping("/validateMenuMenu")
@ResponseBody
public ResponseEntity<Map<String, Object>> validateMenu(Model model) {
System.out.println("비동기 메뉴");
Map<String, Object> response = new HashMap<>();
List<CategoryDTO> categories = categoryService.findCategoriesByRestaurantId(1L);
List<MenuDTO> menus = menuService.findMenusByRestaurantId(1L);
response.put("categories", categories);
response.put("menus", menus);
return ResponseEntity.ok(response);
}
// 메뉴를 선택 했을 때 보여주는 창
@GetMapping("/info")
public String info(@RequestParam Long id, Model model) {
Optional<Menu> menu = menuService.findById(id);
// 일단 메뉴 id 값으로 메뉴 옵션을 불러오고
List<MenuOption> menuOptions = menuOptionService.findByMenuId(menu.get().getId());
Map<String, Object> menuOptionValueMap = new HashMap<>();
// 메뉴 옵션이 없는 경우도 있으니 확인하고 비어 있지 않으면
if(!menuOptions.isEmpty()){
model.addAttribute("menuOptions", menuOptions);
for(int i=0 ; i<menuOptions.size() ; i++){
List<MenuOptionValue> menuOptionValues = menuOptionValueService.findByMenuOptionId(menuOptions.get(i).getId());
menuOptionValueMap.put(menuOptions.get(i).getId().toString() , menuOptionValues);
}
}
if (menu.isPresent()) {
Menu m = menu.get();
model.addAttribute("menu", m);
if(!menuOptionValueMap.isEmpty()){
model.addAttribute("menuOptionValues", menuOptionValueMap);
}
return "user/info";
} else {
return "redirect:/user/main";
}
}
@PostMapping("/info")
public String info() {
return "user/cart";
}
@PostMapping("/cart")
public String cart() {
return "user/order";
}
@PostMapping("/order")
public String order() {
return "user/order";
}
@GetMapping("/review")
public String review() {
return "user/review";
}
@PostMapping("/review")
public String review(Model model) {
return "redirect:/user/main";
}
@GetMapping("/add")
public String addMenuForm(Model model) {
List<CategoryDTO> categories = categoryService.findCategoriesByRestaurantId(1L);
model.addAttribute("categories", categories);
List<MenuDTO> menus = menuService.findMenusByRestaurantId(1L);
model.addAttribute("menus", menus);
return "manager/addMenu";
}
@PostMapping(value = "/add")
public ResponseEntity<String> addMenu(@RequestBody String menu) {
try {
System.out.println("menu = " + menu);
ObjectMapper mapper = new ObjectMapper();
Map<String, String> input = mapper.readValue(menu, new
TypeReference<Map<String, String>>() {
});
Menu obj = new Menu();
obj.setName(input.get("name"));
obj.setPrice(Integer.parseInt(input.get("price")));
Category test = categoryService.findByRestaurantId(1L).get(0);
obj.setCategory(test);
System.out.println("obj = " + obj);
menuService.add(obj);
return ResponseEntity.ok().body("메뉴가 성공적으로 등록되었습니다.");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("메뉴 등록에 실패하였습니다.");
}
}
@DeleteMapping("/{id}")
public ResponseEntity<String> deleteMenu(@PathVariable Long id) {
try {
menuService.delete(id);
return ResponseEntity.ok().body("메뉴(ID : " + id + ")가 삭제되었습니다");
} catch (NoSuchElementException e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("ID에 해당하는 메뉴를 찾을 수 없습니다");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("메뉴 삭제 중 오류가 발생했습니다 : " + e.getMessage());
}
}
}
info는 작업 중이니 내일 마무리
'공부 > Ganju' 카테고리의 다른 글
| [Spring/AWS] 팀프로젝트 12일차 (0) | 2024.04.16 |
|---|---|
| [Spring/AWS] 팀프로젝트 11일차 (0) | 2024.04.16 |
| [Spring/AWS] 팀프로젝트 9일차 (0) | 2024.04.08 |
| [Spring/AWS] 팀프로젝트 8일차 (0) | 2024.04.06 |
| [Spring/AWS] 팀프로젝트 7일차 (0) | 2024.04.04 |
