Gitbook을 이용한 Docs 작성

Today I Learned 날짜 2024년 5월 23일 목요일 내용 서비스 독스 작성 올해 회사에서 이룰 개인적인 목표 중 하나는 우리 팀의 서비스에 대한 Docs를 작성하는 것이다. 처음 계획은 어떤 기능이 어떤 함수, 어떤 파일에서 어떻게 데이터를 주고받는지를 기록하려고 했다. 내가 보기 위해서기도 하지만, 여러 사람이 협업하는 만큼 다른사람이 작성한 코드를 읽고 파악하는데 낭비되는 시간을 최소화하기 위해서였다. 문서를 작성하는 시간만큼 내가 코드 보는 눈도 좋아질 것이고.. 조언과 여러 생각 끝에 방향을 틀어 기능과 흐름에 대해 작성하는 걸로 수정했다. 이렇게 되면 코드와 언어 자체에 대한 해석은 부족할지라도 전체적인 흐름을 파악할 수 있어 큰 그림의 이해가 더 쉽다. 또한 문서를 읽을 수 있는 사람이 개발자로 한정되지 않는다. 아주 약간, 조금의 짬이 차면서 기능을 개발하면서 생기는 고민은 코드 퀄리티나 방식에 대한 고민도 있지만, 지금은 에러가 나거나 로직상 구멍이 나서 유저가 원치않는 상황에 직면하게 되는 것을 더 걱정하게 되었다. 지금 시점에서 더 깔끔하고 근사한 코드를 짜는 사람보다는 계획 수준에서부터 그림을 그릴 줄 아는 개발자, 내가 들여야 할 공수와 시간을 정확하게 계산해 낼줄 아는 개발자가 되고 싶다. ...

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

파이썬 알고리즘 : Container With Most Water

2024년 5월 23일 알고리즘 문제풀이 문제 Container With Most Water 난이도 medium 코드 1차시도 시간초과(50/62) 모두 탐색했는데 시간초과가 떴다. 1 2 3 4 5 6 7 8 9 10 11 12 class Solution: def check(self,a,b,height): val = min(height[a], height[b]) return abs(b-a)*val def maxArea(self, height: List[int]) -> int: n = len(height) ans = 0 for a in range(n-1): for b in range(a+1,n): ans = max(ans, self.check(a,b,height)) return ans 2차시도 메모리초과(49/62) 인덱스 중 2개를 골라 처리하려 했는데 2개의 숫자 조합을 만들기 위한 배열이 메모리초과가 떴다. 아무래도 접근 방법 자체가 틀린것같다. ...

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

데이터가 삭제되지 않는 로직 찾기

Today I Learned 날짜 2024년 5월 22일 수요일 내용 데이터 삭제 관리 서비스 내에 별개의 앱이 생성되면서 이것저것 분기 테스트를 진행중이다. 어떤 샵이 어떤 서비스를 사용하고 있는지, 어떤 앱을 설치했는지가 항상 정확하게 처리되어야 한다. 설치 과정에서 발생하는 문제들은 여러 테스트들에서 이상이 없었다. 샵을 삭제할 때, 연결된 계정의 삭제여부도 결정해야한다. 어떤 계정이 더이상 연결된 샵이 없으면, 그 계정은 삭제되어야 한다. 기존에는 알파플러스 앱에 있는 샵들만 확인하면 됐었는데, 이제 확인해야할 샵이 늘었다. 이 부분을 뒤늦게 파악하여 부랴부랴 추가해주었다. ...

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

jsdeliver 폭파사건

Today I Learned 날짜 2024년 5월 21일 화요일 내용 사건사고(?) 백서 그동안 사내 다른 사버스들에서 발생했던 중대한 문제들에 대한 백서 공유 시간이 있었다. 자세히 이야기하자면 길지만 서버 문제로 고객사들의 스토어에 문제가 생겨서 발생한 문제들이었다. 사실 jsdeliver가 작동하지 않았을 때, FastAPI에서 자동으로 생성해주는 swagger UI 문서가 제대로 뜨지 않고, 내 개인 블로그도 고장나서 알게 되었다. 우리 글로벌 서비스의 위젯도 작동하지 않았지만 다행히 문제제기는 없었다. 문제가 있었던 오전 9시부터 11시는 미국 LA 기준으로 오후 5시부터 7시 쯤이니 잘 몰랐던 건 아닐까! 나중에 백서 쓸일이 없었으면 좋겠다. ...

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

파이썬 알고리즘 : 오픈채팅방

2024년 5월 21일 알고리즘 문제풀이 문제 오픈채팅방 난이도 Lv.2 코드 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 def solution(record): n = len(record) answer = [] # 들어오거나 나가는 행동을 저장할 배열 arr = dict() # 각 아이디의 최종 닉네임을 저장하기 위한 배열 name = dict() # 데이터를 가공하기 위한 반복문 for i in range(n): # 데이터 분리 data = list(record[i].split(" ")) tmp = dict() # 들어오고 나가는 행동이면 저장 if data[0] != "Change": tmp["message"] = data[0] tmp["id"] = data[1] arr[i] = tmp # 들어올 때 닉네임을 바꾸는 경우 추적 if data[0] == 'Enter': name[data[1]] = data[2] # 닉네임을 바꾸는 행동일땐 저장하지 않고 이름만 갱신 else: name[data[1]] = data[2] # 출력하기 위한 반복문 for i in range(n): # i번째일때 바꾸는 행동이였으면 arr에 해당 키 값은 존재하지 않음 if i not in arr: continue # 각 아이디의 최종 닉네임으로 출력 if arr[i]["message"] == "Enter": c = name[arr[i]["id"]] + "님이 들어왔습니다." elif arr[i]["message"] == "Leave": c = name[arr[i]["id"]] + "님이 나갔습니다." answer.append(c) return answer

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

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 분 · 배준수