오늘은 좀 글이 부실하네..
이제 데일리 퀴즈는 아무튼 간에 구현했다.
테스트까지 다 마친 상태.
이제 퀴즈에 대한 정답을 제출하는 api가 있어야 한다.
대충 리퀘스트의 바디에는 퀴즈 식별자와 게임의 이름을 적으면 될 것 같다.
근데 여기서 조금 생각할 부분이 있다.
# 일단 첫번째 - 게임 이름
게임의 이름이 변경된다면?
현재는 게임의 이름이 변경되었는지 감지하는 로직은 없다.
앞으로도 계획에 없는 부분이다.
사실 게임 이름이란게 자주 바뀌는 것도 아니고 바뀌는 걸 실제로 본 적도 없기 때문에 이 문제는 덮어도 좋을 것 같다.
# 그리고 두번째 - 게임 id
최종적으로는 게임 타이틀 자동완성을 도입할 예정이라 게임 id를 받아올 수 있다.
그렇다면 게임 이름 대신 id를 리퀘스트에 넣어서 보내면 안될까?
근데, 유저는 자동완성을 이용하지 않을 가능성이 있다.
너무 빨리 작성하고 싶은 경우 자동완성을 거치지 않고 바로 제출하고 싶을 것이다.
자동완성은 보조기능이고 서비스의 핵심기능이 아니니 꼭 거치지 않아도 되야 한다.
또, 의도적으로 이상한 게임 이름을 제출하고 싶을때가 있다.
“xxx” 같은거나 “asdfa”같이 그냥 아무생각 없이 제출하는 유저도 분명 존재한다.
이는 게임 id로 처리하기 어려울 것이다.
=> 결론적으로는 퀴즈 식별자와 게임 이름을 받기로 했다.
+추가 글) 퀴즈 정답을 제출하는 api를 테스트하는 코드를 작성하다가 고민이 생김
퀴즈에 할당된 게임을 찾을때, Quiz 모델에서 many to many로 연관관계가 매핑된 Screenshot모델을 조회한 뒤, 그 모델에 many to one으로 매핑된 Game모델을 조회해야 한다.
물론, orm을 사용하니까 쿼리를 직접 만들 필요까지는 없지만 그래도 좀 더 쉬운 방법이 없을까 고민이 된다.
quiz.game와 같은 방식으로 퀴즈에 간접적으로 매핑된 게임을 조회하고 싶다.
그러던 와중 sqlalchemy의 @hybrid_property라는 것을 발견했다.
https://docs.sqlalchemy.org/en/20/orm/extensions/hybrid.html
@property의 기능도 제공하면서 쿼리에도 넣을 수 있다고 한다.
>>> from sqlalchemy import select
>>> print(select(Interval.length))
SELECT interval."end" - interval.start AS length
FROM interval
>>> print(select(Interval).filter(Interval.length > 10))
SELECT interval.id, interval.start, interval."end"
FROM interval
WHERE interval."end" - interval.start > :param_1
진짜 신기한 기능이였다.
근데, 바로 복잡한 로직이 들어가는 것을 떠올렸고, 아무래도 DB에게 부담을 줄 것 같아서 좋지 않다고 보았다.
(복잡한 기능이 필요하다면 repository클래스나 service에서 하는게 좋다고 들었다.)
그렇다면 그냥 @property를 쓰는게 좋을 것 같다.
+@property를 쓰니 LazyLoading 문제가 날 또 괴롭혔다. -> 다음 포스트에서 계속
'프로그래밍 > 스팀 게임 퀴즈' 카테고리의 다른 글
# 12 백엔드 코드를 비동기로 바꾸다. (0) | 2024.01.08 |
---|---|
#8 HttpUrl vs str (0) | 2023.12.30 |
#7 테스트 코드 내 세션 관리 (0) | 2023.12.29 |
#5 테스트 데이터 만드는 법 (0) | 2023.12.27 |
#3 DB 세션에 대한 문제 (1) | 2023.12.25 |