비록 이 서비스가 그리 대단한 것은 아니지만 새로운 업데이트를 굳이 들고왔다.
게임 이름 자동완성에서 게임 이름만 가지고 검색하는건 좀 힘들 수 있다.
특히 우리가 영어를 잘 모를때 더 그렇다.
가령, “천수의 사쿠나히메” 라는 게임은 영문으로 “Sakuna: Of Rice and Ruin”고
“영걸전”은 “Sangokushi_Eiketsuden”로 팔리고 있는데 보통 영문은 잘 모르기 마련이다.
게임은 뭔지 알지만, 영문을 몰라, 그것도 스팀 상품에 등록된 게임 이름을 몰라 검색을 못하는 건 많이 섭하다.
때문에 게임에 별칭을 추가했다.
별칭은 당연히 여러개 일 수 있고, “카운터 스트라이크”와 같은 게임을 “카스”라고 부르거나 현지화된 이름으로 부르는 경우를 포함한다.
# 별칭은 어디서 구하나?
사실 이 서비스를 개발하던 도중 igdb라는 게임 데이터베이스 서비스를 발견했다.
이 서비스의 단점은 스팀 게임 대상이라 게임의 폭이 작은 것인데, 요 사이트에서 다루는 게임은 훨씬 폭이 더 크다.
그래서 아~ 원래 이걸로 할 껄! 이라 말하며 이를 조금 갈았지만, 스팀 게임이라는 것이 좀 매력적이지 않나? 라며 변명해본다.
아무튼 igdb에서 별칭을 구할 수 있게 되었다.
api도 있는데 트위치 계정만 있다면 무료로 쓸 수 있다.
아래 엔드포인트로 얻어온다.
https://api.igdb.com/v4/alternative_names
# 새로운 테이블과 cascade
Game 모델 객체는 여러개의 별칭을 가져야 하니까 GameAlias(테이블 명: game_alias)라는 모델 객체를 만들고, one to many로 연관관계를 매핑했다.
그랬더니 별칭을 업데이트 하는 로직에서 오류가 나왔다.
정확히하면 별칭을 업데이트 할때는 기존에 존재하는 별칭을 제거하기도 하는데(igdb에서 별칭이 삭제된 경우, 그런 일이 있는지는 잘 모르겠다), 이때 문제가 발생했다.
session.delete()를 이용해 별칭을 제거하는데, 이때 GameAlias를 바로 삭제하지 않고 연관관계 먼저 해제하는 듯 하다.
그래서 UPDATE game_alias SET game_id = NULL 을 실행하는데, 여기서 에러가 발생했다. game_id가 NOT NULL 옵션으로 되어있기 때문이다.
(사실 session.delete가 아닌 parent.childs.remove써도 내부적으로 session.delete함)
그래서 cascade를 all, delete-orphand로 변경했더니 해결되었다. (delete-orphan은 부모 객체에서 자식객체가 사라졌을때 자식객체를 삭제한다는 의미다. one to many일때 사용한다고 하며, 부모 객체의 id가 NOT NULL일때 쓰면 된다고 한다.
# 중복되는 별칭
igdb의 문제 같은데 별칭이 알고보니 같은 게 중복되서 존재했다!
The Elder Scrolls® Online라는 게임이 별칭으로 ESO라고 불린다고 하는데, 별칭이 중복되어 존재한다.
(game_id, name)에 대한 unique index가 있어서 망정이지 못찾을 뻔 했다.
더 이상한 것들도 있다. Universe Sandbox 2', 'Universe Sandbox ²’
파이썬 안에서는 문자열로 둘을 다르다고 구분하지만, Mysql에선 둘을 같다고 인식한다.
때문에 이 요상한 문자를 거르는 처리가 필요했다.
일단 처음에 써본 건 isalnum()이라는 함수다.
함수명만 봐서는 알파벳 혹은 숫자인지 확인하는 것 같지만, 더 포괄적이다.
alpha 부분은 문자를 의미해서 “가”, “日”, “Ā“도 받아준다.
num 부분은.. 숫자는 물론이고 “²”, “½”이런 숫자와 관련된 것들을 모두 받아준다.
결국 함수를 새로 만들어야 했다.
다행히도 “0”, “1”… “9” 과 같은 숫자인지만 확인하는 함수가 있다.
isdecimal이라는 함수다.
그래서 is_aldecimal이라는 isalpha와 isdecimal 중 하나가 맞으면 통과하는 함수를 만들었다.
'프로그래밍 > 스팀 게임 퀴즈' 카테고리의 다른 글
#25 서비스 개선 기획 (0) | 2024.03.18 |
---|---|
#23 게임 이름 검색에 대해서.. (0) | 2024.02.26 |
#22 백엔드와 프론트엔드를 배포했다! (0) | 2024.02.18 |
#20 데일리 퀴즈 생성 로직 방식에 대해서.. (0) | 2024.01.29 |
#19 게임 데이터 스크래핑 전략 수정하기 (1) | 2024.01.25 |