지난번 팀프로젝트에서 구현한 메뉴를 원하는 카테고리 순서로 조회하는 부분에서의 피드백을 받았다. 기존 코드는 숫자로 저장하여 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]는 a와 b의 menuType을 기준으로 비교하여 정렬 순서를 결정한다. 반환 값이 음수면 a가 b보다 앞에 오도록 정렬되고, 양수면 b가 a보다 앞에 오도록 정렬한다.
- 정렬된 formattedMenus 배열을 반환하여 함수의 실행 결과로 반환된다.
// 반환용 메서드
formatMenuForOutput(menu) {
return {
menuId: menu.menuId,
menuName: menu.menuName,
menuPrice: menu.menuPrice,
menuType: menu.menuType,
.
.
.
};
}
- formatMenuForOutput 함수는 주어진 메뉴 객체(menu)를 필요한 형태로 변환하여 반환하는 함수
- 여기서는 메뉴 객체의 menuId, menuName, menuPrice, menuType 속성들을 포함하여 반환
- menuType은 이미 데이터베이스에서 문자열로 저장되어 있으며, 이 값을 그대로 사용하여 반환한다.
텍스트로 저장했기에 sort로 정렬을 진행하며, 각 카테고리에 숫자를 지정해 오름차순해주는 방법을 이용했다. 같은 방식인데 저장된 데이터의 형식에 따라 조금씩 코드가 달라지는것에서 재미를 느꼈다.
'개발 기초 다지기' 카테고리의 다른 글
알고리즘 문제 정리(명예의 전당1, 2016년, 카드뭉치, 과일 장수) (1) | 2024.07.01 |
---|---|
호이스팅과 클로져 (0) | 2024.06.27 |
복습 그동안 소소하게 궁금했던것들 정리 (스키마 관계 설정, 모듈 export default) (0) | 2024.06.25 |
npm 글로벌 설치 오류 (0) | 2024.06.24 |
Prisma의 connect 기능 (0) | 2024.06.21 |
댓글