마이페이지 부분을 구현하며 sequelize 중첩 조인에 대해 머리가 아팠다.
내가 구매 등록한 물품에 대한 정보를 전달해야했는데 여기서 아래와 같이 중첩 조인을 사용했다.
const user = await User.findOne({
where: { user_id: userId },
attributes: ['email', 'nickname'],
include: [
{
model: Order,
attributes: ['product_key', 'quantity'],
include: [
{
model: Product,
},
],
},
],
});
조인 과정
1. 기본 모델 : User
먼저 User 테이블에서 세션에 담긴 user_id를 기준으로 개인의 고유 정보를 가져왔다.
이때 필요한 것은 email과 nickname 필드였다.
2. 첫 번째 include : Order
그 다음 해당 user의 구매 정보를 알아내기 위해 User와 관련된 Order 테이블의 데이터를 가져왔다.
여기서 필요한 것은 product_key와 quantity 필드였다.
3. 두 번째 include : Product
마지막으로 Order의 정보를 통해 물품 세부 정보를 가져오기 위해 Product를 조인했다. 여기서는 모든 정보를 프론트에게 넘겨주었다.
postman으로 확인해본 결과, 아래와 같이 결과가 잘 나오는 것을 확인했다.
{
"isSuccess": true,
"user": {
"email": "so@naver.com",
"nickname": "so",
"Order_items": [
{
"product_key": 77,
"quantity": 1,
"product": {
"product_key": 77,
"name": "에어팟 맥스(미드나이트)",
"deadline": "2025-01-31T10:00:00.000Z",
"price": 500000,
"max_quantity": 100,
"image": "áá
¦áá
¥áá
¡áºáá
¢á¨áá
³1735521549641.jpg",
"category_id": 2,
"user_id": 63,
"net_price": 769000
}
},
{
"product_key": 92,
"quantity": 1,
"product": {
"product_key": 92,
"name": "iPad Pro",
"deadline": "2025-01-09T10:44:00.000Z",
"price": 1490000,
"max_quantity": 1000,
"image": "ipad-pro-model-select-gallery-1-2024051735523054194.webp",
"category_id": 2,
"user_id": 72,
"net_price": 1500000
}
}
]
}
}
중첩 조인을 통해 테이블 간의 관계 설계가 매우 중요하다는 것을 깨달았다. 그리고 서버에서는 프론트가 필요한 데이터만을 정확하게 가공해서 전달하는 것이 베스트라는 것을 느꼈다. 그래야 클라이언트와의 협업도 수월해지고, API 응답 속도가 빨라진다고 한다...!
'🙋♀️ Server' 카테고리의 다른 글
| [Server] Spring 패키지 구조, 각각의 기능 (0) | 2025.01.21 |
|---|---|
| [Server] Node.js + MySQL로 찜 기능 만들기 (0) | 2024.12.28 |
| [Server] Database 설계 & SQL 1452 문제 해결 (2) | 2024.12.17 |
| [Web] MySQL + Node.js로 MVC 패턴 적용 (2) | 2024.12.03 |
| [Server] 임시 DB로 Node.js에서 MVC 패턴 연습하기 (0) | 2024.12.01 |