토스쇼핑 쉐어링크 발급 기능을 토스쇼핑 Open API 플러그인 v1.9.0에 구현했습니다. 최종 선정(selected)된 상품에 쉐어링크를 연결하되, 기존 링크가 있으면 새로 발급하지 않고 재사용합니다. 실제 서버에서 신규 발급과 기존 링크 재사용을 각각 테스트해 정상 동작을 확인한 과정을 정리합니다.
이전 10편까지의 개발 흐름
이 시리즈는 Jukebox의 토스쇼핑 상품 선별과 SNS 콘텐츠 제작을 위해 토스쇼핑 Open API를 단계적으로 연동하는 개발기입니다. 지금까지의 흐름을 먼저 정리하면 다음과 같습니다.
- 1편에서 API 키 발급 과정을 정리했습니다.
- 2편에서 OAuth 인증과 Health API를 확인했습니다.
- 3편에서 실제 상품 조회를 테스트했고, 4편에서 상품 상세 조회 API를 연동했습니다.
- 5편에서는 쉐어링크 발급 API를 단독으로 테스트했습니다.
- 6편에서 조회한 상품을 WordPress DB에 저장했고, 7편에서 저장된 상품의 상세 정보를 갱신했습니다.
- 8편에서 상세 조회를 여러 상품으로 확장했고, 9편에서 상품 선별용 후보 데이터를 만들었습니다.
- 10편(v1.8.0)에서는 선별용 데이터를 만들고, ChatGPT 상품 선별 프로젝트로 Jukebox/SNS 활용성을 평가한 뒤 그 결과를 플러그인에 저장했습니다.
선정 상품에 토스쇼핑 쉐어링크 발급이 필요한 이유
v1.8.0까지는 상품을 수집하고 평가해 최종 선정하는 데까지 진행했습니다. 하지만 선정된 상품이 실제 SNS 콘텐츠에 쓰이려면 토스쇼핑으로 연결되는 쉐어링크가 필요합니다. 쉐어링크 발급 자체는 5편에서 단독으로 검증했지만, 그때는 발급 API가 동작하는지만 확인했을 뿐 상품 데이터와 연결해 관리하지는 않았습니다.
v1.9.0의 목표: 토스쇼핑 쉐어링크 발급과 상품 연결
최종 선정된 상품에 실제 토스쇼핑 쉐어링크를 연결하는 것. 이미 발급된 링크가 있으면 새로 발급하지 않고 재사용한다.
선정 상품만 처리하는 이유
토스쇼핑 쉐어링크 발급 대상은 상품 선별 결과가 selected인 상품으로 한정했습니다. 쉐어링크는 실제 발급이 일어나는 작업이므로, 최종 선정되지 않은 상품까지 대상으로 삼지 않도록 범위를 좁혔습니다. 따라서 shortlist, near_miss, excluded 상품에는 아직 쉐어링크를 발급하지 않습니다.
쉐어링크 재사용 구조: 기존 링크 확인 후 발급
처리 흐름은 다음과 같습니다.
selected 상품
↓
기존 쉐어링크 확인
↓
기존 링크 있음 → 기존 링크 재사용
기존 링크 없음 → 토스 Open API로 신규 발급
↓
쉐어링크 정보 저장
↓
상품과 쉐어링크 연결
쉐어링크 중복 발급 방지
이번 개발에서 가장 중요한 부분은 동일 상품에 대해 쉐어링크를 매번 새로 발급하지 않도록 하는 것입니다. 발급 전에 저장된 링크를 먼저 확인하며, 링크는 다음 세 값으로 식별합니다.
| 식별 값 | 설명 |
|---|---|
tacaItemId | 토스쇼핑 상품 식별자 |
publisherId | 링크를 발급하는 퍼블리셔 식별자 (이 글에서는 값을 공개하지 않습니다) |
subTagId | 링크 구분용 태그. 현재 MVP에서는 별도로 사용하지 않아 기본적으로 빈 상태로 관리 |
같은 상품을 다시 처리하면 이미 저장된 링크를 재사용합니다.
토스쇼핑 쉐어링크 신규 발급 방식
기존 링크가 없는 상품은 토스 Open API로 쉐어링크를 신규 발급합니다. 발급 API 연동 자체는 5편에서 검증한 방식이며, v1.9.0에서는 이를 선정 상품 처리 흐름 안으로 연결했습니다. 발급된 링크는 곧바로 저장 단계로 넘어갑니다.
쉐어링크 데이터 저장 및 상품 연결
상품과 쉐어링크를 연결해 관리하기 위해 별도의 링크 데이터를 추가했습니다. 관리하는 항목은 다음과 같습니다.
| 항목 | 의미 |
|---|---|
product_id | 연결된 상품 |
taca_item_id | 토스쇼핑 상품 식별자 |
publisher_id | 퍼블리셔 식별자 |
sub_tag_id | 링크 구분 태그 (현재는 빈 상태) |
short_url | 발급된 단축 링크 |
origin_url | 원본 링크 |
status | 링크 처리 상태 |
issued_at | 발급 시각 |
last_used_at | 마지막 사용 시각 |
error_reason | 실패 시 사유 |
created_at / updated_at | 레코드 생성/수정 시각 |
참고: 테스트 결과를 공유하는 이 글에서는 Publisher ID, 인증 정보, 서버 IP, 그리고 origin_url에 포함된 추적용 query 값을 노출하지 않습니다.
1차 테스트: 토스쇼핑 쉐어링크 신규 발급
기존 링크가 없는 상태에서 선정 상품 1건을 처리했습니다.
- 선정 상품: 스파클 생수, 무라벨, 2L, 24개
tacaItemId:90382271
| 항목 | 결과 |
|---|---|
| 선정 상품 | 1 |
| 신규 발급 | 1 |
| 기존 링크 재사용 | 0 |
| 발급/처리 실패 | 0 |
기존 링크가 없는 상태에서 실제 토스쇼핑 Open API를 통해 쉐어링크를 신규 발급하고 저장하는 데 성공했습니다.
2차 테스트: 쉐어링크 재사용 확인
동일한 상품에 대해 같은 처리를 다시 실행했습니다.
| 항목 | 결과 |
|---|---|
| 선정 상품 | 1 |
| 신규 발급 | 0 |
| 기존 링크 재사용 | 1 |
| 발급/처리 실패 | 0 |
두 번째 실행에서는 이미 저장된 쉐어링크를 확인하고, 신규 발급 없이 기존 링크를 재사용하는 것을 실제 서버에서 확인했습니다. 9편에서 후보 데이터를 중복 생성 없이 갱신했던 것과 같은 방식으로, 이번에는 쉐어링크에 중복 방지가 적용되었습니다.
v1.9.0에서 확인한 쉐어링크 발급·재사용 결과
v1.8.0까지는 다음 단계를 진행했습니다.
상품 수집
→ 상세 조회
→ 후보 생성
→ 상품 평가
→ 최종 선정
v1.9.0에서는 여기에 다음 단계가 추가되었습니다.
최종 선정
→ 쉐어링크 발급
→ 상품과 링크 연결
이제 하나의 상품에 대해 상품 정보, 상세 정보, 상품 선별 결과, Jukebox/SNS 평가 결과, 쉐어링크를 연결해서 관리할 수 있는 기반이 만들어졌습니다. 다만 이것은 기반을 마련한 단계이며, 전체 workflow가 완성된 것은 아닙니다.
이번 테스트로 확인한 것은 두 가지입니다.
- 링크가 없는 선정 상품은 실제 토스쇼핑 Open API로 쉐어링크가 신규 발급되어 저장된다.
- 같은 상품을 다시 처리하면 저장된 링크를 재사용하고 신규 발급은 일어나지 않는다.
현재 구현 범위와 한계
| 현재 구현 | 현재 구현하지 않은 기능 |
|---|---|
| selected 상품 대상 쉐어링크 처리 | SNS 채널별 subTag 자동 관리 |
| 기존 링크 확인 | 클릭 성과 분석 |
| 신규 링크 발급 | 주문/매출 성과 분석 |
| 기존 링크 재사용 | Claude 자동 평가 |
| 링크 정보 저장 | 자동 WordPress 게시 |
| 상품과 링크 연결 | SNS 자동 게시 |
| 전체 workflow 자동 스케줄링 |
또한 이번 테스트는 선정 상품 1건으로 진행했습니다. 그 범위 안에서 신규 발급과 재사용을 확인했으며, 그 이상의 검증은 아직 이루어지지 않았습니다.
다음 개발 방향
이번 버전으로 선정 상품과 쉐어링크를 한 곳에서 관리할 수 있게 되었습니다. 이후에는 위의 미구현 항목 중 필요한 것부터 단계적으로 검토할 예정입니다. 구체적인 내용은 다음 개발기에서 정리하겠습니다.
자주 묻는 질문
토스쇼핑 쉐어링크는 어떤 상품에 발급되나요?
v1.9.0에서는 상품 선별 결과가 selected인 상품만 대상입니다. shortlist, near_miss, excluded 상품에는 아직 발급하지 않습니다.
같은 상품을 다시 처리하면 쉐어링크가 새로 발급되나요?
아니요. tacaItemId, publisherId, subTagId로 저장된 링크를 먼저 확인하고, 있으면 재사용합니다. 2차 테스트에서 신규 발급 0건, 재사용 1건을 확인했습니다.
subTagId는 사용하나요?
현재 MVP에서는 별도로 사용하지 않아 기본적으로 비어 있는 상태로 관리합니다. SNS 채널별 subTag 자동 관리는 아직 구현하지 않았습니다.
이 기능으로 클릭이나 매출 성과를 볼 수 있나요?
아직 아닙니다. 클릭 성과 분석과 주문/매출 성과 분석은 이번 버전에 포함되지 않았습니다.