본문 바로가기

MLOps/Development

코드 품질 향상을 위한 FastAPI 기반 코드 리팩토링

코드 품질 향상을 위한 FastAPI 기반 코드 리팩토링

서론

회사 솔루션 제공을 위한 API를 NCP(Naver Cloud Platform)에서 배포하기 위해 몇 가지 개선을 진행했다.


Before

기존 코드는 Fast API를 사용하고 있고 Input과 Output만 존재하는 단순한 형태였다.

Images를 입력받아서 Json 형태를 리턴해주고 있다.

 

해당 코드를 사용해 배포를 진행한다면..


After

3가지 단계 추가

입력 유효성 검사
  • 필요한 데이터가 누락되었을 때 처리하는 방식을 추가함
  • 예를 들어 'images' 필드는 비워둘 수 없음
형식 검사 및 예외 핸들러 추가
  • 입력된 이미지 데이터가 원하는 형식인지 확인하는 검사
  • 잘못된 형식의 데이터가 들어올 경우 적절한 오류 메시지 반환
로그메시지
  • 기존 코드에는 print를 통한 로깅이 많이 포함되어 있었음
  • 실제 배포 시에는 로깅 라이브러리를 이용해서 로그를 관리하기 위해 로거 추가

형식 검사 및 예외 핸들러 추가

 

try:
    base64.b64decode(img_b64, validate=True)
except Exception as e:
    raise HTTPException(status_code=400, detail="Image data is not valid base64 encoded.")

 

그리고 에러 세분화를 위해 아래와 같은 형식으로 커스텀 에러 추가

class CustomException(Exception):
    def __init__(self, message):
        self.message = message

try:
    raise CustomException("This is a custom exception.")
except CustomException as e:
    # Handle the custom exception
    logging.error("A custom error occurred.", exc_info=True)
    raise HTTPException(status_code=500, detail=str(e))

로그 메시지

  • TimedRotatingFileHandler를 사용해서 로그 파일 이름에 날짜를 자동으로 포함시킬 수 있도록 함
  • 자정이 지나가는 경우 새로운 로그파일을 생성하여, 최근 30일 로그 파일만 보관

 

파일 이름에 붙는 날짜 형식을 설정

"handler.suffix = "%Y-%m-%d"

 

아래는 로그 관련 파일 중 일부

def setup_logger(name):
    # Create a logger
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)

    # Rotates the log file at midnight and keeps 30 days of backup logs
    handler = TimedRotatingFileHandler('log', when='midnight', interval=1, backupCount=30)
    handler.setLevel(logging.DEBUG)
    handler.suffix = "%Y-%m-%d"  # set suffix as date

    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)

    # Add the handler to the logger
    logger.addHandler(handler)
    return logger

끝으로

코드 조직화와 에러 세분화를 더욱 진행할 예정이다.

추가로 단위/통합 테스트 코드를 작성해 배포 테스트를 더욱 진행해야 할 것 같다