Open tonykang22 opened 1 year ago
아래 이해가 잘 안되는 내용 질문드립니다.
승인완료라도 판매중지 상태가 존재하는 이유
쿠팡에서 특정 상품에 대한 상태를 승인완료 이자 판매중지 인 상태를 허용하나요? 둘 중 하나만 유효한게 아닌가요? ({승인완료} && {판매중지}
)
DB 기준 destinationID 로 쿠팡 API 사용해서 상태 조회시에 두 상태가 모두 조회되는지 확인이 필요할 것 같습니다.
엑셀을 활용한 방안만이 쿠팡 → DB sync를 수행할 수 있는 방법이라고 판단된다
findAll() 과 같은 API 가 부재한 상황이라고 말씀 주셨는데요, 쿠팡의 상품 목록 페이징 조회 를 사용해서 여러 리소스적인 측면을 고려해서 페이징 값 넣어 받아와서 쿠팡 -> DB 간 sync 에 사용할 수 있는것 아닌가요? 그 외 구간 조회 방법도 있는것 같은데.. 이건 생성일 기준 조회인데 최대 10분 텀이라 사용에는 좀 제약이 있을것 같습니다.
만약 말씀주신 엑셀 이 최선의 방안이라면 크롤링보단 엑셀 방식을 선택하는게 맞을것 같습니다.
제가 생각했던 sync 시나리오를 말씀드려보겠습니다.
아래 두 작업은 동기 로 처리됩니다. 즉, 1 이 수행된 뒤 2가 수행됩니다.
RestTemplate
의 동시성 이슈를 잘 파악하시고 사용해야 할 것 같습니다. (공유해서 사용해도 멀티 스레드 환경에서 병렬 처리가 가능한지 등)이 1, 2번 작업이면 sync 를 모두 맞출 수 있을것 같습니다만.. 어떻게 생각하실까요? 제가 포함하지 못한 경우의 수가 존재한다거나, 예상되는 예외상황들을 의견 부탁드릴게요
@kingwaggs 윤성님 추가 코멘트 드립니다.
쿠팡에서 특정 상품에 대한 상태를 승인완료 이자 판매중지 인 상태를 허용하나요? 둘 중 하나만 유효한게 아닌가요? ({승인완료} && {판매중지})
네 허용합니다. 이 이후의 논의들도 이 부분을 먼저 염두하고 진행되어야할거 같습니다. 이해를 돕기 위해 위에 붙여넣었던 사진에 해당하는 상품을 wing에서 보았을 때 사진도 첨부할게요!
음..상태 값 조회는 동일한 메세지만 뜨는군요...
comment
에 false
단어가 포함되어 있는지를 확인하는 것으로 판별이 가능할거 같기는 한데, comment
에 어떤 추가 케이스가 존재할지 몰라 애매하기는 하겠군요.
{
nextToken:
message:
data: [class OSellerProductStatusHistory {
statusName: 승인완료
createdBy: 와이더블유에프커머스(YWF Commerce)
createdAt: 2022-11-23T15:14:56
comment: '빈티지 스타일 핸드헬드 머메이드 배니티 미러 콜드캐스트 레진 앤티크 브론즈 마감' 아이템의 판매상태(이)가 'false' (으)로 변경되었습니다.
}, class OSellerProductStatusHistory {
statusName: 승인완료
createdBy: 쿠팡 셀러 시스템
createdAt: 2022-11-14T10:02:18
comment: 승인완료
}, class OSellerProductStatusHistory {
statusName: 승인대기중
createdBy: 와이더블유에프커머스(YWF Commerce)
createdAt: 2022-11-14T10:02:14
comment: 판매자(A00536509) 승인 요청 후 대기중
}, class OSellerProductStatusHistory {
statusName: 임시저장
createdBy: 와이더블유에프커머스(YWF Commerce)
createdAt: 2022-11-14T10:02:14
comment: 판매자(A00536509) 임시저장
}]
code: SUCCESS
}
쿠팡의 상품 목록 페이징 조회 를 사용해서 여러 리소스적인 측면을 고려해서 페이징 값 넣어 받아와서 쿠팡 -> DB 간 sync 에 사용할 수 있는것 아닌가요?
param 값들에 null을 설정하고서, 이전에 sdk를 탑재한 버전에서 실행했을 때 null 관련 오류가 나면서 안되었었는데, 윤성님 코멘트보고 혹시나해서 직접 코드 이식해서 실행해보니 잘 작동하네요!! 하,, 이 부분은 엑셀도 필요없이 해당 API 사용하면 될거 같네요 ㅠㅠ 다행입니다...
- Amazon -> DB (단방향)
네 해당 내용들 파악했습니다. 동감입니다.
- DB <-> Coupang (양방향)
여기서 궁금한 부분이 있습니다.
DB -> Coupang 의 경우 DB 엔 존재하지만 쿠팡엔 없는 상품 : DB 에서 해당 row 삭제
쿠팡에 없는 상품이라면, 쿠팡 측에서 삭제했거나 우리가 특정 사유로 삭제했을 거라고 생각됩니다.
근데 DB에서 삭제하게 된다면, 추후 문제의 상품이 다시 소싱될 우려가 있을거 같은데요.
DB에 status=OFF
를 시켜두는 것으로 처리하는게 낫지 않을까 생각됩니다!
DB -> Coupang 의 경우 DB 의 상품 상태와 쿠팡의 상품 상태가 다른 경우(쿠팡에서 판매중 이 아닌 경우) : DB의 상태 변경, "상품 수정" 하지 않음
사소한 차이이기는 하지만, 작업 순서 관련 내용으로도 확장될 여지가 있어서 질문드리면, (위도 동일합니다.) DB의 상태는 변경하고 쿠팡의 상품 수정은 하지 않는다면, Coupang -> DB 방향이 아닌가요? 변경되지 않을 것[Coupang]을 기준으로, DB를 변경해서요! ㅎㅎㅎ계속 이 부분만 생각하다보니 저도 복잡해져서요 ㅎㅎ
쿠팡에 등록은 되어 있지만 판매중이지 않은 상품에 대해 이야기 드리면, [현재] 파악된 바로는 아래의 두 가지 경우입니다.
[승인완료]가 아닌 상태
: 쿠팡 측에서 특정 사유로 승인을 반려했거나 승인 pending 중이라 판매 중이지 않음
[승인완료]인 상태
: deleteProduct 를 하기 위해 구매중지
만 수행되고, 상품삭제
는 수행되지 않은 상태쿠팡에 상품을 등록하면 모두가 바로 승인되는 것이 아니라, 임시저장/심사중/승인대기
등의 여러 상태가 존재합니다.
그렇기 때문에 DB에서는 쿠팡에 상품을 등록하는 시점에는 status=TBD
로 두고 계신거로 이해했는데요.
여기서 문제가 발생 여지가 존재합니다.
[승인완료]가 아닌 상태
중 pending 등의 상태로, 추후 상품이 정상 등록(승인완료)될 잠재가 있는 상품이 존재하는 것입니다.
만약 pending 상태인데 DB 상태를 변경해버리면, 추후 정상 등록되는 상품의 경우, DB와 sync가 맞지 않게 됩니다.
(DB는 status=OFF
로 변경된 상태)DB의 상품 상태
와 쿠팡의 상품 상태 비교
를 아래와 같이 한다면 문제는 해결될 것으로 보입니다.
status=TBD
= 임시저장/심사중/승인대기
status=ON
= 승인완료 && 판매중
status=OFF
= Else(나머지 쿠팡 상품 상태 값) || !판매중
이 1, 2번 작업이면 sync 를 모두 맞출 수 있을것 같습니다만.. 어떻게 생각하실까요?
위의 참고사항 정도를 제외하면, 공감합니다 ㅎㅎ 사실 말씀해주신
Amazon -> DB (단방향) DB <-> Coupang (양방향)
부분이, 제가 제안한
Amazon -> DB -> Coupang Coupang -> DB
와 유사하다고 생각되어서 공감합니다 ㅎㅎ
단지, 조금 의견이 다른 부분은, 윤성님은 1이 수행된 뒤 2를 수행하는 방안을 제시해주셨는데, 저는 2를 수행하고 1을 하는게 나을거 같다고 생각이 되어 공유드립니다. 1을 먼저하게 되면, 현재 쿠팡에 실제로 판매 중이지 않은 상품에 대해서도 (= 재고/가격 정보 업데이트가 필요없는 상품) rainforest api를 사용하는 resource를 할당해야 합니다. 만약 2를 먼저 수행해서, 실제로 쿠팡에서 판매 중이지 않은 상품을 조금이라도 줄일 수 있다면 resource를 경제적으로 활용할 수 있지 않을까 생각이 듭니다!
> 음..상태 값 조회는 동일한 메세지만 뜨는군요...
comment에 false 단어가 포함되어 있는지를 확인하는 것으로 판별이 가능할거 같기는 한데, comment에 어떤 추가 케이스가 존재할지 몰라 애매하기는 하겠군요.
우선 확인된 케이스는 "false" 로 판단하고 있는듯 하니.. ({승인완료} && {판매중지}) 상태에 대해서는 comment false 를 파악하여 sync 기능의 일부로 추가하는것으로 결정하시죠. 이후에 다른 케이스가 존재하면 그때 또 추가하는거로 가야할 것 같습니다.
윤성님 코멘트보고 혹시나해서 직접 코드 이식해서 실행해보니 잘 작동하네요!!
넵 다행입니다~ 이부분은 Coupang -> DB 의 sync (상태값) 에만 사용될 API 일테니, 상세 정보(등록된 상품의 가격, 상품명, 상세 설명 등)가 응답으로 돌아오지 않더라도 상관없겠죠?
DB에 status=OFF 를 시켜두는 것으로 처리하는게 낫지 않을까 생각됩니다!
넵 그것도 좋습니다만.. 제가 위와같이(DB row 삭제) 생각했던 이유는 wing 의 상품 개수와 DB 의 상품 개수(SELECT count(*) FROM product
) 가 같아야 된다고 생각했기 때문입니다.
근데 다시 생각해보니 굳이 같아야 할 이유는 없겠네요. DB 의 개수가 더 많은게 오히려 더 자연스러운 그림으로 생각되기도 합니다.
status OFF 변경하는것이 더 좋은 선택이 될 것 같습니다.
DB의 상태는 변경하고 쿠팡의 상품 수정은 하지 않는다면, Coupang -> DB 방향이 아닌가요? 변경되지 않을 것[Coupang]을 기준으로, DB를 변경해서요!
음.. 이 경우는 모든 예외에 대응하기 위해 고려한 경우의 수 입니다. DB 에는 존재하고 쿠팡에는 등록되지 않은 상품이 있을 수 있을것 같습니다. (구현상 그렇지 않을것이라 판단되더라도 예외시 대응이 가능해야할 것 같습니다) 따라서 DB -> Coupang 이라 표현하였고 이전 코멘트 드린 내용상 1번이 선행된다면 DB 의 데이터가 최신화(가격, 수량 등) 되어있을 것입니다. 따라서 DB 의 데이터를 Coupang 에 "갱신" 해줘야 하기 때문에 DB -> Coupang 이라 표현하였습니다.
[승인완료]가 아닌 상태 중 pending 등의 상태로, 추후 상품이 정상 등록(승인완료)될 잠재가 있는 상품이 존재하는 것입니다. 만약 pending 상태인데 DB 상태를 변경해버리면, 추후 정상 등록되는 상품의 경우, DB와 sync가 맞지 않게 됩니다. (DB는 status=OFF로 변경된 상태)
이건 DB status = TBD 인 상품에 대해서 sync 작업을 돌리면 되는것 아닐까요? 아마 지금 구현에도 포함이 되어있는 것 같은데요, DB status = TBD 상품에 대해 sync 를 수행할 때, 쿠팡에서 pending 상태(임시저장/심사중/승인대기 등)인 경우 계속 TBD 로 남아있게 하면 될 것 같습니다. 그러면 다음 sync 배치에 또 상태값을 체크하고 정상 변경될 것 같습니다. 혹시 제가 질문주신 내용을 잘못 이해한 것일까요?
DB의 상품 상태와 쿠팡의 상품 상태 비교를 아래와 같이 한다면 문제는 해결될 것으로 보입니다.
넵 제시해주신 내용은 이견 없습니다. 그렇게 반영하면 될 것 같습니다. (만약 추후 다른 이슈가 발생한다면 그때 또 업데이트 하면 될 것 같습니다)
단지, 조금 의견이 다른 부분은, 윤성님은 1이 수행된 뒤 2를 수행하는 방안을 제시해주셨는데, 저는 2를 수행하고 1을 하는게 나을거 같다고 생각이 되어 공유드립니다. 1을 먼저하게 되면, 현재 쿠팡에 실제로 판매 중이지 않은 상품에 대해서도 (= 재고/가격 정보 업데이트가 필요없는 상품) rainforest api를 사용하는 resource를 할당해야 합니다. 만약 2를 먼저 수행해서, 실제로 쿠팡에서 판매 중이지 않은 상품을 조금이라도 줄일 수 있다면 resource를 경제적으로 활용할 수 있지 않을까 생각이 듭니다!
저는 이 부분에 대해서 다른 생각입니다. 절차의 장단을 비교해보면
저는 위 케이스에서 1->2 가 저희의 이익 창출에 더 도움이 될 것이라 생각하였습니다. credit 은 시간이 지나 1만개의 상품을 모두 적용하게 된다면.. 충분할 것이라 생각됩니다. 만약 부족하다면 투자를 늘리면 되겠죠 ㅎㅎ (대신 그만큼 저희의 수익이 늘어야 할 텐데요 ㅜ)
이정도면 논의가 얼추 정리가 될 것 같습니다. 추가로 이견있으신 사항에 대해 질문주시면 제 의견 답변으로 달겠습니다. 정리된 항목에 대해서는 이 이슈의 코멘트로 기능 목록 도출하여 작업 진행 부탁드릴게요. (혹시나 상웅님께서 도출해주신 기능 목록에 저희가 논의된 내용을 서로 잘못 이해한 내용이 있다면 다시 짚고 넘어가려고 합니다)
넵 다행입니다~ 이부분은 Coupang -> DB 의 sync (상태값) 에만 사용될 API 일테니, 상세 정보(등록된 상품의 가격, 상품명, 상세 설명 등)가 응답으로 돌아오지 않더라도 상관없겠죠?
네 그렇다고 생각합니다 ㅎㅎ
넵 그것도 좋습니다만.. 제가 위와같이(DB row 삭제) 생각했던 이유는 wing 의 상품 개수와 DB 의 상품 개수(SELECT count(*) FROM product) 가 같아야 된다고 생각했기 때문입니다.
개수 부분도 SELECT count(*) FROM product where status="ON"
으로 확인 가능할거 같습니다.
그러면 다음 sync 배치에 또 상태값을 체크하고 정상 변경될 것 같습니다. 혹시 제가 질문주신 내용을 잘못 이해한 것일까요?
아닙니다 맞습니다!
저는 위 케이스에서 1->2 가 저희의 이익 창출에 더 도움이 될 것이라 생각하였습니다.
아..! 취지를 이해했습니다 ㅎㅎ. 제가 2 -> 1 로 생각했던 이유가 시간 문제였었습니다.
정리된 항목에 대해서는 이 이슈의 코멘트로 기능 목록 도출하여 작업 진행 부탁드릴게요.
네 알겠습니다.
> 제가 2 -> 1 로 생각했던 이유가 시간 문제였었습니다.
DB <-> 쿠팡 : 수분 내에 동기화가 완료될 것으로 생각
Amazon -> DB : 수 시간 소요 예상
그러게요 이 부분이 조금 고민되긴 합니다만.. 그렇다 하더라도 1->2 로 방향은 설정하는게 좋을 것 같습니다. 대신 소요 시간을 줄이는 이슈를 같이 또 고민해보시는걸로 하시죠 비슷한 이유로 PA 에서 아이템스카우트를 크롤링으로 긁어올 때 fork join pool 을 사용하고 있습니다. Java 저희 현재 버전에서 제공하는 스레드 풀의 리스트를 한번 보시고, 가장 퍼포먼스가 좋을 구현체를 골라 사용하는걸로 하시죠. 이번에 sync 에서 적용되는 결과를 바탕으로 PA v2 에서도 적용이 가능할 것 같습니다(크롤링을 걷어내고 Http Client 로 병열 요청)
status=ON || status=TBD
상태인 상품을 조회한다.source_id
로 Amazon 실시간 정보를 요청한다.승인완료 && 판매중
(일반상황)
(승인완료 && !판매중) || 임시저장 || 부분승인완료
status = OFF
로 변경한다.승인반려 || 상품삭제
status = OFF
로 변경한다.심사중 || 승인대기중
status = TBD
로 변경한다.승인완료
상태의 쿠팡 상품을 가져온다.destination_id
인지 확인한다.그러게요 이 부분이 조금 고민되긴 합니다만.. 그렇다 하더라도 1->2 로 방향은 설정하는게 좋을 것 같습니다. 대신 소요 시간을 줄이는 이슈를 같이 또 고민해보시는걸로 하시죠
네 좋습니다 ㅎㅎ
Java 저희 현재 버전에서 제공하는 스레드 풀의 리스트를 한번 보시고, 가장 퍼포먼스가 좋을 구현체를 골라 사용하는걸로 하시죠. 이번에 sync 에서 적용되는 결과를 바탕으로 PA v2 에서도 적용이 가능할 것 같습니다(크롤링을 걷어내고 Http Client 로 병열 요청)
네 좋습니다. Resttemplate 동시성 문제도 확인해보니 우선은 thread safe하다고 합니다.
@tonykang22
상웅님 추가로 하나 더 궁금한게 있습니다.
DB의 상품 상태와 쿠팡의 상품 상태 비교를 아래와 같이 한다면 문제는 해결될 것으로 보입니다. status=TBD = 임시저장/심사중/승인대기 status=ON = 승인완료 && 판매중 status=OFF = Else(나머지 쿠팡 상품 상태 값) || !판매중
쿠팡 상품 상태에 "판매중" 이라는 상태가 있는건가요?
상품 상태변경이력 조회 API 에서 판매중 이라는 상태는 안나와 있습니다.
제가 생각했을땐
{
nextToken:
message:
data: [class OSellerProductStatusHistory {
statusName: 승인완료
createdBy: 와이더블유에프커머스(YWF Commerce)
createdAt: 2022-11-23T15:14:56
comment: '빈티지 스타일 핸드헬드 머메이드 배니티 미러 콜드캐스트 레진 앤티크 브론즈 마감' 아이템의 판매상태(이)가 'false' (으)로 변경되었습니다.
}, class OSellerProductStatusHistory {
statusName: 승인완료
createdBy: 쿠팡 셀러 시스템
createdAt: 2022-11-14T10:02:18
comment: 승인완료
},
...
]
code: SUCCESS
}
statusName equals "승인완료" && comment equals "승인완료"
를 Status ON 으로 봐야하지 않을까 해서요
@kingwaggs 윤성님,
쿠팡 상품 상태에 "판매중" 이라는 상태가 있는건가요?
없습니다. 앞서 이야기했던 대로 쿠팡 상품 상태변경이력 조회 API의 comment 값을 확인해야합니다.
우선 확인된 케이스는 "false" 로 판단하고 있는듯 하니.. ({승인완료} && {판매중지}) 상태에 대해서는 comment false 를 파악하여 sync 기능의 일부로 추가하는것으로 결정하시죠. 이후에 다른 케이스가 존재하면 그때 또 추가하는거로 가야할 것 같습니다.
위에서는 이렇게 이야기하셨었는데, statusName equals "승인완료" && ! comment contains "false"
이보다는 statusName equals "승인완료" && comment equals "승인완료"
이게 더 낫다고 말씀하시는거죠?
현재 wing에 등록된 상품들의 상태별(statusName
) 이력을 확인해보니 구현된 기능 상으로는 둘 다 문제는 없을거 같습니다 ㅎㅎ
그렇다면 아무래도 statusName equals "승인완료" && comment equals "승인완료"
이게 더 이점이 있을거 같네요!
> 그렇다면 아무래도 statusName equals "승인완료" && comment equals "승인완료" 이게 더 이점이 있을거 같네요!
넵 저도 이게 더 명시적이고 좀 더 포괄적으로 대응할 수 있을 방안이라 생각되네요.
sync 작업에서 상태값이나 가격이 변경된 상품에 대해서는 슬랙 알람으로도 받아볼 수 있도록 되면 좋을것 같습니다.
sync 작업에서 상태값이나 가격이 변경된 상품에 대해서는 슬랙 알람으로도 받아볼 수 있도록 되면 좋을것 같습니다.
네 이 내용도 추가해두겠습니다 ㅎㅎ
상품 상태변경 이력
조회 시, comment의 상태완료
가 판매 중을 보장하지는 않는다.comment
검증에 참고
Sync 기능 추가
개요
재고/수량/환율
의 변동이 생길 수 있다.아마존 → DB → 쿠팡
Sync를 맞춰줘야 한다.쿠팡 → DB
Sync를 맞춰줘야 한다.현황 파악
쿠팡 → DB
쿠팡 → DB
sync의 일부만 되어있다.구현
status=TBD
인 엔티티 조회승인완료
라면status=ON
으로 업데이트승인반려
,상품삭제
라면status=OFF
status=TBD
일부라고 표현한 이유
쿠팡에만 존재하는 상품인 경우
가 확인되지 않는다.승인완료
라도판매중지
상태가 존재한다.status=ON
이더라도 쿠팡에서 판매하고 있지 않은 경우가 있으므로 sync가 맞을 수 없다.승인완료라도 판매중지 상태가 존재하는 이유
deleteProduct
수행 시:참고 : [상품삭제 하려면 판매중지 상태여야 한다.]
vendorItemId
가 존재하면판매중지 요청
API 호출 →상품삭제 요청
API 호출 → 성공유무에 따라ApiException
발생status=OFF
가 반영되지 않는다.판매중지 요청
은 성공했으나상품삭제 요청
에 실패한 경우 발생vendorItemId
가 존재하지 않으면상품삭제 요청
API 호출 →ApiException
발생판매중지 요청
과상품삭제 요청
이 트랜잭션 단위로 수행되어야 해당 문제가 발생하지 않게 된다.개선안
아마존 → DB → 쿠팡
쿠팡 → DB
sync가 전제되어야 한다.쿠팡 → DB
sync가 완료된 경우,status=ON
인 엔티티를 가져오도록 한다.문제점
너무 긴 시간 소요
해결 방안
스레드풀 사용
쿠팡 → DB
status
가 올바른지 대조 및 업데이트한다.문제점
WebCrawler 사용
쿠팡 → DB
sync를 수행할 수 있는 방법이라고 판단된다.해결 방안
논의 필요
쿠팡 → DB
sync 방법은 없는지, 혹은문제점.WebCrawler 사용
에서 제시한 방안 외 다른 방안이 있는지, 없다면 어떤 방식을 채택하는 것이 합리적인 선택일지 논의 필요