StratoSphere Stream

구글의 dialogflow를 이용해서 앱을 만들 수 있는 것은 아마 한국 블로그에서는 많지 않을 것이다.

결론적으로는 구글 어시스턴트에 올릴수 있는 앱을 dialogflow로 만들 수 있다.


이 글은 그 과정을 담은 글이다. 시행착오가 거의 없었기에 2일정도지만

실제로는 미래 개발해 보는 과정을 하지 않았다면 1~2주 걸리지 않았을까 싶다.


우선 필요한 것은 다음과 같다.


1. nodejs (자바스크립트)


2. dialogflow 계정, 이니까 구글 계정


이정도이다.


우선개발할 앱을 생각했는데, 간단한 앱은 나중에 만들었고(나중에 등장할 로또번호 생성기이다.)

러시안룰렛 게임을 만들었다. 이걸 선택한 이유는


 - 게임의 규모가 크지 않고

 - 로직이 개발할 정도로 할만하고

 - 결정적으로 그게 정당


하다고 느꼈기 때문이었다.


결론적으로 dialogflow의 느낌은 다음과 같이 만들었다. 


dialogflow는 개발에 있어서 도식화를 하는게 중요하다. 그걸 context로 구별을 해 줘야 한다.

그래서 미리 파워포인트나 구글 프레젠테이션으로 만드는 것이 필요하다. 그래야 햇갈리지 않으니까.



만들어진 dialogflow이다.

이정도 flow로 작동이 된다. 


이 부분은 첫 동작시 받는 부분이다.

이건 webhook를 썼기 때문에 TEXT RESPONSE부분에 아무것도 없다.

webhook의 로직에서 대답을 만들 것이니 말이다. 





이건 끝내기나 게임종료를 말하면 동작하는 intent

이 역시 webhook로 동작을 한다. 

저 말을 하면 webhook의 로직이 있는 곳으로 가서 ask.tell로 종료를 한다.



게임시작을 누르면.. 거의 webhook이다. 



이 부분을 뜯어보면 좀 이해가 될 수있는데

우선 Context는 한국어로는 '의도'로 풀이된다.

이 Context에 value를 집어넣을 수 있다. 

또 Context를 이용해서 동작할 intent를 구별할 수도 있다.

즉 context를 얼마나 잘 이해하고 쓰냐에 따라서 앱을 잘 만들수도

못만들 수도 있다.


input Context들어오는 Context가 위와 같고 텍스트가 같다면 동작을 하는 것으로 추측한다.

왜 추측이냐면 정말 그런지는 확인하지 않았기 때문(..)

하지만 80%정도는 그런거 같다. 


output Context는 저 로직이 실행 된 후 만들 context이다.

숫자는 지정이 가능한데, 몇턴이나 Context를 유지할 것이냐를 적는 것이다.

3이라고 적는다면 Context는 3번 유지가 된다. 물론 다른 intent에서 똑같은 이름의 Context가 아웃풋이라면

다시 lifespan은 갱신된다. 


원래는 Entities로 1부터 6까지 정하는게 맞지만

그냥 귀찮아서(..) SYSTEM에 기본으로 있는 엔티티를 썼다.

시스템 엔티티가 좋긴 한데 몇가지 허접한 것이 있어서 

만약 정교하게 만들고 싶다며 따로 만들어야 할 것이다.

예를들면 시스템 엔티티중 country가 있는데

한국에 대한 처리가 좀 이상하다. korea를 말하면 south korea로 뜬다. north korea에 대한 처리가 애매하다.


User says에는 이걸 말하면 동작하게 할 것을 지정한다.

여기서는 시스템 엔티티를 썻고 노란색으로 표식되 있다.


액션이름은 로직에서 구분하게 될 이름이다. 특별한 사유가 없으면

그냥 intent이름하고 같이 짓는게 그럭저럭 이해하기 좋다.


그리고 그 아래에는 파라메터 이름이 보이는데 그게 로직에 쓰일 이름이다.

저건 let values = app.getArguments('number'); 이런식으로 받는다.

이런건 레퍼런스 문서를 참조하면 다 나오니 링크를 참조 하길 바란다. 





나의 경우는 nodejs는 그냥 관심이 있어서 (요즘 뜨는거 같이 보여서) 공부를 했지만

한달밖에 공부를 하지 못했다. callback에 대한 이해도 부족하고

결정적으로 nodejs를 db연결 정도 까지만 배운지라 사실상 java하던 실력으로 로직을 만들었다.

java도 1년도 안했으니 사실상 캣판으로 만든 셈.


로직에 대해서는 GitHub를 참조하면 된다.





이 부분은 fallback이다. 만약 숫자가 아닌 말을 하면 저게 동작을 한다. 


Webhook에 체크가 되있으니 이에 대한 대답 또한 거기서한다.

이제 webhook체크된 것은 딱히 말하지 않겠다. 


fallback은 특별히 텍스트가 필요없다.






이 부분은 Webhook서버 부분이다.

지금은 google cloud의 cloud function을 썼는데 사실 아래의 내용에 써도된다.

그건 로또 앱 만들때 설명하겠다. 



따로 만든 엔티티가 없기 때문에 비어있다.

원래는 1부터 6까지만 따로 만들어야 한다.



테스트를 위해서 구글 어시스턴트를 활성화 시킨다 그리고 세팅을 클릭



모두 체크를 해주고 업데이트 드레프트를 클릭




시뮬레이션을 클릭해서 시뮬레이션을 하면 된다. 


로직단은 github에 올렸다

링크를 클릭하면 볼수 있다. 다 인덱스에 때려박음.

이번 앱에서는 별별 실험을 하느라 SSML도 써봤다. 

그 부분에 대한 설명은 나중에 포스팅으로 하겠다. 


사실 앱의 개발보다는 테스트 시간이 더 걸렸다.

이걸 제대로 안하면 제출해도 reject당해버리니 테스트는 철저히 하는게 좋다.



마지막으로는 앱을 제출하면 된다.



우선 name과 pronunciation은 같은 이름으로 적었다. app name은 !정도는 들어갈 수 있다. 

하지만 달라지면 곤란하니 일단 같이 적었다.


앱의 이름의 경우 규정에 걸리는 이름[각주:1]은 사용할 수 없다.

규정에 대한 링크는 

https://developers.google.com/actions/console/publishing

https://developers.google.com/actions/console/brand-verification


등등에 나와있으니 읽어보면 된다. 


detail은 이 앱의 용도를 적으면 된다.


목소리는 남성과 여성 하나만 존재하는데 그중 여성으로 설정


Short description은 앱에 대한 간단한 설명을 적었다. 

Full description은 앱에 대한 자세한 설명을 적었다. 남들이 알아 볼 수있을만큼 충분히 적으면 ok



컨텐츠의 회사명을 policy링크는 구글 문서로 만들어도 되고 결론적으로는 링크를 연결해서 보이게 만들면 된다.

나는 회사 이름하고 앱 이름을 동시에 넣고 "아무것도 저장하지 않습니다 그냥 즐기세요." 라고 적었다.

DB에 저장하고 요구하는 등의 목적이 없다면 그렇게 심각한 내용을 적지 않아도 된다.



이 부분은 기본 invocation을 적어도 되는데 동작한 invocation을 적어도 된다.

물론 시뮬레이션에서 테스트 해봐야 하고, 된것을 적으면 된다.



마지막으로 카타고리를 확인한다 보통은 구글 play 앱을 검색해서 카타고리를 참조하는 편인데

같은 회사이니 거의 비슷하겠지 뭐...하는 생각이다. 


for families는 미국은 COPPA법이 있어서 그렇다. 13세 이하, 그러니까 초등학교6학년을 목적으로 했다면 체크를 해줘야 한다.

이런 경우 아마 부모 동의하에 이용이 가능하게 되는 것으로 보인다. 



다 끝나면 제출을 하면 된다

저 버튼을 누르면 제출완료





그럼 심사중이 뜬다


Version1로 깔끔하게 통과. 



  1. 예를 들면 브랜드이름은 브랜드를 소유한 사람이 쓸수있다던가 [본문으로]

Comment +2