JPA 사용한 카테고리 구현 (infinite depth) - 03

Joshua_Kim·2021년 7월 26일
2
post-thumbnail

"민재씨 무한뎁스로 카테고리 로직 구현해봐요"

입사 후 공부하며 기술 스텍을 쌓던 내게 던져진 첫 실무 과제.

stack : Springboot 2.3.6 RELEASE, gradle, JPA, mysql ...


👉🏻 JPA 사용한 카테 고리 구현 1편 (요구조건, Entity, Repository) (링크 click)
👉🏻 JPA 사용한 카테 고리 구현 2편 (DTO, Service - save) (링크 click)

저번시간에 이어 이번에는 Service 계층의 get메서드와 update, delete 메소드를 구현해보자.

4-2. Service - getCategoryByBranch 구현

  • 요구 스펙
    • branch 로 검색했을 때, 가장 최상단 경로부터 가장 하위까지 조회되도록하기
    • Map 의 형태로 json 화 하여 return 해줄것
  • 🛠 Code
    public Map <String, CategoryDTO> getCategoryByBranch (String branch) {
        Category category = categoryRepository.findByBranchAndCode(branch, "ROOT")
                .orElseThrow(() -> new IllegalArgumentException("찾는 대분류가 없습니다"));

        CategoryDTO categoryDTO = new CategoryDTO(category);

        Map <String, CategoryDTO> data = new HashMap<>();
        data.put(categoryDTO.getName(), categoryDTO);

        return data;
    }

🗝 key points

  1. 대분류를 return 하여 하위 모든 카테고리를 가져오도록 디자인.

    • categoryRepository.finByBranchAndCode()의 파라미터로 "ROOT" 조회
  2. Map객체를 생성하여 넣어준 뒤 return하면 끝 ! 😁

  3. Refactor 과정 통해 return 스펙을 조금 변화 시켜 줄 예정이다.

4-3 deleteCategory 구현

  • 요구 스펙

    • 하위 카테고리가 없을 경우 repository에서도 삭제
    • 하위 카테고리가 있을 경우에는 name"Deleted category" 로 변경만 할것
  • 🛠 Code

public void deleteCategory (Long categoryId) {
        Category category = findCategory(categoryId);
      
        if (category.getSubCategory().size() == 0) { //하위 카테고리 없을 경우
            Category parentCategory = findCategory(category.getParentCategory().getId());
            if (!parentCategory.getName().equals("ROOT")) { // ROOT가 아닌 다른 부모가 있을 경우
                parentCategory.getSubCategory().remove(category);
            }
            categoryRepository.deleteById(category.getId());
        } else { //하위 카테고리 있을 경우
            Category parentCategory = findCategory(category.getParentCategory().getId());
            //ROOT아닌 부모가 있을 경우
            if (!parentCategory.getName().equals("ROOT")) {
                parentCategory.getSubCategory().remove(category);
            }
            category.setName("Deleted category");
        }

🗝 key points

  1. 요구 스펙에 따라 하위 카테고리의 여부를 검색하여 분기 처리
  • 혹시 요구 사항이 달라질 경우에 대비하여 분기처리를 일일히 해주었다.
    • 예를 든다면 하위카테고리가 있을 경우에도 삭제를 그냥 시켜달라거나... 이런것들?
  1. ROOT의 경우를 검색하여 최상단 카테고리 인지도 검사를 해주었다.

4-4 updateCategory 구현

  • 요구스펙
    • update 요구사항은 간단했다. 우선은 name만 변경하도록 !
  • 🛠 Code
public Long updateCategory (Long categoryId, CategoryDTO categoryDTO) {
        Category category = findCategory(categoryId);

        category.setName(categoryDTO.getName());

        return category.getId();
    }

🗝 key points

  • 없다. 너무나 민망할정도로 간단한 로직이다.
  • 아, findCategory(categoryId)는 하도 카테고리를 찾아오는 경우가 많아서 메소드로 하나 빼놓았다.

✍🏻 Service 로직을 완성했다.

  • 아마 뒤에서 refactor 할게 많을 것 같다.
  • 로직 짜면서 가장 머리를 많이 쓴 건 아무래도 save 부분과 map에 담아 넘긴 get부분이었다.
  • 다음 포스팅에서는 이제 business 로직을 테스트하는 테스트 코드를 짜보도록 하겠다.
profile
인문학 하는 개발자 💻

1개의 댓글

comment-user-thumbnail
2022년 1월 20일

포스팅 잘 보고 있습니다~
공부하다보니 [4-2] 에서 repository findByBranchAndCode -> findByBranchAndName 이 맞는 것 같아서 알려드립니다!

답글 달기