TIL/Project

TIL 2024-12-05 (outsourcing 2일차)

myoma 2024. 12. 5. 21:20

1) 프로젝트 진행도

  • 가게 CRUD 구현
    • 가게 생성
    • 가게 수정
    • 가게 단건 조회(메뉴 같이 조회)
    • 가게 이름 검색(이름으로 검색히 연관된 가게 다 조회)
    • 가게 페업
  • 메뉴 CRUD 구현
    • 메뉴 생성 (1일차)
    • 메뉴 삭제
    • 메뉴 수정 (2일차)
  • 장바구니 (쿠키 활용)
    • 한 번에 주문

 


  • 가게 단건 조회 (@Service)
 public StoreMenuResponseDto findStore(Long storeId, User loginUser) {
        // 가게 Id 확인
        Store findStore = storeRepository.findByStoreOrElseThrow(storeId);

        if(findStore.getStatus() == StoreStatus.CLOSURE){
            if(loginUser.getAuthority() != Authority.OWNER || !findStore.getUser().getId().equals(loginUser.getId())) {
                throw new CustomException(ErrorCode.STORE_NOT_FOUND);
            }
        }

        // 엔티티 -> Dto 변환
        List<MenuResponseDto> menuDtos = new ArrayList<>();
        for (Menu menu : findStore.getMenus()) {
            if (menu.getStatus() != MenuStatus.DELETED) {
                menuDtos.add(new MenuResponseDto(
                        menu.getId(),
                        menu.getMenuName(),
                        menu.getPrice(),
                        menu.getStatus()
                ));
            }
        }

        return StoreMenuResponseDto.fromStoreMenu(findStore, menuDtos);
    }
  • 가게를 단건 조회 할 시 삭제된 메뉴는 같이 보이면 안되기 때문에 if문을 넣어주어 조건을 추가했다.
  • enum으로 되어있는 Status가 DELETED라면 아닐 때만 메뉴가 보이게 했다.
  • 또한 가게가 ClOSURE 라면 가게 주인인 사람은 보이게 조건을 넣어주었다.

 

 

  • 가게 폐업(@Service)
@Transactional
    public void closeStore(Long storeId, Long userId) {
        //가게 조회
        Store findStore = storeRepository.findByStoreOrElseThrow(storeId);

        //사용자 검증
        if(!findStore.getUser().getId().equals(userId)){
            throw new CustomException(ErrorCode.FORBIDDEN_PERMISSION);
        }

        // 상태 토글
        if (findStore.getStatus() == StoreStatus.OPEN) {
            findStore.setStatus(StoreStatus.CLOSURE);
        } else {
            findStore.setStatus(StoreStatus.OPEN);
        }

    }
  • 가게 폐업을 하려면 일단 입력한 가게가 있는지 확인하고 그 가게가 본인의 가게인지도 확인해야한다.
  • 로그인한 Session을 이용해서 login 유저의 getId()로 id를 가져오고 그 아이디를 넣어주어 조회한 가게의 UserId 와 로그인한 UserId가 같은 지 검증을 한다.
  • 그리고 가계 폐업은 softdelete이기 때문에 상태를 변화시켜주고 조회에서 할 때 걸러주면된다.
  • 가게 주인은 혹시 가게를 다시 개장할 수 있을 가능성을 고려해 토글형식으로 만들었다.
  • 원래 코드에 if-else를 쓰면 좋지 않으나 토글 방식은 아직 else를 안 쓰고 하는 방식을 고려하지 못했다.

 

 

  • 메뉴 수정은 전 날 작성한 가게 수정과 거의 흡사하기에 설명 생략.

 

 

  • 메뉴 삭제
@Transactional
    public void deleteMenu(Long storeId, Long menuId, Long userId) {
        //가게 조회
        Store findStore = storeRepository.findByStoreOrElseThrow(storeId);

        //사용자 검증
        if(!findStore.getUser().getId().equals(userId)){
            throw new CustomException(ErrorCode.FORBIDDEN_OWNER);
        }

        //메뉴 조회
        Menu findMenu = menuRepository.findByMenuOrElseThrow(menuId);

        //상태 토글
        if(findMenu.getStatus() == MenuStatus.SELLING) {
            findMenu.setStatus(MenuStatus.DELETED);
        } else {
            findMenu.setStatus(MenuStatus.SELLING);
        }
    }
  • 역시 메뉴 삭제 또한 가게 주인이 추가한 메뉴만 삭제할 수 있기에 가게 조회 및 사용자 검증을 하였다.
  • 메뉴를 조회하여 삭제할 메뉴가 있는지 확인하고 메뉴 또한 softdelete이기에 토글로 상태만 변화시켜주었다.

 

 

  • 남은 파트는 Cookie를 활용한 장바구니 기능인데 Cookie를 많이 접해보지 않아 이번 기회에 제대로 알아가야겠다.