Shopify의 앱 설치 로직 이해하기

Today I Learned 날짜 2024년 5월 20일 월요일 내용 앱 설치 링크 이제 우리 서비스는 2가지 앱을 같은 어드민 페이지에서 지원한다. 브라우저 부스터 앱을 사용하는 사람이 알파플러스 앱에 접근하려고 하면, 앱 설치 URL로 리다이렉트 시켜줘야 한다. 쇼피파이 앱 스토어에서 설치할 때, 바로 해당 앱을 설치하기 위한 권한을 묻는 페이지로 넘겨줬어야 했는데 저번주 내내 열심히 뒤져봤지만 못찾았다.. 분명 다른 앱에선 구현해놓은 건데… 이 부분을 해결했다! 쇼피파이와 우리 서버가 통신을 주고받는 엔드포인트는 3개다. ...

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

파이썬 알고리즘 : 카펫

2024년 5월 20일 알고리즘 문제풀이 문제 카펫 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def solution(brown, yellow): answer = [] arr = [] # 가로길이와 세로길이에서 모두 2를 빼고 곱한 값이 노란색 카펫의 개수와 같아야 한다. for i in range(1, int((yellow)**0.5)+1): if not yellow % i: arr.append([i, yellow//i]) # 따라서 위에서 구한 값에 2를 더하면 카펫의 가로 길이와 세로 길이가 된다. # 모든 칸의 갯수를 구한 후 노란색 카펫의 갯수를 빼면 갈색 카펫의 갯수가 나온다. # 가로가 길어야 하므로 y, x 순으로 정렬한다. for x, y in arr: x += 2 y += 2 if x*y - yellow == brown: answer = [y, x] return answer

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

웹훅이 안되는 이유

Today I Learned 날짜 2024년 5월 17일 금요일 내용 Shopify API 버전 웹훅이 안되는 이유를 알았다. 새로운 앱의 API 버전은 2024-04였다. 기존 우리앱은 버전이 2023-07이었는데, 웹훅 등 Shopify와 통신을 이것저것 주고받을 때 항상 API 버전을 Query Param으로 주어야 한다. 새로운 앱과 통신할때도, 환경변수로 설정된 이전 API 버전을 변수에 담아 주었으니 당연히 401이 떴다. 회고 한 주의 마무리는 오후반차.

2024년 5월 17일 · 1 분 · 배준수

파이썬 알고리즘 : 모의고사

2024년 5월 17일 알고리즘 문제풀이 문제 모의고사 난이도 Lv.1 코드 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 # 수포자 1이 찍은 답을 문제 번호로 찾기 def first_answer(idx): if (idx+1) % 5: return (idx+1) % 5 else: return 5 # 수포자 2가 찍은 답을 문제 번호로 찾기 def second_answer(idx): if not idx % 2: return 2 else: if idx % 8 == 1: return 1 elif idx % 8 == 3: return 3 elif idx % 8 == 5: return 4 else: return 5 # 수포자 3이 찍은 답을 문제 번호로 찾기 def third_answer(idx): idx %= 10 if idx < 2: return 3 elif idx < 4: return 1 elif idx < 6: return 2 elif idx < 8: return 4 else: return 5 def solution(answers): ans = [] # 맞춘 갯수를 담는 배열 arr = [0, 0, 0] # 채점 for idx in range(len(answers)): if answers[idx] == first_answer(idx): arr[0] += 1 if answers[idx] == second_answer(idx): arr[1] += 1 if answers[idx] == third_answer(idx): arr[2] += 1 # 가장 많이 맞춘 사람 찾기 max_val = max(arr) # 고득점자가 한 명일 경우 if len(set(arr)) == 3: ans.append(arr.index(max_val)+1) # 고득점자가 둘 이상일 경우 else: for i in range(3): if arr[i] == max_val: ans.append(i+1) return ans

2024년 5월 17일 · 2 분 · 배준수

새 앱의 시작 분기 고려하기

Today I Learned 날짜 2024년 5월 16일 목요일 내용 서비스 시작 분기 앱이 2개로 분리되면서 앱을 설치할 때의 분기가 꽤나 복잡해졌다. 해당 쇼피파이 계정으로 알파플러스 서비스에 처음 가입하는 유저 해당 쇼피파이 계정의 다른 스토어로는 알파플러스 서비스를 이용하였으나 지금 스토어로는 처음 가입하는 유저 해당 스토어로 알파플러스 서비스를 가입하였으나 브라우저부스터는 처음인 경우 정도가 있다. 물론 브라우저부스터와 알파플러스가 반대인 경우도 있긴 하지만.. 2번과 3번 과정이 꽤나 헷갈렸다. 우리 서비스 로직으로는, 우선 설치하는 과정에서 샵 데이터를 생성한 후, 온보딩(혹은 계정 통합 과정)을 거치면서 이 샵 데이터가 계정 데이터와 연결된다. 3번은 바로 로그인 화면으로 이동해줘야 하므로 별도의 계정 연결 과정이 없다. 따라서 샵 데이터가 생성될 때 이뤄저야 한다. 따라서 샵을 만들때, 그 샵의 URL로 다른 앱 데이터를 탐색해서 존재하는지 확인했다. 존재한다면, 그 데이터와 연결된 계정에 이 샵도 바로 연결해주었다. ...

2024년 5월 16일 · 2 분 · 배준수

파이썬 알고리즘 : Longest Common Prefix

2024년 5월 16일 알고리즘 문제풀이 문제 Longest Common Prefix 난이도 Easy 코드 1 2 3 4 5 6 7 8 9 10 class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: word = strs[0] for i in range(1,len(strs)): for j in range(1,len(word)+1): if word[:j] != strs[i][:j]: word = word[:j-1] break return word Set로 풀어보려했는데, 맨 앞에서부터 공통을 찾아야 했다. 더 좋은 방법은 안 떠오르는데.. ...

2024년 5월 16일 · 1 분 · 배준수

QA 지옥

Today I Learned 날짜 2024년 5월 14일 화요일 내용 QA 제법, 아니 꽤 많이 미완성인채로 일정대로 QA가 진행됐다. 자질구레한 것 여러가지를 뜯어고쳤고, 앞으로도 뜯어 고칠게 참 많다. 앱 삭제 기능 쇼피파이에서 고객이 앱을 삭제하면 웹훅을 이용해 우리 서비스에 호출을 보낸다. 그럼 우리 서버 내에 데이터들을 삭제해주어야 한다. 이 기능이 작동을 안하고 있다. 따로 엔드포인트를 이용하면 기가막히게 삭제가 되는데… 주소가 잘못 되어있는 것 같아 수정하고, 기능이 새 앱에서는 작동되지 않도록 설정되어 있어 그 부분도 손봤는데 여전히 작동하지 않는다. elastic apm을 홗인해보니 웹훅을 처리하는 라우터 자체가 호출된 흔적이 없었다. 기존에 있던 웹훅 조회하는 함수를 조금 손봐서 새 앱에도 쓸 수 있게 해봤는데, 웹훅 조회자체가 안된다. 없을 거라 예상했는데 조회가 안되는건 예상 못했는데.. ...

2024년 5월 14일 · 3 분 · 배준수

파이썬 알고리즘 : 조이스틱

2024년 5월 14일 알고리즘 문제풀이 문제 조이스틱 난이도 Lv.2 코드 1차 55.6점 / 100점 진짜 어려웠다. A글자를 원하는 글자로 바꾸는 것은 어렵지 않았으나, 어떤 방향으로 커서를 움직이도록 설정할지가 고민됐다. 양 옆의 글자를 보고 바꾸기 위해 조작을 많이해야 하는 쪽으로 움직이도록 설정해주었다. 그래야 혹시 바꿀 필요가 없는 쪽으로 이동하지 않을 거라고 생각했다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def solution(name): def cal(x): max_val = ord("Z")+1 return min(ord(name[x])-ord(tmp[x]),(max_val-ord(name[x]))) n = len(name) name = list(name) answer = 0 idx = 0 tmp = list('A'*n) while True: if name[idx] != tmp[idx]: answer += cal(idx) tmp[idx] = name[idx] if name == tmp: break if cal((idx-1)%n) >= cal((idx+1)%n): idx = (idx-1)%n else: idx = (idx+1)%n answer += 1 return answer 2차 51.9점 / 100점 ...

2024년 5월 14일 · 4 분 · 배준수

Shopify에 앱 설치가 안되었던 이유

Today I Learned 날짜 2024년 5월 13일 월요일 내용 1 스토어 2 앱 설치 하나의 스토어에 우리 앱 2개가 설치되지 않는다. 쇼피파이에게 문의한 결과는 “개발에 관련된 질문은 받지 않으니, 개발자 커뮤니티를 이용하거나 우리 디스코드에 들어와!” 내가 안찾아봤겠냐고… 거기도 이미 답변을 다는 사람에 비해 너무 많은 질문이 올라온지 한참되버렸을 뿐더러, 내가 원하는 질문은 찾을 수도 없었다. 별 수 있나? 열심히 짱구 굴려봐야지.. 답이 없을 것 같았던 문제는, 전지전능하신 선배님의 도움으로 해결되었다. 브라우저 부스터 앱 설치를 테스트 서버로 넘기기 전에, ngrok을 이용해 내 로컬로 설치할 수 있다. 더 쉽게 말하자면, 유저가 “앱 설치할래요!” 라고 요청을 보내면, 쇼피파이와 앱 서버(여기선 우리 테스트 서버)는 검증받은 앱인지, 올바른 URL인지 기타 등등을 검증하고, 데이터를 주고 받는다. 이 과정에서 우리 서버에는 설치한 스토어의 정보가 저장되고, 새로운 손님에겐 우리가 미리 설정한 주소(온보딩 or 로그인 페이지)로 리다이렉트 시켜준다. ngrok을 이용하면 쇼피파이가 테스트 서버 대신 내 로컬과 이야기를 주고받도록 설정하는 셈이다. ...

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

죽음이 물었다, 어떻게 살 거냐고

죽음이 물었다, 어떻게 살 거냐고 지은이: 한스 할터 옮긴이 : 한윤진 출판사: 포레스트북스 감상 나는 책을 고를 때, 누군가의 추천사나 책에 대한 간략한 도입부, 소개를 읽지 않는다. 제목과 표지만으로 판단하는 이유는, 설령 내가 예상한 책 내용이 아닐지라도 온전히 나의 시각으로만 읽으면서 느낄 수 있는 점이 있다고 생각하기 때문이다. 이 방식은 앞으로도 고수할 생각이다. 이런 말을 하는 이유는, 내가 생각했던 책이 전혀 아니었기 때문이다.. 죽음에 관한 혹은 삶에 관한 누군가의 무덤덤한 수필을 기대했는데 역사적 인물들의 유언 모음집이었다. 읽은 이후에, 딱히 삶을 더 치열하게 살아야 한다거나 후회없이 살아야 한다는 욕구가 솟구치진 않는다. 역사에 남을 위대한 위인들, 죽은 이후에도 칭송될 업적을 남긴 인물들마저 자신의 죽음을 전혀 예상하지 못하는 경우도 많고, 무덤덤하게 받아들이는 경우도 많았다. 내가 가져야할 태도는 무엇일까. 무엇이 죽음 앞에 올바를 수 있을까? ...

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