미작동 원인 찾기

2024년 8월 8일 목요일

Today I Learned

날짜

2024년 8월 8일 목요일

내용

템플릿 미작동

기능 개발과 3차 QA까지 완료했다. 호옥시나 싶어서 다 만들어봤는데 역시나. 템플릿이 작동하지 않는다. 알아보니 스프레드시트에 날짜가 문자로 들어가진다. 날짜가 들어가는 셀을 클릭했을 때 달력이 떠야하는데 뜨지 않는다… 로우데이터 4개 타입중에 1개만 날짜로 들어가고 3개는 문자로 들어간다. 날짜 서식 지정하는건 똑같은 추상클래스의 메서드를 상속받는거라 그럴리가 없는데 싶었으나… 원인을 찾았다.

각 열별로 데이터에 따라 타입(문자, 숫자, 날짜)를 지정하는데 여기서 코드가 누락되었다.

기존

1
2
3
4
5
6
7
8
9
10
11
def set_data_type(self):
        values = [[self.format_date(row[0])] + row[1:] for row in self.values]
        data = []
        for row in values:
            formatted_row = []
            for i, cell in enumerate(row):
                if i == 0:
		                # 그냥 문자열로 삽입
                    formatted_row.append({"userEnteredValue": {"stringValue": cell}})
                elif ...
        return data

변경

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
def set_data_type(self):
        try:
            values = [[self.format_date(row[0])] + row[1:] for row in self.values]
            base_date = datetime(1899, 12, 30)
            data = []
            for row in values:
                formatted_row = []
                for i, cell in enumerate(row):
                    if i == 0:
		                    # 날짜서식 변경
                        date_obj = datetime.strptime(cell, "%Y.%m.%d")
                        delta = date_obj - base_date
                        formatted_row.append(
                            {
                                "userEnteredValue": {"numberValue": delta.days},
                                "userEnteredFormat": {
                                    "numberFormat": {
                                        "type": "DATE",
                                        "pattern": "yyyy. mm. dd",
                                    }
                                },
                            }
                        )
                    elif ...
                data.append({"values": formatted_row})
            return data
        except Exception as e:
            logging.info(f"error in set_data_type: {e}")

또 다른 문제로는 검색키워드가 없을 경우였다. 검색어들을 불러오는데 검색 키워드가 없는게 말이 되나 싶었는데.. 그럴 수 있다고 한다. 뭐 알고리즘을 타고 들어가면 검색을 하지 않고 들어간거니 검색 키워드가 없는 걸로 된다는 이야기 같은데… 중요한건 그게 아니라, 그냥 빈 값인 “ “로 뒀었다. 이걸 “-”로 수정했다.

마지막으로, 시트파일을 생성할 때 행의 갯수를 우리가 설정한 최댓값인 20만으로 고정시켜놨었다. 그러다보니 템플릿이 이 파일을 참조할 때 너무 많은 셀을 참조하느라 힘들어했다. 실제로 참조할 때 값이 있는 셀의 갯수가 아니라 존재하는 셀의 갯수를 참조한다고 한다.. 그래서 값을 넣기 직전에, 데이터 갯수만큼 셀을 생성하도록 바꿔줬다.

수리

아임리포트를 얼추 마무리 짓고, 기존 프로덕트 리뷰 서비스를 고치려고 한다. 지속적으로 에러가 나고 있던 것들이 꽤나 있어서 이참에 반드시 마무리 짓고싶다. 간혹 메일로 발송된 리뷰 작성 페이지에서 shop을 지칭하는 값이 None이라고 뜬다. 근데 진짜 어처구니가 없는게, 그 전에 실행된 코드에선 shop_access_code가 있었는데 갑자기 딱 그 떄만 shop_access_code가 없댄다. 뭔데.. 버그를 재현할 수 없으니 너무 힘들다.

리뷰 요청 메일쪽에서도 약간 삐그덕거린다. 이전에 수정한 중복 메일 방지가 잘 먹히는지 확인하려고 코드를 실행해 봤는데 오류가 떴다. 메시징 로그에는 발생한 오류 내용이 저장되서, 어디서 오류가 발생했는지 확인할 수 있다. 찾아가보니

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        try:
            ...(중략)
                        for variant in variants
                            if line_item.variant_platform_id == variant["platform_id"]:
                                insert_product = product["Product"]
                                insert_product["product_variant"] = variant
                                line_item.product = insert_product

            if not line_item.product:
                self.messaging_log.failure_reason += f"|failed insert_product"
                self.messaging_log.sending_status = MessagingSendingStatus.UNABLE
                self.db.commit()
                return self.messaging_log

            ...(중략)
            
        except Exception as e:
            self.messaging_log.failure_reason += f"|{e}"
            self.messaging_log.sending_status = MessagingSendingStatus.UNABLE
            self.db.commit()

이런 코드인데.. 저 line_item이라는 객체에는 product 속성이 없다. 실제로 오류에서도

“LineItem” object has no attribute “product”’

라고 저장됐다. 애초에 작동이 불가능한 코드니 진작에 오류가 났었어야 했는데, 지난 메시징로그중에는 이런 오류가 하나도 없다… 이 성립 불가능한 코드에 들어있는 내가 모르는 의도는 뭘까. 왜 그동안 단 한번도 발생하지 않았는가… 근데 난 어떻게 그걸 발생시킨건가… 나도 내가 무섭다.

회고

지금 내가 쓴 코드도 나중에 다른사람이 보면 고생하겠지..? 각주 열심히 써줘야겠다.