[Project] 한글 끝말잇기 AI 안드로이드 앱 02. Open API와 코루틴을 이용한 단어 검사


개요

본격적인 게임화면과 끝말잇기 AI 를 구현해보도록 하자.


채팅 형식

0

게임 방식은 위 사진과 같이 채팅 형식으로 구현했다. 채팅의 큰 틀은 RecyclerView 를 깔고간다. 하지만 의 채팅과 enphago의 채팅 레이아웃이 다르므로 RecyclerViewitem_layout 을 2개 만들어주어야 한다. 또한 한 리사이클러뷰에서 2가지 레이아웃을 사용하므로 holder 도 각각 하나씩 총 2개를 구현해주어야 한다.


단어 검사


1

플레이어가 입력한 단어가 유효한 단어인지는 국립국어원 한글표준어대사전 Open API 를 사용하였다. 본 API 는 단어를 검색하면 단어의 품사, 정의, 분야 등의 정보를 제공한다.

2

단어 검사는 다음과 같은 과정으로 이루어진다. 검사 시 앱 내부에서만 검사가 이루어지는 과정이 있고 API 를 사용하여 검사하는 과정이 나눠져있다.

  • 공백 입력
  • 2글자 미만
  • 끝말일치 여부
  • 중복 여부

위 4가지는 모두 앱 내부에서 검사가 이루어진다. 공백, 글자 수, 끝말일치와 같은 경우에는 단순히 문자열 비교를 통해 이루어진다. 이 때 끝말일치와 같은 경우는 두음법칙 을 고려하는데 세부적인 것은 추후 다음 포스트에서 설명하겠다. 마지막 중복 검사는 지금까지 사용된 단어들을 set 집합 자료구조에 모두 저장하고 여기서 검색하는 방식으로 이루어진다.

위 검사를 모두 통과하면 표준국어대사전의 open api 를 이용해 입력된 단어가 존재하는 단어 인지와 명사 인지를 검사한다.

3

api 는 위와 같은 결과를 제공하는데 여기서 단어 검사를 하기 위해 살펴봐야할 태그는 total 태그와 pos 태그이다. 각각 검색 결과 수품사 를 의미한다. 검색 결과 수가 0건이면 존재하지 않는 단어이고, 품사가 명사(또는 대명사와 수사)가 아닐 경우 적합한 단어가 아니라고 판단할 수 있다. enphago의 부가기능인 단어 뜻 검색 기능에서는 worddefinition 태그를 사용하는데 이는 추후 다음 포스트를 통해 소개하겠다.

4

위 코드는 단어를 검사하는 실제 코드의 일부를 간략화 한 것이다. 단어 검사를 담당하는 CheckWord 클래스를 따로 두고 결과에 따른 상수 들을 따로 정의하여 when 조건 분기문을 통해 처리했다. 결괏값이 OK 면 채팅을 업데이트하고 턴 수를 늘린다. 이 외의 경우에는 결괏값에 따라 Toast 메세지를 출력한다.


코루틴을 이용한 백그라운드 작업

Open API 를 통해 단어를 검사하는 과정에서 네트워크가 사용된다. 안드로이드 에서는 네트워크 작업을 메인 UI 쓰레드 에서 처리하면 자동으로 런타임 에러를 뿌린다. 해당 네트워크 작업이 진행되는 동안 앱 화면이 멈춘 것처럼 보이기 때문에 안드로이드는 이러한 개발 방법을 원천 차단했다. 따라서 이러한 작업을 백그라운드 에서 멀티 쓰레딩을 통해 진행해야 한다.

5

Kotlin 에서는 Coroutines 라는 편리한 멀티 쓰레딩 기법을 지원한다. 코틀린 자체에도 독자적인 비동기 프로그래밍을 지원하지만 코루틴이 훨씬 직관적이고 편리하다. 위에서 잠시 살펴본 코드에서 when문은 사실 통째로 코루틴 scope 안에 들어가있고 checkWord 클래스의 check 함수 또한 코루틴의 suspend 키워드와 withContext 를 통해 백그라운드에서 단어 검사가 완료될 때까지 기다린 후 결과가 나오면 값을 반환한다.

6

위 코드는 단어를 검사하는 코드 중 일부를 그대로 발췌한 것이다. 정말 간단하다.


마무리

여기까지 프로젝트를 진행하는 동안 지금까지 익숙하지 않았던 기술들을 사용하느라 정말 공부가 많이 됐다.

  • open api 사용
  • xml 파싱
  • 코루틴
  • 백그라운드 네트워크 작업

애를 많이 먹기도 했지만 어쨌든 구상했던 그대로 구현을 완료했다. 다음은 enphago 의 대답을 구현해보자.


Github 저장소: https://github.com/yjyoon-dev/enphago-android

0%