가수면

서버에서 enum으로 데이터 처리하는 방법 본문

웹 개발/웹 개발

서버에서 enum으로 데이터 처리하는 방법

니비앙 2025. 2. 21. 09:55

백엔드에서 enum으로 데이터를 정의하고 데이터베이스와 연결할 때 enum의 값을 사용하는 방법을 정리한다.

 

아래와 같은 enum이 있다고 해보자.

class DatabaseType(Enum):
    """
    데이터베이스 종류 코드
    """

    MYSQL = 'db_0001'
    MARIADB = 'db_0002'

 

이상적인 상황은 api 명세서에 프론트에서 'MYSQL'이나 'MARIADB'처럼 Enum member의 값(Entity ID)을 넘기도록 정의하는 것이 좋다.

 

그러나 만약 프론트에서 넘어오는 데이터가 'mysql' 형식일 수도 있고, 'db_0001' 형식일 수도, 'MYSQL' 형식일 수도, 또는 다른 임의의 형식일 수 있는 상태라면, 그 형식에 상관없이 어쨌든 실제 db에 insert할 땐 'db_0001'가 들어가도록 가공해야하는 작업이 필요하다.

 

이상적인 상황이거나 데이터가 아무렇게나 넘어오는 상황이거나 어쨌든 값을 변환하고 예외처리 하는 작업이 필요한데, 이 경우 별도의 transform, formatting 함수를 만들 필요 없이 클래스 메소드를 만들어서 사용하는 것이 좋다.

class DatabaseType(Enum):
    """
    데이터베이스 종류 코드
    """

    MYSQL = 'db_0001'
    MARIADB = 'db_0002'

    @classmethod
    def from_input(cls, input_value: str) -> "DatabaseType":
        """
        다양한 형식의 입력값을 정규화하여 올바른 DatabaseType enum으로 변환합니다.
        - 입력값이 enum의 이름(대소문자 무관)과 일치하거나,
        - 입력값이 enum의 value와 정확히 일치하면 해당 enum 멤버를 반환합니다.
        """
        normalized = input_value.strip()
        for member in cls:
            # enum 이름(대소문자 무관) 또는 enum 값과 비교
            if normalized.lower() == member.name.lower() or normalized == member.value:
                return member
        raise ValueError(f"유효하지 않은 데이터베이스 타입: {input_value}")
# 예시: 프론트엔드에서 받은 값이 어떤 형식이든 간에...
def process_database_input(frontend_value: str) -> str:
    try:
        db_type_enum = DatabaseType.from_input(frontend_value)
    except ValueError as e:
        raise e
    return db_type_enum.value

 

되도록이면 불필요한 연산을 할 필요없이 프론트에서 enum의 Entity ID를 넘기도록 api 명세서를 정의하는 것이 가장 바람직하다.

'웹 개발 > 웹 개발' 카테고리의 다른 글

DB 데이터 이전  (0) 2024.07.26
yarn 오류  (0) 2024.06.23
JPA와 MyBatis  (0) 2024.06.07
[Svelte] 기본  (0) 2024.05.28
Vercel의 배포 방식과 느릴 수밖에 없는 이유  (1) 2024.04.12
Comments