TIL/Project

TIL 2024-12-04 (outsourcing 1일차)

myoma 2024. 12. 4. 22:21

1) 프로젝트 진행도

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

 

모든 예외처리는 임시로 NOT_FOUND_USER로만 해놓은 겁니다.


  • 가게 생성
    • 가게는 오픈 및 마감 시간이 있습니다.
    • 가게는 최소 주문 금액이 있습니다.
    • 사장님은 최대 3개의 가게만 소지 가능.
        //권한 검증
        if(!loginUser.getAuthority().equals(Authority.OWNER)) {
            throw new CustomException(ErrorCode.NOT_FOUND_USER);
        }

        //가게 수 확인
        long activeStoreCount = storeRepository.countByUserAndStatusNot(loginUser, StoreStatus.CLOSURE);
        if(activeStoreCount >= 3) {
            throw new CustomException(ErrorCode.NOT_FOUND_USER);
        }

        //오픈 시간, 마감 시간
        if(requestDto.getOpenTime().isAfter(requestDto.getCloseTime())) {
            throw new CustomException(ErrorCode.NOT_FOUND_USER);
        }
  • 오픈 및 마감 시간은 LocalTime으로 타입을 잡아주어 날짜 상관없이 시간만 입력하게 했으며 오픈 시간이 더 느리면 예외처리 되도록 코드를 작성하였다.
  • 가게 수는 CLOSURE 폐업인 것을 제외하고 3개 이상이면 예외처리가 발생하게 코딩을 하였다.
  • 권한 인증은 로그인한 유저의 enum으로 되어있는 Authority를 확인하여 OWNER와 같으면 가게를 생성할 수 있게 권한 설정을 했다.

 

 

  • 가게 수정
    • 본인 가게만 수정 가능하다.
    • 가게 이름, 최소주문가격, 오픈시간, 클로즈시간을 수정할 수 있다.
        //가게 ID 확인
        if(findStore.getId() == null) {
            throw new CustomException(ErrorCode.NOT_FOUND_STORE);
        }
        
        //본인의 가게 검증
        if(!findStore.getUser().getId().equals(loginUserId)) {
            throw new CustomException(ErrorCode.NOT_FOUND_USER);
        }

        if(name == null || minimumAmount == null || openTime == null || closeTime == null) {
            throw new CustomException(ErrorCode.NOT_FOUND_USER);
        }
  • 맨 처음 수정할 가게가 있는지 확인을 하고 다음으로 본인의 가게가 맞는지 검증을 실시한다.
  • 그 뒤로 수정할 때 null 값을 못넣게 조건을 달아주었다.

 

 

  • 가게 이름 검색
    • 이름으로 검색할 시 연관된 모든 가게가 조회되도록 해야한다.
    • ex)) 스타벅스 = 스타벅스 강남점, 스타벅스 건대점, 스타벅스 홍대점
    @Query("SELECT new com.example.outsourcing.store.dto.StoreResponseDto( " +
            "s.id, s.name, s.minimumAmount, s.openTime, s.closeTime, s.status) " +
            "FROM store s " +
            "WHERE LOWER(s.name) LIKE LOWER(CONCAT('%', :name, '%'))")
    List<StoreResponseDto> findByNameContainingIgnoreCase(@Param("name") String name);
  • 서비스와 컨트롤러에선 그저 호출만 해주었기에 JPQL만 보면 된다.
  • LOWER은 대소문자 구분없이 검색을 도와준다.
  • SELETE 부분은 내가 조회하고자 하는 모든 데이터를 넣어주면 된다.

 

 

  • 메뉴 생성
    • 메뉴 생성은 사장님만 할 수 있습니다.
    • 사장님은 본인 가게에만 메뉴를 등록할 수 있습니다.
        //가게 조회
        Store store = storeRepository.findByOrElseThrow(storeId);
        //사장님 권한 확인
        if(!store.getUser().getId().equals(userid)) {
            throw new CustomException(ErrorCode.NOT_FOUND_USER);
        }

        Menu menu = new Menu(
                store,
                requestDto.getMenuName(),
                requestDto.getPrice(),
                MenuStatus.SELLING
        );
  • !store.getUser().getId().equals(userId)는 가게 주인의 아이디와 로그인한 유저의 아이디가 같은지 확인하여 검증을 하였다.