Encapsulation 캡슐화 - 서로 관련있는 함수와 데이터를 한곳에 담아 외부와 상관이 없게
-> 내부의 상태를 외부에서 직접 변경 안됨
Abstraction 추상화 - 내부구조를 다 이해하지 않아도 외부에서 사용가능
Inheritance 상속 - 한번 잘 정의한 클래스를 잘 재사용하는것.
Polymorphism 다양성 - 공통적으로 함수를 호출?
-> 커피기계종류를 상관 않고 커피를 내리는것?
Encapsulation 캡슐화 - 서로 관련있는 함수와 데이터를 한곳에 담아 외부와 상관이 없게
-> 내부의 상태를 외부에서 직접 변경 안됨
Abstraction 추상화 - 내부구조를 다 이해하지 않아도 외부에서 사용가능
Inheritance 상속 - 한번 잘 정의한 클래스를 잘 재사용하는것.
Polymorphism 다양성 - 공통적으로 함수를 호출?
-> 커피기계종류를 상관 않고 커피를 내리는것?
await this.goodsModel.update(
{stock: sequelize.literal(`stock - ${findCart[0].quanitity}`)},
{where: {id: findCart[0].goodsId}, transaction: t}
)
stock에 업데이트되어야 하는 값이 stock - 카트에 담김 총합 이 되어야 한다.
쿼리 문자열을 추가해 주는 기능이라는데 더 다양한 방법으로 사용되고 코드를 단축시킬 수 있을 거라고 생각이 된다.
https://jeonghwan-kim.github.io/sequalize-%EC%BF%BC%EB%A6%AC/
이커머스 프로젝트가 어느 정도 끝나가는 가운데
유효성검사에 대해 다시 생각하는 시간이 있었다.
createOrder = async (req, res, next) => {
const User = res.locals.user;
const userId = User.id
const { cartId, receiverName, receiverAddress, receiverPhone} = req.body
try {
if(!cartId || !receiverName || !receiverAddress || !receiverPhone){
throw new Error('cart정보나 받는사람 정보가 빠져있습니다.')
}
const order = await this.orderService.createOrder(
cartId, userId, receiverName, receiverAddress, receiverPhone
);
return res.status(201).json({ data: order })
} catch (error) {
return res.status(400).json({ errorMessage: error.message })
}
}
유효성검사를 현재는 body에 정보가 들어있는지 없는지만 했는데 모든 검사를 if문을 이용해서 하기에는 비효율적이라고 생각이 많이 들던 가운데 드림코딩 노드강의를 통해서
를 알게 되었다.
router.get('/',배열이들어갈 수있음, (req,res) => {})
배열에 body에 들어가는 값들을 유효성검사를 쉽게 할 수 있는 것을 보고 다음프로젝트에서 적용을 해봐야겠다고 생각이 들었다.
showMeTheOrder = async (userId) => {
try {
const showOrder = await this.orderModel.findAll({
where: { userId },
attributes: [
"id", "receiverName", "receiverAddress", "receiverPhone", "total_Price"
],
include: [
{
model: this.cartModel,
attributes: ["quanitity", "isDone", "updatedAt",],
include: [
{
model: this.goodsModel,
attributes: ["name", "price", "image",]
}
]
}
]
})
return showOrder
} catch (error) {
throw error
}
}
Sequelize를 이용해서 2번이상 join을 할일이 별로 없었지만 이번 프로젝트를 하면서 처음 사용하게 되었다.
주문에 대한 정보를 보기위해서 처음 계획부터 order에서 join해서 가져오자는 계획을 세웠지만 실제로 해보는건 처음이어서
구글링을 해서 알아보고 했다.
Orders -> Carts -> Goods 순서로 include한 테이블안에서 한번더 include를 했다.
만약 Orders에 Goods관련 컬럼이 있었으면 다른 방식으로 하게된다. -> ERD에 더 많은 시간을 사용하자....
createOrder = async (
cartId, userId, receiverName, receiverAddress, receiverPhone, total_Price
) => {
const t = await sequelize.transaction()
try {
const findCart = await this.cartModel.findAll({
where: { id: cartId },
transaction: t
})
console.log('111', findCart)
if (!findCart.length) {
throw new Error('없는 카트입니다.')
}
if (findCart[0].isDone !== 1) {
throw new Error('이미 주문된 카트입니다.')
}
const createOrder = await this.orderModel.create({
userId,
receiverName,
receiverAddress,
receiverPhone,
total_Price,
}, { transaction: t })
await this.cartModel.update(
{ isDone: 0 },
{
where: { id: cartId },
transaction: t
}
);
await this.cartModel.update(
{ orderId: createOrder.id },
{
where: { id: cartId },
transaction: t
}
);
await t.commit()
return createOrder
} catch (error) {
await t.rollback()
throw error
}
}
시퀄라이즈 transaction도 처음 사용해봤다. 동시에 처리되어야 하는 일을 하나의 묶음으로 만들어서 하나라도 안되면 동작이 되지 않게 해주는 기능이다.
transaction을 선언하고 들어가야 하는 부분에 transaction: t를 넣어주고 마지막에 await t.commit()을 해줘야 한다. 이거 빼먹어서 오류가 많이 났다....
transaction에 대해서는 구글링해서 사용법만 익히고 넣은것이어서 프로젝트 끝나고 좀 더 살펴봐야겠다.