Skip to content

TunaForce4/tf4-product

Repository files navigation

Product-Service

5. 라이브러리 사용 이유

  • Querydsl
    • JPQL의 컴파일 시점 오류 확인 불가
    • 쿼리 가독성과 타입 안정성을 보장하여 유지보수 용이

7. 브랜치 및 디렉토리 구조

디렉토리 구조

directory_structure_product

8. 주요 기능

기능 메서드 엔드포인트 Query Params status
상품 생성 POST /products 201
상품 단건 조회 GET /products/{productId} 200
상품 전체 목록 조회 (페이지네이션) GET /products page, size, sort, productName 200
허브 등록 상품 목록 조회 (페이지네이션) GET /products/hubs/{hubId} page, size, sort, productName 200
업체 등록 상품 목록 조회 (페이지네이션) GET /products/companies/{companyId} page, size, sort, productName 200
상품 수정 PATCH /products 204
상품 삭제 DELETE /products 200

9. 상세 담당 업무

Product

  • 유저 권한별 각 기능 유효성 검증

    상품 생성

    상품_생성

    상품 단건 조회

    상품_단건_조회

    허브 등록 상품 목록 조회

    허브_등록_상품_목록_조회

    업체 등록 상품 목록 조회

    업체_등록_상품_목록_조회

    상품 수정

    상품_수정

    상품 삭제

    상품_삭제

  • DTO의 record 타입 사용

    • 클라이언트의 요청에 대한 불변성과 안정성을 명시
  • Pageablesort 쿼리 - 정렬 조건 타입 안정화

    • 정해진 정렬 조건만 허용 - 예기치 못한 쿼리 또는 에러 발생 방지
    • SortType ENUM
      @Getter
      @RequiredArgsConstructor
      public enum SortType {
      
          CREATED_ASC("createdAt", Sort.Direction.ASC),
          CREATED_DESC("createdAt", Sort.Direction.DESC),
          UPDATED_ASC("updatedAt", Sort.Direction.ASC),
          UPDATED_DESC("updatedAt", Sort.Direction.DESC),
          PRICE_ASC("orderPrice", Sort.Direction.ASC),
          PRICE_DESC("orderPrice", Sort.Direction.DESC),
          ;
      
          private final String value;
          private final Sort.Direction direction;
      
          public static void validate(Sort sort) {
              for (Sort.Order order : sort) {
                  boolean valid = Arrays.stream(SortType.values())
                          .anyMatch(sortType -> sortType.value.equalsIgnoreCase(order.getProperty()) &&
                                  sortType.getDirection().equals(order.getDirection()));
      
                  if (!valid) {
                      throw new CustomRuntimeException(ProductException.UNSUPPORTED_SORT_TYPE);
                  }
              }
          }
      }
      
  • QuerydslgetOrderSpecifier()을 통한 동적 정렬 조건 쿼리 구현

    • 클라이언트가 여러 개의 sort 쿼리를 넘길 수 있도록 하여 .orderBy()에 적용
      private OrderSpecifier<?>[] getOrderSpecifiers(Sort sort) {
        List<OrderSpecifier<?>> orderSpecifiers = new ArrayList<>();
      
        for (Sort.Order sortOrder : sort) {
            Order order = sortOrder.isAscending() ? Order.ASC : Order.DESC; // 정렬 방향 
            PathBuilder<Product> pathBuilder
                    = new PathBuilder<>(product.getType(), product.getMetadata());
      
            orderSpecifiers.add(new OrderSpecifier<>(order, pathBuilder.getString(sortOrder.getProperty())));
        }
      
        return orderSpecifiers.toArray(new OrderSpecifier[0]);
      }
      

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages