로직상 허점 찾기

Today I Learned 날짜 2024년 4월 3일 수요일 내용 오후 반차라 내용이 많이 빈약하다. 리뷰 임포트 CSV파일에서 리뷰를 임포트 해오는 것에 대한 스토어 이슈가 발생했다. 리뷰를 임포트하는 부분은 깊게 파본적이 없어서 대응하기가 어렵다.. 조만간 뜯어봐서 이해해봐야겠다. 고객 데이터 이벤트에 참여하고 쿠폰을 받은(혹은 사용한) 고객의 데이터를 언제 어떻게 받을지 모르겠다. 쿠폰 코드를 제공할 때는 회원가입(정확히는 로그인)이 필수 요건이 아니기 때문에 고객 정보를 알 수 없다. 결국 쿠폰을 사용한 사람의 데이터를 가져와 저장해야 하는데 이 부분에 대한 Shopify Docs가 찾기 힘들다. 누가 어떤 쿠폰을 사용했는지를 알려주는 app을 쇼피파이가 권하던데.. 그 말은 만들순 있다는 뜻인 것 같다. 다만, 주문 데이터에서 뽑아와야 한다면 이에 대한 공수도 분명히 고려해볼 필요가 있겠다. ...

2024년 4월 3일 · 1 분 · 배준수

엔드유저 관점에서 로직 생각하기

Today I Learned 날짜 2024년 4월 2일 화요일 내용 엔드유저의 진입에 따라 발생해야 할 데이터와 로직들을 고민했다. 세그먼트 Shopify에서 고객들을 특정 기준에 따라 세그먼트로 묶어 관리할 수 있다. 이메일 입력 여부, 지역, 국가, 주문량 등등.. 어제의 고민은 “미션을 통과하여 쿠폰을 사용할 자격이 생긴 사람”을 세그먼트로 관리하기 부적절하다는 것이었는데, 기획에 대한 이해가 부족하여 생긴 오류였다. 내 생각의 전제조건은 쿠폰을 받은 유저가 로그인이 되있어야 한다는 것이다. 하지만 쿠폰 발급과 고객의 로그인 여부는 연관이 없다. 로그인을 요구하는 시점은, 쿠폰을 사용할 때 뿐이다. 따라서 이 쿠폰을 사용하는 사람을 한정짓는 조건은 “회원가입하여 로그인이 되어있는 사람”이다. ...

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

shopify 쿠폰을 위한 고객관리

Today I Learned 날짜 2024년 4월 1일 월요일 내용 리스트 디자이너는 실서버에 배포! 다음 스프린트를 진행중 쿠폰 이벤트를 완료한 인원에게 쿠폰을 제공해야 한다. Shopify Docs 를 참조하여 GraphQL을 참고하여 생성하는 과정에서 두 가지 문제에 봉착했다. 내가 기존에 계획한 로직은 스토어에서 고객이 수행해야 할 이벤트를 설정할 때, 사용 가능 인원이 지정되지 않은 쿠폰을 만들어 두는 것이었다. 좀 더 자세히는, 아무도 들어있지 않은 비어있는 고객 세그먼트를 생성한 후 , 할인 쿠폰에 배정할 계획이었다. 이 후 이벤트를 완료한 고객만 해당 세그먼트에 개별적으로 추가하여 쿠폰을 사용할 자격을 부여할 생각이었다. ...

2024년 4월 1일 · 3 분 · 배준수

shopify 쿠폰 만들기

Today I Learned 날짜 2024년 3월 29일 금요일 내용 스프린트 본격적으로 시작! 쿠폰 생성 이번 스프린트에서 쿠폰을 생성하는 부분을 맡았다. 아직 한 번도 다뤄본 적 없었던 부분이라 공부가 많이 될거라고 생각했는데, 역시나 머리가 흔들거린다(커서 그런거 아님). Shopify에는 PriceRule이라는 객체가 존재하는데, 이게 쿠폰의 설정모음? 같은 역할을 하는 듯하다. 내가 생성할 쿠폰들에 대한 설정이 여기에 담기고 실제 쿠폰은 DiscountCode라는 객체로 생성된다. 결론적으로, PriceRule은 쿠폰을 스토어의 입장에서 다루기 위한 객체고 DiscountCode는 고객이 받아 사용할 부분이라고 생각된다. ...

2024년 3월 29일 · 2 분 · 배준수

앱 삭제 기능 만들기

Today I Learend 날짜 2024년 3월 20일 수요일 내용 앱 삭제하는 경로를 추가했다. 오늘은 백엔드 작업을 많이 했다. 프론트 기존에 우리 서비스에서 사용하는 체크박스 클래스로 바꿔주었다. 앱을 삭제하는 버튼은 고객이 이유를 선택해야만 활성화되도록 구현하기 위해 ngIf 를 사용했다. 1 2 <button *ngIf="uninstallReasons.length > 0" class="btn-enabled" mat-button (click)="onConfirm()">Delete App</button> <button *ngIf="uninstallReasons.length === 0" class="btn-disabled" mat-button disabled>Delete App</button> 각 사유들은 checkbox로 만들었고 체크되면 삭제 사유를 담는 배열에 추가시켰다. 1 2 3 <div class="checkbox-container" aria-label="Select a reason" [(ngModel)]="uninstallReasons"> <alpha-checkbox (change)="updateUninstallReasons($event, 10)">Technical issues</alpha-checkbox> </div> 처음 사유를 추가했을 때, 버튼이 활성화되었다. 하지만 체크를 비활성화하여 다시 사유를 선택하지 않게 되었을 때 버튼이 비활성화되지 않았다. 따라서 uninstallreason의 배열 상태를 추적하는 ChangeDetectorRef를 사용했다. ...

2024년 3월 20일 · 2 분 · 배준수

데이터의 소스를 찾아서

Today I Learned 날짜 2024년 2월 27일 화요일 내용 Underscore(_) 기존의 코드들을 살펴보다가 한 가지를 발견했다. def test(): 와 def _test(): 의 차이는 무엇인가? 어떤 함수들은 정의 앞에 밑줄이 그어져 있었다. 저번에 한번 봤을 떈 오타겠거니 넘어갔는데 그런 함수가 많다! 관련된 부분을 찾아봤다. 클린 아키텍처나 클린코드 등의 책을 읽으면 수 없이 많이 나오는 이야기지만, 정의된 함수를 다른 곳에서 알 수 있게 할 것인가 말 것인가는 중요한 고민이다. 이에 대한 정답은 아직 나도 공부중이라 답변은 힘들고.. javascript에는 public, private, protected 등 접근을 제어하는 설정들이 존재한다. 반면 이 개념이 python에는 없다. 대신 표시하기 위해 관습적으로 _나 __(2개)를 사용한다. 1개인 def _test(): 는 내부적으로 사용되는 것이라 는 뜻이고, 2개는 클래스 내부에서만 사용되는 메서드나 속성에 사용된다. 결론은 여기 말고 다른곳에서 쓰지말라는 뜻. ...

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

데이터베이스 구조 고민과 Shopify App proxy

Today I Learned 날짜 2024년 2월 26일 월요일 내용 기존 로직 파악 다음 스프린트 때 구현할 기능들에 대해 코드 초안을 작성하고 있다. 기존에 구현되어 있는 방식을 이해하지 못해 막혀있는 부분과 작성했지만 개선해야 할 부분을 회의를 통해 알게 되었다. 고객의 스토어에 표시할 위젯을 Shopify theme asset에 저장할 수 도 있다. 하지만 이 때 위젯을 가지고 있는 것은 shopify가 된다. 우리 서비스에서 제공하고, 수정 및 변경이 원활하기 위해선 우리가 가지고 있는 것이 바람직하다. 우리 서비스를 설치한 스토어는 테마를 수정하는 에디터에서 앱 블록을 추가할 수 있다. 앱 블록에는 스크립트가 작성되어 있는데, “어떤 위젯이 필요하니 app proxy를 이용해 알파리뷰 서버의 특정 endpoint로 요청하라”고 적혀있다. 우리 서버는 해당 요청을 받으면 이에 맞는 위젯 HTML에 알맞은 데이터를 추가하여 보내준다. 데이터까지 입력된 완성된 HTML을 보내주는 것이다. 앱 블록은 받은 것을 출력하면 된다. ...

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

삭제한 Store의 API에 접근할 수 없는 이유

Today I Learned 날짜 2024년 2월 14일 수요일 내용 안돼 앱을 삭제한 shop의 메타필드와 테마 내 에셋을 삭제하는 Task를 진행중이다. 문제가 되는 부분을 정리하자면 app이 삭제되면 웹훅 시그널이 도착하는데, 이 때 shopify API로 메타필드나 에셋에 접근하면 access token으로 인해 401이 뜬다. 메타필드와 asset에 접근하는 다른 커맨드를 이용해 잘 작동되는게 확인된 access_token을 삭제해도 마찬가지로 aceess_token으로 인해 401이 뜬다. 열심히 구글링하는 과정에서 다음 링크를 발견했다. 요약하면, “app/uninstalled”라는 topic의 웹훅이 도착했을 떄는 이미 우리 app이 삭제된 이후기 떄문에 access token이 무효화되어 스토어의 에셋이나 메타필드에 접근할 수 없다는 것. 무려 Shopify 파트너의 답변이라… 그렇다면 알파리뷰를 삭제한 store의 스니펫을 위해 API로 전송한 데이터를 삭제할 수 있는 방법이 없다. 그리고 shopify 개발자 포럼을 확인해보니 이 문제를 나만 겪는게 아닌가보다. ...

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

rich snippet 위치 찾기

# Today I Learned ## 날짜 2024년 2월 13일 화요일 ## 내용 ### 왤까? 저번주부터 진행하던 Task는 고객이 서비스를 설치할 당시 생성된 데이터들 중 우리 서버에 있는 것과 Shopify에 저장해둔 것을 찾아 삭제해야 한다. 고객이 서비스를 삭제할 때 발생하는 일련의 과정은 웹훅으로 구현되어 있다. 내 로컬에서 태스크를 진행하기 위해 테스트 서버와 로컬에 웹훅을 설치해 열심히 구현했다. 저번 TIL에 있었던 metafields나 asset이 여기에 해당된다. 생성될 때의 함수를 보고 반대로 했다. 내가 지워야할 데이터는 구글에 rich snippet을 제공하기 위해 생성되었던 것들인데, 탐색해서 삭제하는 로직을 완성했다. 문제를 겪는 부분이 있고, 분명 발생해야 할 문제인데 그렇지 않은 부분도 있다. 우선, 설치를 삭제한 shop의 테마를 shopify에서 조회하는데 자꾸 실패한다. 이미 작성된 다른 커맨드를 이용해 테마를 조회할 떄는 잘 나오는데 왜 여기서만 문제가 될까? 같은 함수를 사용하는데.. 삭제해야할 테마가 존재하지 않는다면 그냥 넘어가도록 로직을 설정할지, 무언가 잘못된 부분이 있는지 아직 확신이 서지 않는다. 왜 안될까? 두번쨰로, 테마의 asset을 다루는 API는 Shopify에 예외적인 상황임을 알려 승인받지 않는다면 더 이상 지원하지 않는다. 우리 서비스는 승인을 받았지만, 실서버만 적용되기 때문에 테스트서버에선 asset API가 작동되지 않을 것이라고 조언을 받았었다. 이 과정을 어떻게 처리해야할지 참 고민이 많았는데 아직까지 나타나지 않고 있다. 왜 될까? ## 회고 긴 연휴 끝이라 집중을 잘 못할까 걱정했는데 기우였다. 휴식이 최고.

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