โ ๋น ์ค๋น ์บก์์ ์ฌ์ฉํ๊ฒ ๋ ์ด์
google assistant api ์๋น์ค ์ข ๋ฃ๋ผ๋??
์กธ์
์ํ์์ ์์ฑ๋ช
๋ น์ผ๋ก apiํธ์ถ์ ํด์ผ ํ ์ผ์ด ์์ด์ google assistant api๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ณํํ์๋ค.
google assistant api ๊ฐ๋ฐ์ ์ํด ๊ณต์๋ฌธ์์ ๋ค์ด๊ฐ๋๋ ๋กํ๋ 6์13์ผ์ ์ง์์ด ์ข
๋ฃ๋๋ค๊ณ ๋์์์๋ค....
์ฌ์ค ์กธ์
์ํ ๊ตฌ์ ๋ฐํ๋ 5์26์ผ์ด๋ผ์ google assistant api๋ฅผ ์ฌ์ฉํด๋ ๋ฌธ์ ๋ ์์์ง๋ง ๋
ธ๋ ฅํด์ ์๋ก์ด ๊ฒ์ ์ต๋ํ๋๋ฐ ํ๋ฌ๋ ์๋ผ์ ์์ด์ง๋ค๋ฉด ๋๋ฌด ์ฌํ์ง ์์๊ฐ๐
๊ทธ๋์ google assistant api๋ฅผ ๋์ฒดํ ์ ์๋ ๊ฒ์ ์ฐพ์๋ณด๋ ์ค ๋น
์ค๋น ์บก์์ด๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค!!
๋น ์ค๋น ์บก์์ ๊ฐ๋ฐ์ ๊ณต๋ถํด์ผํ๋ค๋,,,
๋์ฒด์ ๋ฅผ ์ฐพ์์ ์ ๋ง ๋คํ์ด์์ง๋ง ๋น๊ต์ ๋ ํผ๋ฐ์ค๊ฐ ๋ง์ด ์๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ฝ๊ฐ์ ๊ฑฑ์ ์ด ์๊ฒผ๋ค. ๊ฒ๋ค๊ฐ ์ง๊ธ ์ด๊ฒ ๋ง๊ณ ๋ ์ฐ๊ตฌ์ค ํ๋ก์ ํธ, ์ฝ๋ฉํ ์คํธ ์ค๋น, react ๊ณต๋ถ ๋ฑ ํด์ผ ํ ์ผ์ด ํ์ฐ์ธ๋ฐ ์ด๊ฑด ์ธ์ ๊ณต๋ถํ์ง? ๋ผ๋ ๊ฑฑ์ ๋ํ ์์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ๊ฒฐ์ ์ ์ด์๋ ๋ฌธ์ ๋ ๋น ์ค๋น ์บก์์ ๊ณต๋ถํ๊ณ ์ถ์ ๋๊ธฐ๊ฐ ์์๊ธด๋ค๋ ๊ฒ์ด์๋ค. 4ํ๋ ์ด ๋ ์ดํ๋ก๋ ๊ณต๋ถ๋ฅผ ํ๊ธฐ ์ ์ ํ ๊ฐ์ง ์ฌํญ์ ๊ณ ๋ คํ๊ฒ ๋์๋๋ฐ ๊ทธ๊ฒ์ ๋ฐ๋ก '์ง๊ธ ๋ด๊ฐ ๊ณต๋ถํ๋ ค๋ ๋ด์ฉ์ด ์ทจ์ ์ ๋์์ด ๋๋๊ฐ?' ๋ผ๋ ๊ฒ์ด์๋ค. ์๋ฌด๋ฆฌ ์๊ฐํด๋ด๋ ๋์ค์ ์ทจ์ ํด์ ์ด๊ฑธ ์จ๋จน์ ์ผ์ ์์ ๊ฒ ๊ฐ์๋ค. ๋ชจ๋ ๋ฐฐ์์๋ ๋ค ์ธ๋ชจ๊ฐ ์์ง๋ง ์๊ฐ์ด ์ด๋ฐํด์ง๋ ๋ฐฐ์๋ ๊ฐ๋ ค์ ํ๊ณ ์ถ์ ์๋ง์ด ์๊ฒจ๋ฒ๋ ธ๋ค๐ฅฒ ํ์ง๋ง ๋ด ๋ง์์ด ์ด๋ป๋ ์กธ์ ์ํ์ ์๋ฃํด์ผํ๋ค. ์์ฑ ๋ช ๋ น์ ๋ฃ์ง ์๊ณ ๋ ์์ฑํ ์ ์๊ธด ํด๋ ํ๊ธฐ์ซ๋ค๋ ๋ง์ ๋๋ฌธ์ ์์ฑ๋ ๋ฎ์ ์กธ์ ์ํ์ ๋ฐํํ๊ณ ์ถ์ง ์์๋ค. ๊ทธ๋์ ์ํํ ํ์ต์ ์ํด ๋๊ธฐ๋ถ์ฌ๊ฐ ํ์ํ๋ค. ๋์๊ฒ ๊ฐ์ฅ ํฐ ๋๊ธฐ๋ถ์ฌ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ ์๋ง์ด๋ค. ๋น ์ค๋น ์บก์๋ก ๋ฌด์์ ๋ง๋ค ์ ์๋์ง ์๊ฐํด๋ณด๋ ๋ด ๋ฐฉ์ ์๋ ์ ์๊ธฐ๊ธฐ๋ฅผ ์ ์ดํ ์ ์๋ ์๋ฏผ ํ ์บก์์ ๋ง๋ค๋ฉด ์ฌ๋ฏธ์์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ์์ง ๊ตฌ์ฒดํ ๋ ๊ฒ์ ์์ง๋ง ๋ง๋ค๊ณ ์ถ์ ๋์์ด ์๊ธด ๊ฒ ๋ง์ผ๋ก๋ ํ์ต์ ๋ํ ๋๊ธฐ๊ฐ ๋ ์ ์์๋ค.
๐ ๋น ์ค๋น ์บก์ ๊ฐ๋ฐ ํ ๋ ์ฐธ๊ณ ํ ๊ฒ
๊ณต์๋ฌธ์๋ ๋๋ฌด ๊น๋ํ์ง๋ง ํ๊ธ๋ฒ์ญ์ด....
๊ณต์๋ฌธ์๋ ๊ต์ฅํ ๊น๋ํ๊ฒ ์ ์ ๋ฆฌ๋์ด ์์๊ณ ์์ด๋ก ๋์ด์์๋ค. chrome ๋ธ๋ผ์ฐ์ ์๋ ๋ฒ์ญ์ด๋ผ๋ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์ด ์์ง๋ง ๋น ์ค๋น ์บก์ ๊ณต์๋ฌธ์์์๋ ์ด๊ฒ์ด ํฐ ๋์์ด ๋์ง ์์๋ค. ๋ฒ์ญ ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ๋ฉด ์ฌ์ดํธ๊ฐ ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ ๊ฒ์ด์๋ค. ๊ทธ๋์ ์ด์ฉ ์ ์์ด ์์ด๋ก ๋ ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ๊ฐ๋ฐํด์ผ๋ง ํ๋ค.
Bixby Developers ์ ํ๋ธ
์ ๋ง ๋ง์ ๋์์ด ๋๋ ์ ํ๋ธ!! ํ๊ตญ์ด๋ก ์น์ ํ๊ฒ ๊ฐ์๊น์ง ํด์ฃผ์๋ ๊ฐ๋ฐํ๋๋ฐ ์ ๋ง ๋ง์ ๋์์ด ๋๋ค. ํ์ง๋ง 3๋ ์ ์์์ด๋ค ๋ณด๋ ํ์ฌ์ ์ฝ๊ฐ ๋ค๋ฅธ ๋ถ๋ถ๋ ์์๋ค. ๊ทธ ์ค ํ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ๋ฒ์ ์ด ๋ฌ๋ผ์ก๋ค๋ ๊ฒ์ธ๋ฐ, ์์์ ๋์จ ์ฝ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ๋ฒ์ 1์ ์ฌ์ฉํ๊ณ ์๋ค. ํ์ฌ ๋น ์ค๋น ์บก์์์๋ ES 2020 ๋ฒ์ ์ ์ง์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ๋ฒ์ 2๊ฐ ์ ๊ณต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์๋ง ๋ฐ๋ผํ๋ฉด์ ๊ฐ๋ฐํ์ง ๋ง๊ณ ๊ณต์๋ฌธ์๋ฅผ ํจ๊ป ์ฝ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
๋น ์ค๋น ์บก์ ์ํ
๋น
์ค๋น ์คํ๋์ค๋ฅผ ์ค์นํ๊ณ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋ ๋น
์ค๋น์์ ์ ๊ณตํ๋ ์ํ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ์๋ค.
ํ์ง๋ง ์ด ์์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ๋ฒ์ 1์ ์ฌ์ฉํ๊ณ , ์ฌ์ง์ด ์ฐ๊ฒฐ๋ ์๋ฒ๋ ๋์ํ์ง ์๋๋ค.
์ ์ง๋ณด์ ํด์ฃผ์ธ์!

ํ์คํ ๊ฐ๋ฐํ ๋ ์ต๊ณ ์ ์ฐธ๊ณ ์๋ฃ๋ ๋ ํผ๋ฐ์ค ์ธ ๊ฒ ๊ฐ๋ค!! ์ด ์์ ์ฝ๋ ๋๋ถ์ ์ ์ฒด์ ์ธ ํ๋ฆ์ ์ดํดํ๋๋ฐ ๋ง์ ๋์์ด ๋๋ค.
๐Http Get ์์ฒญ ๋ณด๋ด๊ธฐ
ํ์ฌ ๋ด๊ฐ ์กธ์
์ํ์์ ๋ง๋ค์ด์ผ ํ ๊ฒ์ ์์ฑ ๋ช
๋ น์ผ๋ก ๋ฆฌ๋ง์ธ๋ ์กฐํ์ ๋ฑ๋ก์ ํ๋ ๋น
์ค๋น ์บก์์ด๋ค.
์ผ๋จ ์ด๋ฒ ํฌ์คํธ์์ ๋ค๋ค ๋ณผ get ์์ฒญ์ baseURL/api/reminder/title๋ก get ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ์์ response๋ฅผ ๋ด๋ ค ์ฃผ๋ api ์ด๋ค.
[
{
"title": "์ค๋์ ๋ฆฌ๋ง์ธ๋1"
},
{
"title": "์ค๋์ ๋ฆฌ๋ง์ธ๋2"
}
]0. ๋น ์ค๋น ์ฝ์์ ์บก์ ๋ฑ๋กํ๊ธฐ
๋น
์ค๋น ์บก์์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋น
์ค๋น ๊ฐ๋ฐ์ ์ฝ์์ ์บก์์ ๋ฑ๋กํด์ผ ํ๋ค.
๋น
์ค๋น ๊ฐ๋ฐ์ ์ฝ์
์ ๋งํฌ์ ๋ค์ด๊ฐ์ ๋จผ์ ํ์ ์์ฑํ๋ค.
์ฌ๊ธฐ์ namespace ๋ถ๋ถ์ด ์ค์ํ๋ค. ์๋ํ๋ฉด ๋น
์ค๋น ์บก์์ ๋ง๋ค ๋ namespace.project์ ์ด๋ฆ์ผ๋ก ๋ง๋ค์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ ์์ฑํ์ผ๋ฉด Register New Capsule ๋ฒํผ์ ๋๋ฌ์ ์บก์์ ๋ฑ๋กํ๋ค.
1. ๋จผ์ ๋ชจ๋ธ๋ง์ ํด์ผํ๋ค.
๋น
์ค๋น ์บก์์ ์ฒ์ ์์ฑํ๋ฉด ์์ ๊ฐ์ ์ํ๊ฐ ๋๋ค.
์ฐ์ http get ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํด ์ต์ํ์ ๋ถ๋ถ์ ์ค๋ช
ํด๋ณด๊ฒ ๋ค.
1-1. models์ด ๋ญ๋ฐ??
- actions
- ๋น ์ค๋น๋ฅผ ํ์ต์ํฌ ๋ ํ์ต์ํฌ ๋ฌธ์ฅ์ ๋ํ ์ก์ ์ ๋งคํ์ํจ๋ค. ์ด ๋ ๋งคํ์ํค๋ ๊ฒ์ด ์ด๊ณณ์ ์๋ ์ก์ ์ด๋ค.
- ์ก์ ์๋ ์ด๋ค input์ด ๋ค์ด์ค๊ณ ์ด๋ค output์ด ๋๊ฐ๋์ง ๋ช ์ํด๋๋ค. ์ด๊ณณ์ ์ ์ถ๋ ฅ์ ์ปจ์ (ํ์ ๊ฐ์๊ฑฐ) ๋ํ ๋ช ์ํ๋ค.
- concepts
- ์ปจ์
์ ๋น
์ค๋น ์บก์์์ ์ฒ์ ๋ค์ด๋ณธ ์์ํ ๊ฐ๋
์ด์ง๋ง ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํ์
๊ณผ ๋น์ทํ ๋๋์ธ ๊ฒ ๊ฐ๋ค. ์ปจ์
์๋ ๋ ๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค.
- primitive: ๊ธฐ๋ณธํ ํ์ , ํ ์คํธ๋ ์ซ์
- structure: C์ธ์ด์ ๊ตฌ์กฐ์ฒด ๊ฐ์ ๋๋์ผ๋ก ์ดํดํ๋ฉด ํธํจ. ๋ค๋ฅธ primitive ์ปจ์ ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์.
- ์ปจ์
์ ๋น
์ค๋น ์บก์์์ ์ฒ์ ๋ค์ด๋ณธ ์์ํ ๊ฐ๋
์ด์ง๋ง ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํ์
๊ณผ ๋น์ทํ ๋๋์ธ ๊ฒ ๊ฐ๋ค. ์ปจ์
์๋ ๋ ๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค.
1-2. concepts๋ฅผ ๋ง๋ค์ด๋ณด์!
๋น
์ค๋น ์บก์๋ก ๋ฆฌ๋ง์ธ๋๋ฅผ ์กฐํํ๋ฉด title์ ๋ฆฌ์คํธ ํํ๋ก ๋ณด์ฌ์ค ์์ ์ด๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ๋ ๊ฐ์ง์ ์ปจ์
์ด ํ์ํ๋ค.

text (Title) {
description (๋ฆฌ๋ง์ธ๋ ์ ๋ชฉ)
}Title.model.bxb์๋ ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ด๋ primitive ํ์
์ผ๋ก ๋ฆฌ๋ง์ธ๋์ ์ ๋ชฉ์ด ๋์ด์ค ๊ฒ์ด๋ค.
structure (Reminder) { //๊ตฌ์กฐ์ฒด ์ปจ์
์ ์ด๋ฆ
description (๋ฆฌ๋ง์ธ๋ ๋ชจ๋ธ ์ ์)
property (title){ //ํ๋กํผํฐ์ ์ด๋ฆ
type(Title) //primitive ์ปจ์
๋ช
min(Required)
}
}Redminer.model.bxb์๋ ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ด๋ structure ํ์
์ผ๋ก primitive ํ์
์ธ Title์ ํฌํจํ๊ณ ์๋ค.
1-3. ์ปจ์ ์ ๋ง๋ค์์ผ๋ ์ก์ ์ ๋ง๋ค์ด๋ณด์!
์ก์
์์ ์ด๋ค ์
์ถ๋ ฅ์ด ๋ค์ด์ค๊ณ ๋๊ฐ๋์ง ๊ฒฐ์ ํ๋ ์ปจ์
์ ๋ง๋ค์์ผ๋ ์ด์ ์ก์
์ ๋ง๋ค์ด๋ณผ ์ฐจ๋ก๋ค.
์ก์
์ models/actions ๊ฒฝ๋ก ์์ GetReminder.model.bxb๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ง๋ค์๋ค.
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
action (GetReminder) {
description (GET Reminder from server) //์ค๋ช
๋ถ๋ถ
type(Search) //์ก์
์ ํ์
output (Reminder) //์๊น ๋ง๋ ์ปจ์
}์ ์ฝ๋๋ฅผ ์ค๋ช
ํ์๋ฉด GetReminder๋ผ๋ ์ก์
์ ๋ง๋ค๊ณ ์ก์
์ ํ์
์ Search๋ก ์ง์ ํ๋ค.
์ฌ๊ธฐ์ ์ก์
์ ํ์
์ด๋ ๋ฌด์์ด๋๋ฉด, ์ก์
์ด ์ด๋ค ์ผ์ ์ํํ๋์ง ๋ช
์ํ๋ ๋ถ๋ถ์ด๋ค.
ํ์
์ ์ง์ ํ์ง ์๋๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก Search ํ์
์ผ๋ก ๊ฒฐ์ ๋๋ค.
์ด๋ค ํ์
์ด ์๋์ง๋ ์ด ๋ฌธ์์์ ์ดํด๋ณผ ์ ์๋ค.
output ์๋ ์๊น ๋ง๋ ์ปจ์
์ธ Reminder๋ฅผ ์ง์ ํด์คฌ๋ค.
์ด ๋ง์ GetReminder์ ๊ฒฐ๊ณผ๊ฐ์ ํ์
์ด Reminder๋ผ๋ ๋ป์ด๋ค.
2. ๋ชจ๋ธ๋ง์ด ๋๋ฌ์ผ๋ฉด ์ฝ๋๋ฅผ ์์ฑํ ์ฐจ๋ก
2-1. http get ์์ฒญ์ ๋ณด๋ด๋ javascript ์ฝ๋ ์์ฑํ๊ธฐ
์ฝ๋ ๋ถ๋ถ์์๋ ์๊น ๋ง๋ ์ก์
์ด ์ด๋ค ์์
์ ์ํํ ์ง ๊ฒฐ์ ํ๋ค.
์ฝ๋ ๋ถ๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด๋ก ์์ฑํ๋ค.
code/ ๊ฒฝ๋ก ์์ GetReminder.js๋ผ๋ ํ์ผ์ ์์ฑํ๋ค.
ํ์ผ๋ช
์ ์ก์
๊ณผ ๋์ผํ๊ฒ ํด์ฃผ์ด์ผ ํ๋ค.
import http from 'http';
export default function () {
return http.getUrl('baseURL/api/reminder/title', {format: 'json'});
}์๋ฒ ์ฃผ์๋ก get ์์ฒญ์ ๋ณด๋ด ์๋ต์ ๋ฐ์์จ๋ค. ์๋ต์ ํฌ๋งท์ json์ผ๋ก ์ค์ ํ๋ค.
2-2. endpoint ์ค์ ํ๊ธฐ
resources/base/endpoints.bxb๋ผ๋ ํ์ผ์์ ์ก์
์ ์๋ํฌ์ธํธ๋ฅผ ์ง์ ํด์ค์ผ ํ๋ค.
์๋ํฌ์ธํธ๋ 1-3์์ ๋ง๋ ์ก์
๊ณผ 2-1์์ ๋ง๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋งคํ์์ผ์ฃผ๋ ์ญํ ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ก์
์ผ๋ก ๋ค์ด์ค๋ input์ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ input๊ณผ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์ญํ ๋ ํ๋ค.
endpoints.bxb๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด ์ค๋ค.
endpoints {
action-endpoints {
action-endpoint (GetReminder){
accepted-inputs ()
local-endpoint (GetReminder.js)
}
}
}3. ์ด์ ๋น ์ค๋น๋ฅผ ํ์ต์ํฌ ์ฐจ๋ก!
3-1. ํ์ต์ํค๊ธฐ ์ ์ target์ ํ๊ตญ์ผ๋ก ๋ณ๊ฒฝํด์ฃผ์
capsule.bxb๋ผ๋ ํ์ผ์ ๋ณด๋ฉด target (bixby-mobile-en-US) ์ด๋ผ๋ ๋ถ๋ถ์ด ์๋ค.
์ด ๋ถ๋ถ์ target (bixby-mobile-ko-KR)์ผ๋ก ๋ณ๊ฒฝํด์ค๋ค.
๊ทธ ๋ค์ Training์ ๋ค์ด๊ฐ์ Training Source๋ฅผ ์ถ๊ฐํด์ค๋ค.

3-2. ์ด์ ํ์ต์ํค์!
์๋ ์ฌ์ง ์์๋๋ก ์
๋ ฅ์ ํ๋ค.

๊ทธ๋ผ ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋์จ๋ค.
์ฌ๊ธฐ์ GOAL ๋ถ๋ถ์ด ์๋ฏธํ๋ ๊ฒ์ "๋ฆฌ๋ง์ธ๋ ์กฐํํด์ค" ๋ผ๋ ์์ฑ ๋ช
๋ น์ด ๋ค์ด์์ ๋
์ด๋ค ์ก์
์ ์คํ์์ผ์ผ ํ๋์ง ๊ฒฐ์ ํ๋ ๋ถ๋ถ์ด๋ค.
์ด ๋ถ๋ถ์ ์๊น ์์ฑํ ์ก์
์ธ GetReminders.model.bxb๋ฅผ ๋์์์ผ์ค๋ค.
๊ทธ๋ผ ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋ํ๋๊ณ , ์ค๋ฅธ์ชฝ ์์ save ๋ฒํผ์ ๋๋ฌ์ ํ์ต์ ์ ์ฅํ๋ค.
save ๋ฒํผ์ ๋๋ฅธ ํ Training ํ๋ฉด์ ๋ณด๋ฉด ์์ง ํ์ต๋์ง ์์ ํญ๋ชฉ์ด ์๋ค.
Compile NL Model์ ๋๋ฌ์ ํ์ต์ํจ๋ค.
4. Views ๋ง๋ค๊ธฐ
๋ชจ๋ธ๋ง๋ ํ๊ณ ํ์ต๋ ์์ผฐ์ผ๋ฉด ๋์ํ ๊ฒ ๊ฐ์ง๋ง ์์ง ํ ๊ฐ์ง ๋ ํ ์ผ์ด ๋จ์๋ค. ๋ฐ๋ก Views๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค. ์ง๊ธ๊น์ง๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ง๋ค์๋ค๋ฉด ์ด์ ๋ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋น ์ค๋น์์ ์ด๋ค์์ผ๋ก ๋ณด์ฌ์ค์ง ์ง์ ํด์ผ ํ๋ค. Views๋ฅผ ์ง์ ํ์ง ์์ ์ํ์์ ์คํํ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
Views์ ๋ํ ๊ฒ์ ์ด ์์์ด ๋ง์
๋์์ด ๋์๋ค.
4-1. views ๋ง๋ค๊ธฐ
resources/base/views์์ Reminder_Result.view.bxb ํ์ผ์ ์์ฑํ๋ค.
์ฌ๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ด ๋ทฐ๋ฅผ ์์ฑํ๋ค.
result-view {
match: Reminder(reminder)
render {
list-of (reminder) {
where-each (item) {
macro (reminder-summary) {
param (reminder) {
expression (item)
}
}
}
}
}
}match ๋ถ๋ถ์์ ์ด๋ค ์ก์
๊ณผ ๋งคํํ ์ง ๋ช
์ํ๊ณ ์ก์
์ ๊ฒฐ๊ณผ๋ก ๋์จ reminder๋ผ๋ output์ reminder๋ผ๋ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์จ๋ค.
render ๋ถ๋ถ์์๋ ์ด๋ค ๋ทฐ๊ฐ ๋ณด์ฌ์ง์ง ๊ฒฐ์ ํ๋ค.
๋ฆฌ๋ง์ธ๋ ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ list-of๋ผ๋ ์ค์ฝํ ์์ where-each๋ก macro๋ฅผ ๋ฐ๋ณตํด์ ๋ณด์ฌ์ค๋ค.
macro ์์ ์๋ reminder-summary๋ ์ด์ ์์ฑํ layout ์ด๋ค.
4-2. layout ๋ง๋ค๊ธฐ
resources/base/layouts ํด๋ ์์ reminder-summary.marcor.bxb๋ผ๋ ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
macro-def (reminder-summary) {
params {
param (reminder) {
type (Reminder)
min (Required)
max (One)
}
}
content {
title-card{
title-area {
slot1 {
text {
value {
template ("#{value (reminder.title)}")
}
}
}
}
}
}
}5. ์ด์ ํ ์คํธ๋ฅผ ํด๋ณด์
5-1. Simulator ํ ์คํธ
์๊น ๋น
์ค๋น๋ฅผ ํ์ต์์ผฐ๋ Training ํ์ด์ง์ ๋ค์ด๊ฐ์ ํ์ต์ํจ ๋ฐํ ๋ฆฌ์คํธ ์์ ๋ง์ฐ์ค๋ฅผ ํธ๋ฒํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ํด๋ํฐ ์์ด์ฝ์ด ๋ฌ๋ค.
์ฌ๊ธฐ์ ์์ด์ฝ์ ํด๋ฆญํ๋ฉด Simulator๊ฐ ์๋ก์ด ์ฐฝ์ผ๋ก ์ด๋ฆฌ๊ฒ ๋๋ค.
์บก์์ด ์ ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ ๋ถ๋ถ์ด ๋ฌด์ธ๊ฐ ํ์ ํ๋ค.
์ด๊ฒ์ ๋ฐ๋ก capsule-info.bxb๋ฅผ ์ค์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
5-2. capsule-info.bxb ์ค์ ํ๊ธฐ
resources/ko-KR/ ๊ฒฝ๋ก ์์ capsule-info.bxb ๋ผ๋ ํ์ผ์ ์์ฑํ๊ณ ์๋์ ๊ฐ์ด ์์ฑํ๋ค.
capsule-info {
display-name ("๋๊ฐ๊ธฐ ์ ์ ์๊ฐํ๋์?")
icon-asset (images/icons/bixby_launcher.png)
}์ด๊ณณ์์ ์บก์์ ์ด๋ฆ์ ์ง์ ํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ ์คํํ๋ณด๋ฉด ์๋ ์ด๋ฏธ์ง ์ฒ๋ผ ์์ด์ฝ๊ณผ ์บก์๋ช
์ด ํจ๊ป ํ์๋ ์บก์ ํ๋ฉด์ด ๋ํ๋๋ค.

๋จ์ ํ ์ผ
์กธ์ ์ํ์ ์ํด์ ์์ง ๊ฐ๋ฐํด์ผํ ๋ด์ฉ์ด ๋จ์์๋ค. http post ์์ฒญ์ ๋ณด๋ด์ ๋ฆฌ๋ง์ธ๋๋ฅผ ๋ฑ๋กํ๋ ๊ธฐ๋ฅ๊ณผ oauth ๊ธฐ๋ฅ์ ์ด์ฉํด์ ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ ๊ฒ์ด๋ค. post ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ๋ก์ง ๊ตฌํ์ ์ด ํฌ์คํ ์์ ํ๋ ๊ฒ๊ณผ ๋น์ทํ ๊ฒ ๊ฐ์ง๋ง ๋ฐํ๋ฅผ ํ์ต์ํค๋ ๋ถ๋ถ์ ์ข ๋ ๊ณต๋ถํด๋ด์ผ ๊ฒ ๋ค. ๊ทธ๋ฆฌ๊ณ oauth๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ https ํ๋กํ ์ฝ์ด ์ง์๋๋ ์๋ฒ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ https๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ๋ ๊ณต๋ถํด์ผ ํ๋ค. ์์ง ํ ์ผ์ด ๋ง์ง๋ง ๋ง๋งํ๊ฒ ๋๊ปด์ก๋ ๋น ์ค๋น ์บก์์ ์ฒซ ๋จ์ถ๋ฅผ ๋ผ์ฐ๊ณ ๋๋ ์์ ๊ฐ์ด ์๊ฒผ๋ค. ๋น ์ค๋น ์บก์ ๊ฐ๋ฐ ์ผ์ง 2 ์์๋ post ์์ฒญ์ ๋ณด๋ด๊ณ ์ฌ์ฉ์์ ๋ฐํ๋ฅผ ํ์ต์ํค๋ ๊ณผ์ ์ ๋ํด์ ๊ณต๋ถํ ํ ํฌ์คํ ํ ์์ ์ด๋ค.