심화반 스터디 마지막 날!
강사님이 준비해주신 엄~청~난~파일~!~!~! 대부분 구현되어 있었고
내가 해야 할 부분은 Water를 참고해서 Exercise, Sleep, Meal 모델을 직접 ORM으로 만들고 DB와 연결한 뒤, 라우팅을 실제 서비스 흐름대로 구성하는 작업이었다.
흐름 파악하는데 시간 많이 썼음.. 대갈텅텅 대갈장군의 괴로움이 느껴지는 악필.. 원래가 그냥 악필이긴 함 키득.. 나만 알아보면 되는거 아닌ㄷ가(당당)
처음에 라우터 파일 열었을 때
“이게 뭐지?” 하고 검색부터 시작했는데,
과정 후반부에 배우는 부분을 미리 맛보기로 경험한 느낌이었다.
URL 요청을 특정 함수에 연결하고, 들어오는 값(Form/Query/Path)을 파싱해서 처리하는 구조.
Model.create()는 INSERT고
get_or_none()은 특정 행을 가져오는 SELECT이고
객체 속성 수정 후 .save()는 UPDATE였고
.delete()는 진짜 DELETE였다 아— 이게 FastAPI구나. (아는척 이해한척 그냥 얼렁뚱땅임)
ORM이 SQL을 자동으로 만들어주는 건 알겠는데,
처음엔 이게 눈에 보이질 않아서 좀 막막했다.
그래도 하나씩 직접 모델을 만들고 라우팅을 붙여가다 보니
“아… 이렇게 데이터가 흐르는구나” 하고 감이 잡혔다.
예전에 REST API 맛보기 했던 기억이 있어서
전체 흐름이 아주 조금은 머리에 들어왔지만
중간중간 꽤 막혔다.
(특히 ORM이 처음이라 Tortoise가 뭔지부터 찾아봐야 했다.)
ORM이 뭔지 알아보자
tortoise ORM
tortoise ORM - 모델신호,라우터부분 참고
Tortoise는 쉽게 말하면 파이썬 코드로 DB를 조작해주는 ORM
SQL을 직접 작성하지 않아도
Model.create(), Model.filter(), Model.delete() 같은 메서드를 호출하면
자동으로 SQL을 만들어서 DB에서 실행해준다.
강사님이 만들어 놓은 코드는 임시 리스트를 사용해서 CRUD 하는 형태였음.
logs = list_exercise()
이런 식으로 “가짜 데이터”였던 걸
진짜 ORM으로 아래 코드처럼 바꿔야 했다
logs = list_exercise() 이렇게 불러오는게 아니라
logs = await ExerciseLog.filter(user=user).order_by("-logged_at")
실제 SQL로는 INSERT INTO sleep_log ... 를 만들어 DB에 넣는데 ORM의 INSERT는 이렇게 구현된다.
await SleepLog.create(
user=user,
sleep_date=sleep_date_dt,
start_time=start_time_dt,
end_time=end_time_dt,
)
log = await SleepLog.get_or_none(id=log_id, user=user)
수정/삭제할 로그 찾을 때 없으면 None, 있으면 모델 인스턴스객체 반환함수정은 SQL UPDATE를 자동으로 실행한다
log.activity = activity
log.duration_min = duration_min
log.logged_at = datetime.fromisoformat(logged_at)
await log.save(update_fields=["activity", "duration_min", "logged_at"])
SQL의 UPDATE ... SET activity=?, duration_min=? ... WHERE id=? 이렇게 했던거
ORM이 알아서 만들어준다.
SQL: DELETE FROM meal_log WHERE id=? 쿼리문으로 이렇게 쓰는걸 그냥 간단하게
await log.delete()
이러면 디비에서 삭제됨
이런건 그냥 복붙이라 처음에만 헤맸는데
아래부터 검색과 지피티의 도움을 받음
HTML의 은
문자열 "2026-01-30T02:05" 형태로 들어오는데
이걸 DB의 DatetimeField가 받아들이려면
반드시 datetime 객체로 변환해야 함 변환 안하고 아무생각없이 스트링 char로 하니까 자꾸 오류남
datetime.fromisoformat(start_time)
이렇게 변환해줘야했음 오늘 반복해서 놓친 부분…
pages파일 상단 Dashboard부분에서 예전 mock 함수로 데이터를 넣고 있었음.
"exercise_logs": list_exercise() 이부분!
대시보드에서 여전히 list_exercise() 같은 mock 함수들을 쓰고 있었던 것…
그래서 실제 DB 데이터가 안 나오고 계속 에러 발생함
이걸 아래처럼 ORM 데이터로 바꿔줘야 정상 작동한다
exercise_logs = await ExerciseLog.filter(user=user).order_by("-logged_at").limit(5)
이렇게 해야 대시보드가 진짜 DB 데이터를 보여줌


흐름 요약한거 지피티한테 이미지 만들어달라했는데
글자 엉망으로 넣고 개 그지처럼 만들어서 그냥 내가 수정함.. 일 두번 하게 만드네
암튼 최대한 간단하게 정리해봤다 자세하게는 강사님이 올려주신 깃허브 리드미에 나와있음
나중에 수업들으면 새로 글 쓰면서 정리해야지
오늘 실습은 데이터가 어떻게 흐르고, 무엇이 DB에 저장되고, 어떻게 화면에 보여지는지
그 전체 구조와 순서를 이해하는 게 핵심이었다.
오늘처럼 틀이 다 준비된 실습도 처음엔 감 안잡혀서 막막하게 느껴졌는데
나중에 본 프로젝트 완전히 처음부터 구현해야 한다는 생각이 들어서 세상 걱정됨
그래도 막히면 찾고, 검색하고 뭐든 붙잡고 있다 보면 할 수 있겠지
나한텐 지피티도 있고..! 팀으로 하는거니까 동기들도 있고! 으 아쟈쟈쟈 할수이따 자기세뇌 해야지