이번에는 더미데이터와 

더미데이터를 추가해서 실제로 데이터를 넘기는 과정을 진행함

 

더미 데이터 생성 때 참조키나 왜래키가 너무 많아서 작성하는데 좀 애를 먹음

 

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

+ Recent posts