일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- state 사용하기
- SSR
- 캡스톤디자인 후기
- React.JS
- node.js
- no router instance found
- Next.js
- MSW
- 사내 오류 대응
- react-query
- state 관리
- javascript
- React
- 사내 이슈
- react-query&Next.js
- 일상 생각
- 결제페이지
- react-query 도입후기
- JS변수
- 리액트
- ClientSide
- 기술낙서장
- TypeScript
- 기술 낙서장
- react-query v5
- nextjs
- 더블엔씨
- SW캡스톤디자인
- 사내 오류 해결
- router instance
- Today
- Total
코딩을 잘하고 싶은 코린이 동토니
사내 스마트 스토어 옵션 가격 책정 오류 수정하기 본문
스마트스토어 가격이 유효기간에 따라 순차적으로 추가가격이 붙어야 하는데 이상하게 가격이 책정되어있는 문제가 발생됬습니다.
문제 원인
2023년 2월 중순경 네이버 스마트스토어 정식 api 호출만을 허용하게 되면서 기존 스마트스토어 데이터를 가져오던 api 라우터들을 전부 수정해야 되는 문제가 발생되었다.
해결과정
에러리포트에 올라온 내용은 사내 utils 프로젝트로 올라왔지만, 상품별 옵션 리스트 추가 및 가격 책정은 스마트 스토어 프로젝트에서 이루어지고 있었기에 스마트 스토어 프로젝트와 관련된 내용에서 버그가 발생했을 것으로 판단하였습니다.
스마트 스토어 프로젝트 프로젝트 내부에 옵션에 가격을 책정하는 코드는 다음과 같습니다.
export const bulkUpdate = async () => {
try {
const remainRes = await apiClient('.../remain?sfNumber=1')
const { remain } = remainRes.data
for (const item of remain) {
try {
const { originProductNo } = allSearchRes?.data?.contents[0]
const { originProduct, smartstoreChannelProduct } =
await getProductInfo(naverClient, originProductNo)
const product = {
...originProduct,
statusType: 'SALE',
detailAttribute: {
...originProduct.detailAttribute,
optionInfo: {
optionCombinationGroupNames: {
optionGroupName1: '유효기간',
},
optionCombinationSortType: 'ABC',
optionCombinations: item.cons.map((con: any, i: number) => {
let price = 0
if (item.cons.length > 1) {
if (conItem.sfOptionPrice) {
if (i && dayjs(con.expireAt).subtract(10, 'days') > dayjs()) {
price = Number(conItem.sfOptionPrice)
}
} else if (conItem.sfMinPrice) {
price = Math.round(
((conItem.sfSellingPrice - conItem.sfMinPrice) * i) /
((item.cons.length - 1) * 10),
) * 10
} else if (dayjs(con.expireAt).subtract(7, 'days') < dayjs()) {
price = -100
} else if (
i > 2 &&
dayjs(con.expireAt).subtract(1, 'months') > dayjs()
) {
price = +50
}
}
... do something
해당 코드가 적힌 파일은 재고 수량을 20분 주기로 맞춰주기 위한 bulk-update 파일입니다.
코드를 살펴보면 먼저 내부 서버에서 각 콘 아이템 별 재고를 조회합니다. 그리고 조회한 콘아이템의 콘 유효기간에 따라 옵션을 설정하고 가격을 책정하게 됩니다.
여기까지 살펴봤을 때 스마트스토어에서 옵션 가격 책정이 잘못된 부분은 이 코드 어딘가 혹은 이 코드와 관련된 코드의 문제로 인해 발생되었다고 예상 할 수 있었습니다.
먼저 스마트 스토어 프로젝트 코드만 살펴봤을때 유효기간에 따른 가격을 책정하는 계산식 자체에서는 문제가 없다고 판단하였습니다.
두번째로 유효기간 관련하여 데이터를 불러오는 과정을 살펴보게 되면 데이터를 불러오는 로직도 크게 이상이 없습니다.
여기까지만 봤을 때 내릴 수 있는 결론은 스마트 스토어 프로젝트에는 문제가 없다고 판단 할 수 있었습니다.
위 두개의 케이스에서 문제가 없었기에, 콘 아이템 별 재고 데이터를 넘겨주는 내부 서버 코드에 문제가 있다고 판단하였습니다.
내부서버 코드 살펴보기
내부서버 에서 스마트스토어 재고 조회는 /.../remain 라우터에서 이루어 집니다.
해당 라우터를 살펴보았을 때 최종 수정 내역이 2023년 2월 중순경으로 네이버 스마트스토어 api로 이관하던 시점에 기존 라우터 로직을 사용 할 수 없어 수정했던 내역이 남아있었습니다.
아래는 문제 해결 전 코드입니다.
ItemsRouter.get(
'/remain',
validate([query('sfNumber').exists()]),
async (req: Request, res: Response, next: NextFunction) => {
try {
... do something
const groupRemainItems = cons.rows.reduce((acc, row, i) => {
const { conItemId, conItem } = row
const count = cons.count[i].count
const expireAt = cons.count[i].expireAt
const item = acc[conItemId]
if (item) {
item.count += count
item.cons.push({ expireAt, count })
} else {
acc[conItemId] = {
conItemId,
conItem: makeCmsConItemJson(conItem),
count,
cons: [{ expireAt, count }],
}
}
return acc
}, {})
const remain = Object.values(groupRemainItems)
res.json({ remain })
} catch (err) {
return next(err)
}
},
)
언뜻 해당 코드를 보았을 땐 큰 문제가 없어보입니다.
콘 아이템 Id에 따른 콘 수량 조회하는것도 문제가 없었고 스마트 스토어 프로젝트 에서 필요한 데이터도 적절하게 핸들링하여 보내주고 있습니다.
하지만 여기서 res.json 데이터를 조회해보면 문제가 바로 보입니다.
"cons": [
{
"expireAt": "2024-04-12T15:00:00.000Z",
"count": 10
},
{
"expireAt": "2024-04-11T15:00:00.000Z",
"count": 12
},
{
"expireAt": "2024-04-14T15:00:00.000Z",
"count": 3
},
{
"expireAt": "2024-04-16T15:00:00.000Z",
"count": 3
},
]
cons에 매핑된 유효기간과 재고수량이 유효기간에 따라 sorting 되지 않은 채로 response를 날려주고 있습니다.
스마트 스토어 프로젝트 코드에서는 expireAt에 따라 따로 sorting해주는 코드는 없기 때문에 내부 서버에서 response를 날릴 때 sorting한 후 보내줘야 하는걸 알 수 있었습니다.
따라서 다음 코드를 추가해주었습니다.
const groupRemainItems = cons.rows.reduce((acc, row, i) => {
const { conItemId, conItem } = row
const count = cons.count[i].count
const expireAt = cons.count[i].expireAt
const item = acc[conItemId]
if (item) {
item.count += count
item.cons.push({ expireAt, count })
item.cons.sort(
(a, b) => dayjs(a.expireAt).unix() - dayjs(b.expireAt).unix(),
) // 유효기간에 따른 sorting 추가
} else {
... do something
}
}
return acc
}, {})
수정 이후 다음 bulk-update때 유효기간에 따른 가격책정이 정상적으로 이루어진것을 확인 할 수 있었습니다.
'기술낙서장' 카테고리의 다른 글
사내 결제 페이지 개편하기 (1) | 2024.09.03 |
---|---|
스마트 스토어 자동화 프로그램 429에러 처리하기 (0) | 2024.09.02 |
스마트 스토어 프로그램 health Check (1) | 2024.09.02 |
playwright로 네이버 스마트스토어 자동 로그인 구현하기 (1) | 2024.09.02 |