오늘의 집을 클론 코딩을 하기로 했는데 주어진 시간이 짧기에 다 만들 수는 없고 스코프를 줄여서 만들기로 했다. 이때 내가 담당하게 된 부분은 이미지와 글 그리고 상품 정보가 있는 페이지이다. 같은 상품 정보가 각 글마다 들어갈 수도 있어서 글이랑 상품 정보를 같이 저장하면서 유저에 대한 정보도 필요하기에 하나하나의 데이터가 너무 커질 것 같았기에 먼저 관계형 DB를 선택하고 ERD를 만들었다.
내가 가장 먼저 하게된 일은 DetailPages에서 정보를 가져오면서 그 글에 있는 상품태그에 상품에 브랜드명, 상품명, 이미지, 가격을 가져오는 것이다. 그리고 그 글의 사진에 태그 된 상품의 좌표값과 유저의 프로필사진, 닉네임, 가입날짜까지 가져와야 했는데 이를 관리하기 위해서 위와 같이 WritePacks를 만들어서 각 글마다 상품의 정보를 가져오기 위한 상품의 ID값과 좌표를 같이 저장했다.
- DetailPages에서 가져올 수 있는 필요한 데이터를 찾는다.
- degailsId를 이용해 WritePacks에서 itemId와 좌푯값을 가져온다.
- itemId를 이용해서 상품 정보를 찾는다.
- 구조분해 할당을 활용 깊이를 줄인다
레이어드 아키텍쳐를 적용한 코드의 일부이다.
// detail.repository.js
// itemId 구하기
findItemId = async (detailsId) => {
const itemId = await WritePacks.findAll({
attributes: ['itemId'],
where: { detailsId },
});
const itemIds = itemId.map((item) => {
const Id = item.itemId;
return Id;
});
return itemIds;
};
// Details, Items
findOneDetail = async (detailsId, itemIds) => {
//? 가져오려는 집사진 정보
const details = await DetailPages.findOne({
where: { detailsId },
attributes: ['detailsId', 'userId', 'content', 'imgUrl', 'createdAt', 'updatedAt'],
group: ['detailsId'],
});
//? itemIds 없는 경우
if (itemIds.length < 1) {
return [details]
}
//? Items 좌표값이 필요하기에 여기에 Join
const itemsData = await ItemPages.findAll({
where: {
itemId: {
[Op.or]: itemIds,
},
},
attributes: ['itemId', 'brandName', 'itemName', 'price'],
group: ['itemId'],
raw: true,
include: [
{
model: WritePacks,
where: { detailsId },
attributes: ["coordinateX", "coordinateY"],
},
{
model: ItemImgLists,
attributes: ["itemImg"],
}
],
});
return [details, itemsData];
};
// 작성자 정보
findUserData = async (userId) => {
const userData = await Users.findOne({
where: { userId },
attributes: ['nickname', 'profileImgUrl', 'createdAt']
})
return userData
}
출력 결과
이렇게 출력이 잘 되는 것을 볼 수 있다. 하지만 이렇게 만드는 과정에서 데이터 관계에 대해서 다시 정리할 수 있었고 계층형 구조를 이용해 만들었기에 그 부분도 한 번 더 복기하게 되었다.
'오늘 뭐했냐 > 함께했던 작업들' 카테고리의 다른 글
23.08.05 끝 없는 기획 (0) | 2023.08.10 |
---|---|
23.07.24 클론 코딩(오늘의집) - 트랜잭션(Transaction) 적용 (0) | 2023.07.26 |
23.07.21 협업과 소통 (0) | 2023.07.22 |
23.07.17 HTTPS로 변경하기 (0) | 2023.07.18 |
23.07.15 CICD 구축하기 2 (0) | 2023.07.16 |