ASCII 0-31: 제어 문자 이슈

김성진·2025년 3월 10일
0

개발을 하는데 계속해서 validation에 문제가 생겼다. 코드상에는 분명 문제가 없는데! 처음 겪는 이슈여서 블로깅을 해본다.

코드:


 STRATEGY_TYPE_MAPPING = {
    'base-price': 'base_price',
    'last-minute': 'last_minute',
    'early-bird': 'early_bird',
    'monthly': 'monthly',
    'weekly': 'weekly',
    'pacing': 'pacing',
    'maximum': 'maximum',
    'minimum': 'minimum',
    'channel': 'channel',
}
    
    def __init__(self):
        self.validator = RateStrategyValidator()
        self.VALID_STRATEGY_TYPES = list(STRATEGY_TYPE_MAPPING.keys())  # 인스턴스 초기화 시점에 설정
    
    def modify_strategy(self, rate_strategy_id: int, strategy_type: str, strategy_data: Dict[str, Any] | List[float] | int | None) -> RateStrategy:
        """요금 전략의 특정 타입을 수정하는 메서드"""
        # 모든 공백 문자 및 제어 문자 제거
        strategy_type = ''.join(c for c in strategy_type if ord(c) >= 32)
        
        if strategy_type not in self.VALID_STRATEGY_TYPES:
            raise ValueError(f"유효하지 않은 전략 유형입니다. 가능한 타입: {self.VALID_STRATEGY_TYPES}")
        
        if not rate_strategy_id:
            raise ValueError("rate_strategy_id가 필요합니다.")
            
        # strategy_data가 None인 경우는 허용 (전략 삭제)
        if strategy_data is not None:
            if strategy_type == 'base-price':
                self.validator.validate_base_price(strategy_data)
            elif strategy_type == 'monthly':
                self.validator.validate_list_length(strategy_data, 12, strategy_type)
            elif strategy_type == 'weekly':
                self.validator.validate_list_length(strategy_data, 7, strategy_type)
            elif strategy_type in ['last-minute', 'early-bird']:
                self.validator.validate_dynamic_strategy(strategy_data, strategy_type)
            elif strategy_type == 'channel':
                self.validator.validate_channel_strategy(strategy_data, strategy_type)
            elif strategy_type in ['maximum', 'minimum']:
                self.validator.validate_maximum_minimum(strategy_data, strategy_type)

분명 저기 'channel'이 값에 있는데 계속해서

if strategy_type not in self.VALID_STRATEGY_TYPES:

이 부분에서 에러가 났다.

그래서 터미널에서 "strategy_type"과 "self.VALID_STRATEGY_TYPES"을 찍어보니 아래와 같이 뜸. 잉?

계속 찾아보니, 원래 입력된 strategy_type 문자열에 보이지 않는 제어 문자가 포함되어 있었기 때문에 단순한 문자열 비교 (strategy_type == 'channel')가 실패했던 것.
예)

'channel\r\n'  # 끝에 캐리지 리턴과 라인피드가 있는 경우
# 또는
'\x00channel'  # 앞에 NULL 문자가 있는 경우

해결방법: (아래코드 추가)

strategy_type = ''.join(c for c in strategy_type if ord(c) >= 32)
profile
multi-national communicator with programming (back-end)

0개의 댓글