천 번 난 오류

Today I Learned 날짜 2024년 10월 25일 금요일 내용 천 번의 오류 우리 슬랙의 무료 평가판 기간이 끝나면서, 마지막에 추가한 sentry 알람이 사라졌다.. 이제 에러가 나는지 직접 들어가서 확인해봐야 한다. 요즘 설치 수가 많아지면서 그래도 잘 작동하는 줄 알았는데.. 똑같은 오류가 천 번 이상 지속적으로 나고 있었다. 오류 메시지는 쇼피파이 상품 미디어의 ID가 이미 존재하는 값이라, DB가 롤백된다는 내용이다. 모두 쇼피파이 설치 로직에서 발생했다. 쇼피파이 상품 미디어의 ID는, 쇼피파이에서 제공하는 값이다. 쇼피파이에서 globally unique id라 했으니까 분명 중복이 된 값이 들어올리는 없고.. 이미 저장된 상품을 또 저장해서 발생한 문제인지 알아봤는데, 이 에러가 터진 샵들 중 첫 설치인 샵들이 많았다. ...

2024년 10월 25일 · 2 분 · 배준수

요청의 성능 높이기

Today I Learned 날짜 2024년 9월 26일 목요일 내용 불필요한 요청 없애기 인스타그램 피드 QA를 진행중이다. 위젯 관련된 세팅 요청이 시간이 꽤나 걸린다. 구체적으로는, 인스타그램에서 가져온 게시글과 상품의 연결을 끊는 부분에서 오래걸린다(그외 다른 것들도 꽤 걸린다). 원인은 앱 메타필드에 있다. 기존 알파플러스에서는 스토어에 접속한 클라이언트가 위젯 렌더링을 서버에 요청하는 방식을 사용했다. 이젠 Shopify의 앱 메타필드를 이용해서, 데이터 까지 모두 렌더링된 HTML, CSS, JAVASCRIPT 파일을 집어넣어놨다. 따라서, 위젯과 관련된 모든 값이 앱 메타필드에 업로드되야 하는데 이게 시간을 꽤나 잡아먹는다. 그래서 유저가 상품 연결을 해제하면 응답하여 반영되는 것까지 시간이 2.5초 정도 소요된다.. ...

2024년 9월 26일 · 1 분 · 배준수

Shopify 딥 링크

Today I Learned 날짜 2024년 9월 20일 금요일 내용 딥링크 생성 인스타그램 피드 설정을 완료한 유저가 버튼을 누르면 자동으로 위젯이 추가되는 기능을 만들어야 한다. 그래서 난 테마에서 index.json을 가져와 필요한 걸 추가해주면 되지 않나? 생각했다. 실제로 관련된 shopify docs도 있고.. 아무리 해봐도 업데이트하는 put 요청이 Not Found를 반환한다. 관련된 문제를 찾아보니 나만 겪은 문제가 아닌 듯한데, 모든 질문이 작년 2분기 쯤에 몰려있다. 알아본 결과, 테마는 스토어 주인이 권한을 가져야 하기 때문에 앱이 직접 접근해서 수정하지는 못하도록 막혔다고 한다. 특히 json 파일들은.. 그럼 안되는 건데 다른 앱들은 어떻게 한거지? 싶어 이 기능이 있는 다른 앱을 실행해봤다. 자동으로 추가하는게 아니라, 테마 편집기에 추가된 상태로 이동시켜주는 기능이었다. 저장버튼만 누르면 자동으로 반영되도록… ...

2024년 9월 20일 · 1 분 · 배준수

비활성화와 삭제 구분하기

Today I Learned 날짜 2024년 9월 10일 화요일 내용 비활성 샵과 삭제한 샵 비활성화된 스토어들을 캐시에서 삭제했었다. 리뷰서버에서 샵 데이터를 Redis 캐시에서 받아 쓰는데, 캐시에 올라가있지 않으면 애초에 처리하지 않을 거라고 생각했기 떄문이다. 그럼에도 불구하고 몇일 간격으로 오류가 발생한다. 처음 몇번은 비활성화 된 샵인데도 캐시에 남아있는 경우가 있었다. 왜인지는 모르곘으나, Redis 관련 요청이 성공률이 높지 않다. 그래서 기존 코드에도 3회 정도 반복하는 코드가 있었구나 싶었다. 별 수 없어서 열심히 처리했는데 또 난다. ...

2024년 9월 10일 · 1 분 · 배준수

Shopify에서 Shop URL이 2개인 이유

Today I Learned 날짜 2024년 9월 9일 월요일 내용 샵 URL이 2개인 이유 쇼피파이에서 유저가 앱을 설치하면, 가장 먼저 알게 되는 샵 정보는 샵의 URL이다. 알파플러스에선 샵의 URL을 shop_url과 platform_shop_url 이라는 두 값으로 저장한다. 사실 왜 두 개인지 몰랐다. 뭐 레거시 인가 싶긴 했는데.. 그래서 인스타그램 코멘트를 만들때는 그냥 샵 URL을 하나만 가져왔다. 이게 모든 문제의 원인일 줄이여… 실제로 쇼피파이에서도 샵의 URL 관련 정보는 2가지이다. 하나는 “domain”, 다른 하나는 “myshopify_domain”이다. 전자는 유저가 설정에서 바꿀 수 있다. 스토어 이용 고객이 접속할 때 쓰는 URL이고 변경가능하다는 의미이다. 실제로 변경하는 스토어가 왕왕 있다. 반면 후자는 샵을 생성하면서 고정되는 값으로 변경되지 않는다. 각 스토어가 쇼피파이에서 가지는 고유한 ID가 있듯, 이 URL도 고유한 값이다. 따라서 스토어와 관련된 데이터를 쇼피파이에 요청할 때도 이 URL이 쓰인다. 우리가 테마를 조회하던, 메타필드를 조회하던, 주문 데이터를 조회하던 이 값이 없으면 아무것도 못한다. ...

2024년 9월 9일 · 2 분 · 배준수

쇼피파이 버전 업그레이드

Today I Learned 날짜 2024년 8월 13일 화요일 내용 쇼피파이 버전업 쇼피파이는 1년에 4번 새로운 API 버전을 출시한다(1월, 4월, 7월, 10월). 각 버전의 유효기간은 1년이다. 지난 12월에 2023-04 에서 2023-07로 버전을 떙겼는데 새로 버전을 바꿔야할 때가 왔다. 현재 가장 최신 버전은 2024-10 이지만, 아직 정식 출시 전인 버전이라 안전한 2024-07로 올리기로 했다. 쇼피파이에선 API로 데이터를 가져올 때 이 API 버전을 쿼리 파라미터로 항상 넣어야 하므로 쇼피파이 API를 이용하는 부분을 싹다 확인해야 했다. 릴리즈 노트 상으로는 상품 관련 API에만 큰 변경이 있을 것이고, 그 외에는 없는 것 같지만 혹시 모르니… ...

2024년 8월 13일 · 2 분 · 배준수

쇼피파이 임베디드 앱 설치

Today I Learned 날짜 2024년 7월 11일 목요일 내용 쇼피파이 앱 설치 인스타그램 댓글 가져오는 서비스가 쇼피파이 검수에서 반려당했다. 설치가 안된다길래 뭔소린가 싶어서 해보니 진짜 안됐다. 갑자기 왜… 겨우 세션토큰 만들어놨는데… 결국 하루종일 이것만 처리했다. 문제가 발생한 이유는, 이번에 개발한 앱이 임베디드라서 그렇다. 쇼피파이 어드민 내에 삽입되는 형태고, 서비스 내에서 주고 받는 요청은 항상 세션토큰이 헤더에 담겨있어야 한다. 이 세션 토큰은 프론트에서 앱 브릿지로 생성해야 한다. 기존 프로덕트 리뷰 같은 서비스들은 앱 설치 과정에서 프론트가 개입하지 않는다. ...

2024년 7월 11일 · 3 분 · 배준수

쇼피파이 임베디드 앱

Today I Learned 날짜 2024년 7월 4일 목요일 내용 임베디드 앱은 다르다. 큰일났다. 인스타그램 댓글을 가져오는 스프린트가 다 끝나고, 검수만 남아있었다. 무려 10번의 요청 끝에 렙틸리언 에게 앱 허가를 받아냈는데, 쇼피파이가 복병이었다. 임베디드 앱은 우리가 몰랐던 규칙이 있었다. 바로 shopify app birdge를 사용해야 한다는 것. 이걸 이용해, 사용자의 세션 토큰을 검증해야 한단다. 우린 전혀 쓰지 않는데… 뭔지도 모르겠고 어떻게 해결해야할 지도 몰랐다. 기존대로라면, 정해진 검증이 끝나면 우리가 설정한 곳으로 유저를 리다이렉트 시킨다. 유저는 아이프레임 내에 우리가 구현한 화면을 볼 수 있게된다. 근데, 앱 브릿지로 검증할 때 앱 설정에서 입력한 URL과 우리가 이동시키는 URL이 일치해야 한다. 말하면서도 어렵긴한데… 풀어서 설명하자면 ...

2024년 7월 4일 · 2 분 · 배준수

JSON과 STRING의 성능검사

Today I Learned 날짜 2024년 6월 14일 금요일 내용 앱 메타필드(2) 어제 무사히(?) 앱 메타필드를 저장하는 방법을 알아냈다고 생각했으나, 오늘 왠지 또 잘 안됐다. 원인은 정확히 앱 메타필드가 어디에 어떤값으로 있는지 몰라서 발생한 일이었다. 우리야 “앱 메타필드”라고 부르지만, 정확하겐 appInstallation 이라는 객체 내에 있는 Metafield 안에 저장하는 것이다. 기존에 사용하던 샵 메타필드는 Shop 객체 안에있고.. 따라서 우리 앱의 appInstallation ID를 알아내기 위해, 고객이 우리 앱을 설치하자마자 currentappInstallation을 조회하여 저장하고, 이 객체 안 메타필드를 관리하면 된다. 이 ID값은 key나 namespace가 아닌 ownerID 라는 항목의 값으로 처리된다. ...

2024년 6월 14일 · 2 분 · 배준수

Shopify 앱 메타필드

Today I Learned 날짜 2024년 6월 13일 목요일 내용 앱 메타필드 이번 스프린트는 인스타그램에서 댓글을 가져와 위젯으로 표시해주어야 한다. 기존처럼 쇼피파이에 있는 앱프록시를 이용해 서버쪽에서 처리하기보단, 앱 메타필드에 렌더링된 HTML 전체를 올려놓는 방식을 취해보기로 했다. 그동안은 샵 메타필드를 이용했었기 떄문에 그 샵이 설치한 다른 앱과 공유하는 메타필드였다. 앱 메타필드는 우리가 독점적으로 사용할 수 있으며, 앱을 삭제하면 자동으로 삭제된다는 장점이 있다. 다른 앱들은 유료화 기능에 이용한다고 하는데, 우린 이번 스프린트에 활용해보기로 했다. 단점이라면, 위젯의 HTML이 모두 올라가있기 떄문에 위젯과 관련된 데이터가 변경되는 즉시 메타필드에도 적용되야 한다. 이참에 앱 메타필드를 다루는 클래스를 만들어놓기만 하면 어렵진 않을것 같다. ...

2024년 6월 13일 · 2 분 · 배준수