가수면
서버에서 enum으로 데이터 처리하는 방법 본문
백엔드에서 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