from sqlalchemy import inspect
# 자동으로 할당되어 만들어주는 코드로 보인다.
def row_to_dict(row) -> dict:
return {key: getattr(row, key) for key in inspect(row).attrs.keys()}
from dataclasses import dataclass
from datetime import datetime
# id 속성이 없고, 데이터만 가지고 있는 데메인 객체를 값 객체라고 함.
@dataclass
class Profile:
name: str
email: str
# 도메인 객체를 다루기 쉽게 하기 위하여 dataclass로 선언하였음.
@dataclass
class User:
id: str
profile: Profile
# name: str
# email: str
password: str
memo : str | None
created_at: datetime
updated_at : datetime
def find_by_email(self, email: str) -> UserVO:
with SessionLocal() as db:
user = db.query(User).filter(User.email == email).first()
if not user:
raise HTTPException(status_code=422)
return UserVo(**row_to_dict(row))
해당 코드를 수행하는 도중 제대로 데이터가 맵핑되지 않는 문제점이 생겼다.
해결하기 위해서 먼저 문제점을 확인할 필요가 있었다. 중요한 거는 VO 객체에서 자동으로 Profile 객체를 찾아가 맵핑을 해주지 못한다는 문제점이 있었다.
이를 해결해주기 위해서 어쩔 수 없이 직접적으로 맵핑을 해주는 코드를 작성해줄 필요가 있었고, 추후에 해당 각 종속 관계에 있는 객체를 명시해서 자동으로 할당해주는 방법을 찾을 필요가 있어 보였다.
다음 코드는 수정 코드이다.
from datetime import datetime
from sqlalchemy import inspect
from user.domain.user import User as UserVO, Profile
# 자동으로 할당되어 만들어주는 코드로 보인다.
def row_to_dict(row) -> dict:
return {key: getattr(row, key) for key in inspect(row).attrs.keys()}
# user mapping 함수 # 해당 코드는 나중에 data_mapper.py 로 파일을 따로 만들어서 관리하거나 하자.
def map_user(row) -> UserVO:
user_dict = row_to_dict(row)
# Profile 객체 생성
profile = Profile(name=user_dict["name"], email=user_dict["email"])
# User 객체 생성
user = UserVO(
id=user_dict["id"],
profile=profile,
password=user_dict["password"],
memo=user_dict["memo"],
created_at=user_dict["created_at"],
updated_at=user_dict["updated_at"],
)
return user