본문 바로가기
개발 기초 다지기

과제 리팩토링 (메뉴 원하는 카테고리 순서로 정렬)

by 너의고래 2024. 6. 26.
반응형

지난번 팀프로젝트에서 구현한 메뉴를 원하는 카테고리 순서로 조회하는 부분에서의 피드백을 받았다. 기존 코드는 숫자로 저장하여 order by를 통해 정렬한 후, 각 카테고리 텍스트를 매핑해주었는데 데이터베이스 자체에 메뉴의 카테고리 텍스트로 저장하는 것이 좋다는 피드백을 받은 것이다. 그래서 텍스트로 저장한 후, sort를 통해 정렬해서 내보내도록 리팩토링을 진행하였다.

 

- 데이터베이스에서 불러오기 (텍스트로 저장된 menuType)

async function readAll(restaurantId) {
  try {
    // 데이터베이스에서 메뉴를 읽어올 때 메뉴타입 순으로 정렬하여 가져오기
    const menus = await prisma.menu.findMany({
      where: { restaurantId: +restaurantId },
      orderBy: {
        menuPrice: 'asc', // 가격 오름차순으로 정렬 
      },
    });

 

  • prisma.menu.findMany 함수를 사용하여 restaurantId에 해당하는 모든 메뉴를 가져온다.
  • orderBy를 이용하여 menuPrice를 기준으로 가격을 오름차순으로 정렬한다. 
    -> 기존에는 숫자로 저장했기에 여기서 바로 카테고리별로 정렬을 해주었다. 
    -> 현재는 텍스트가 들어가있기 때문에 추후 변환과정이 필요하다.

 

- 메뉴타입 변환 및 순서대로 정렬


    // 메뉴 타입 변환 및 필요한 속성만 포함하여 반환
    const formattedMenus = menus.map((menu) => this.formatMenuForOutput(menu));

    // 메뉴 타입 순서대로 정렬하기
    formattedMenus.sort((a, b) => {
      const menuOrder = {
        '메인': 1,
        '사이드': 2,
        '음료': 3,
      };
      
      return menuOrder[a.menuType] - menuOrder[b.menuType];
    });

    return formattedMenus;
  } catch (error) {
    console.error('Error fetching and sorting menus:', error);
    throw error;
  }
}
  • map 함수를 사용하여 각 메뉴 객체를 formatMenuForOutput 함수를 통해 원하는 형태로 변환한다. 이 함수는 메뉴 객체의 필요한 속성들을 선택하여 반환한다.
  • sort 함수를 사용하여 formattedMenus 배열을 정렬한다. menuType을 기준으로 정렬하며, menuOrder 객체를 사용하여 원하는 메뉴 타입의 순서를 정의한다.
  • menuOrder[a.menuType] - menuOrder[b.menuType]abmenuType을 기준으로 비교하여 정렬 순서를 결정한다. 반환 값이 음수면 ab보다 앞에 오도록 정렬되고, 양수면 ba보다 앞에 오도록 정렬한다.
  • 정렬된 formattedMenus 배열을 반환하여 함수의 실행 결과로 반환된다.

 


// 반환용 메서드
formatMenuForOutput(menu) {
  return {
    menuId: menu.menuId,
    menuName: menu.menuName,
    menuPrice: menu.menuPrice,
    menuType: menu.menuType, 
    .
    .
    .
    
  };
}
  • formatMenuForOutput 함수는 주어진 메뉴 객체(menu)를 필요한 형태로 변환하여 반환하는 함수
  • 여기서는 메뉴 객체의 menuId, menuName, menuPrice, menuType 속성들을 포함하여 반환
  • menuType 이미 데이터베이스에서 문자열로 저장되어 있으며, 값을 그대로 사용하여 반환한다.

 

텍스트로 저장했기에 sort로 정렬을 진행하며, 각 카테고리에 숫자를 지정해 오름차순해주는 방법을 이용했다. 같은 방식인데 저장된 데이터의 형식에 따라 조금씩 코드가 달라지는것에서 재미를 느꼈다.

반응형

댓글