스프레드시트에 데이터 병합하는 크론 고치기

2024년 3월 22일 금요일

Today I Learned

날짜

2024년 3월 22일 금요일

내용

위젯

위젯 내용이 에러메시지에 담기는 문제에 대해 조언을 받았는데, 프론트 쪽의 문제일 수 도 있다고 한다. 응답을 받을 때 Text로 처리하는 함수를 사용하는 쪽으로.. 자세한 결과는 월요일에나 나오지 않을까 싶다.

고객 데이터 조회

예전에 진행했던 태스크에 문제가 생겼다. 고객들의 서비스 사용 정보를 구글 스프레드시트에 매일 갱신하는 함수가 제대로 작동하지 않았다. 리뷰 서비스나, AI 서비스를 사용하면 사용 개시 시간을 기록해야 하는데 사용한다고 기록했음에도 불구하고 구체적인 시간은 저장되지 않고 있었다.

원인을 찾았는데, 고객의 서비스 사용 상태를 저장하는 방식이 바뀌면서 생긴 문제였다. 그동안은 테이블에 각 필드로 저장하고 있었다. ‘리뷰 서비스 사용 여부’, ‘리뷰 서비스 사용 시작 시간’, ‘AI 서비스 사용 여부’ 등등.. 올해 1분기 동안 PMF를 찾기 위해 여러 서비스를 추가할 계획인지라 매번 필드를 추가하고 마이그레이션 해주어야 하는 문제가 있었다. 따라서 이걸 apps_log라는 jsonb 형태로 담도록 변경했다. 각 내부에는 100(리뷰 서비스), 200(AI 서비스), 300(현재 진행중인 스프린트)을 key로 하고 사용여부와 사용시작시간으로 이루어진 dict를 value로 하는 json이 담겨있다. jsonb가 json이 가지는 내부 검색에 관한 단점을 보완한 형태인 만큼 좋다고 생각했다.

따라서 데이터의 예시를 보면 { ‘100: ‘{‘is_use’: ‘true’, ‘created_at’: ‘2024-03-22-00:00+00000’}’, ‘200’: ‘{…}’,… }의 형태로 보기엔 복잡하지만 이해만 하면 쉽게 데이터에 접근할 수 있었다. 나는 리뷰 서비스의 사용 시간에 접근하기 위해 다음과 같이 코드를 작성했다.

shop_detail.apps_log[str(AlphaApps.AI.value)]["created_at"]

제대로 접근되지 않아 형식을 다음과 같이 바꿨다. 이제 데이터베이스에서 값을 가져오는 것은 정상적으로 해결되었다.

apps_log_dict = json.loads(shop_detail.apps_log)

ai_use = apps_log_dict[str(AlphaApps.AI.value)]["is_use"]

또 다른 문제가 발생했는데, 서비스를 사용하지 않을 경우 이 값이 None으로 처리되었다. 데이터에 저장된 값은 string인 상황에서 구글 스프레드시트에 저장하기 위해 데이터를 가공하는 과정이 있었다. UTC를 KST로 바꾸기 위해 datetime 형태로 바꾸어 9를 더해줘야 했는데, None값이 가공과정에 들어가면서 오류가 발생하는 경우가 있었다. 따라서 사용하지 않을 경우 로직을 진행하지 않도록 처음에 분기점을 만들어줬다.

바로 적용될수 있도록 실서버 브랜치에 올리려고 했다. main 브랜치를 기점으로 새로운 브랜치를 만들고 PR을 통해 병합해야 했는데 실수로 main에 바로 커밋해버렸다.. 바뀐 코드가 cron쪽이라 당장 서비스에는 이상이 없었고, 고친 부분도 문제가 되지 않아 다행이지만 큰일날 뻔 했다.

회고

프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.프론트잘하고싶다.개발잘하고싶다.