#16 Fastapi-users의 OAuth2 사용시 생기는 MissingGreenlet 오류
·
프로그래밍/스팀 게임 퀴즈
fastapi-users는 기본 매뉴얼이 비동기로 되어있어 비동기로 보통 작성하곤 한다. 그러면 sqlalchemy의 MissingGreenlet 오류를 자주 만날 수 있게 된다. MissingGreenlet 오류는 sqlalchemy에서 아래와 같이 설명된다. A call to the async DBAPI was initiated outside the greenlet spawn context usually setup by the SQLAlchemy AsyncIO proxy classes. Usually this error happens when an IO was attempted in an unexpected place, using a calling pattern that does not directl..
# 2 프로젝트 설계에 대한 고민
·
프로그래밍/스팀 게임 퀴즈
포스팅이 순서대로 올라오지 않는 이유 넘버링은 글을 작성하기 시작할때 부여하고, 포스팅은 글을 끝맺을 때 하기 때문입니다. 프로젝트를 많이 해보지 않아서 그럴까? 항상 프로젝트 설계는 고민이 된다. 얼마전에 fastapi 프로젝트 구조를 깃허브 레포에서 본적이 있다. https://github.com/zhanymkanov/fastapi-best-practices 이걸 참고 하려고 했지만, 이 구조는 유지보수 관점에서도, 테스트 관점에서도 어려운점이 있다. 모듈이 구현체를 직접 참조하기 때문에 ISP원칙이나 DIP원칙에 위배되는데, 이러면 기능을 추가할때 참조하는 모듈(상위 모듈)을 손봐야 할 수도 있고, 단위 테스트할때 목 객체를 만들기도 까다롭다. (몽키 패치 방식을 써야 하는데, 타입힌트도 안먹혀서 ..
#14 프론트 엔드 구축
·
프로그래밍/스팀 게임 퀴즈
프론트엔드는 화면에서 뭔가 보이니까 재밌긴 하다. 원래는 간단하게 프론트 엔드를 구축하고 대충 넘기려 했지만, 생각보다 프론트는 쉽지 않다. 처음에는 생성형 AI인 V0를 이용해서 리엑트 코드를 작성했다. 사실 프로젝트 시작부터 이를 사용할 것을 염두에 두고 있었고 빠르게 구현하는 것이 목표였다. 그래서 리엑트 프로젝트를 생성한 뒤, V0가 만들어준 코드를 복붙해서 실행해 보았다. 그러다 바로 문제가 발생했다. V0는 Next.js를 기반으로 하는 코드만 작성해 준다고 한다. 때문에, 다시 next.js 프로젝트를 만들어서 V0의 코드를 넣었다. 이렇게 된다. 매우 심플하고 보기 좋다. 그런데 여기서 좀 까다로운 일이 생겼다. 저 자동완성 입력 부분이 예상처럼 동작하지 않는다. 분명 구글 검색 창의 입력..
#13 비동기 SQLModel
·
프로그래밍/스팀 게임 퀴즈
SQLModel 자체가 비동기를 대단히 지원하지도 않아서 의미있는 내용을 담고 있지 않다. 그냥.. 그렇다 기대 노노 SQLModel을 사용하는 코드를 비동기로 다시 작성하다보니 이 라이브러리에서 비동기 프로그래밍이 좀 어렵다는 사실을 알았다. 아직 todo list에서 구현 예정 이라는 말 뿐이고, 좀 기다려야 할 것같다. 그래서 업데이트가 되기 전에 어떻게 비동기를 센스있게 다룰지 고민한다. 1. Model 클래스에서 해당 필드를 명시적으로 selectin or join으로 지정하기 class GameScreenshot(CreatedAtMixin, UpdatedAtMixin, SQLModel, table=True): __tablename__: str = "game_screenshot" id: int ..
# 12 백엔드 코드를 비동기로 바꾸다.
·
프로그래밍/스팀 게임 퀴즈
이번 글은 정리가 잘 안되어 있습니다. 보시기 전에 호흡을 가다듬고 테스트는 그동안 비동기로 작성하고자 했지만, 정작 내 코드는 비동기로 작성하지 않고 있었다. 엘라스틱 서치를 사용한다고 막 알아볼때 까지 말이다. 엘라스틱 서치에서는 AsyncElasticSearch라는 비동기 클라이언트를 제공한다. sqlmodel도 같이 AysncSession을 사용하고 있다. *비동기는 fastapi가 정확히는 unicorn이 알아서 해준다. 참고: 경로 작동 함수에서 필요한만큼 def와 async def를 혼용할 수 있고, 가장 알맞은 것을 선택해서 정의할 수 있습니다. FastAPI가 자체적으로 알맞은 작업을 수행할 것입니다. 어찌되었든, 상기 어떠한 경우라도, FastAPI는 여전히 비동기적으로 작동하고 매우 ..
#8 HttpUrl vs str
·
프로그래밍/스팀 게임 퀴즈
한줄 요약: HttpUrl 필드는 "haha"가 아닌 Url("haha")으로 (재)할당하자. 개발하다보니 Pyright 타입검사를 꺼두고 했다는 것을 알게 되었다. (내가 엄청 개발을 잘하는 줄 알았음) 그래서 켰더니 예상치 못한곳에서 오류가 나왔고, 괜찮은 해결책을 찾지 못했다. 문제는 HttpUrl 타입 때문이였다. 나는 단순히 검증을 위해 str대신 HttpUrl을 사용했었다. 그런데 HttpUrl 타입 변수에 스트링 값을 할당할때 아래와 같은 오류를 만날 수 있었다. “”” "list[str]" 형식의 인수를 "__init__" 함수에서 "list[HttpUrl]" 형식의 "screenshots" 매개 변수에 할당할 수 없습니다. “”” 오 이럴수가! 알고보니 HttpUrl는 Annotated[..
#7 테스트 코드 내 세션 관리
·
프로그래밍/스팀 게임 퀴즈
내용이 알차지도 아닌지라 포스팅은 꾸미지 않습니다. Quiz 모델에서 `game`이라는 @property 메서드를 만들고 난 뒤, 테스트 코드에서 사용했더니 아래와 같은 오류가 생겼다. sqlalchemy.orm.exc.DetachedInstanceError: Parent instance is not bound to a Session; lazy load operation of attribute 'game' cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3) 이는 Quiz모델에 세션이 바인딩 되지 않아서 발생한 오류였다. 사실 이 오류는 세션 관리에도 관련이 있는 문제였다. 내 테스트 코드에서는 기본 데이터를 저장하기 위해..
#6 퀴즈 정답 제출은 어떻게 할까?
·
프로그래밍/스팀 게임 퀴즈
오늘은 좀 글이 부실하네.. 이제 데일리 퀴즈는 아무튼 간에 구현했다. 테스트까지 다 마친 상태. 이제 퀴즈에 대한 정답을 제출하는 api가 있어야 한다. 대충 리퀘스트의 바디에는 퀴즈 식별자와 게임의 이름을 적으면 될 것 같다. 근데 여기서 조금 생각할 부분이 있다. # 일단 첫번째 - 게임 이름 게임의 이름이 변경된다면? 현재는 게임의 이름이 변경되었는지 감지하는 로직은 없다. 앞으로도 계획에 없는 부분이다. 사실 게임 이름이란게 자주 바뀌는 것도 아니고 바뀌는 걸 실제로 본 적도 없기 때문에 이 문제는 덮어도 좋을 것 같다. # 그리고 두번째 - 게임 id 최종적으로는 게임 타이틀 자동완성을 도입할 예정이라 게임 id를 받아올 수 있다. 그렇다면 게임 이름 대신 id를 리퀘스트에 넣어서 보내면 안될..
2jun0
'프로그래밍/스팀 게임 퀴즈' 카테고리의 글 목록 (2 Page)