๐Ÿ“ ๊ฐœ๋ฐœ

[Bixby Capsule] ๋น…์Šค๋น„ ์บก์А ๊ฐœ๋ฐœ ์ผ์ง€ 1: ๋น…์Šค๋น„๋กœ http GET ์š”์ฒญ์„ ๋ณด๋‚ด๋ณด์ž


โ“ ๋น…์Šค๋น„ ์บก์А์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ์ด์œ 

google assistant api ์„œ๋น„์Šค ์ข…๋ฃŒ๋ผ๋‹ˆ??

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 api calls ์บก์А ์ƒ์„ฑ ํ™•์‹คํžˆ ๊ฐœ๋ฐœํ•  ๋•Œ ์ตœ๊ณ ์˜ ์ฐธ๊ณ ์ž๋ฃŒ๋Š” ๋ ˆํผ๋Ÿฐ์Šค ์ธ ๊ฒƒ ๊ฐ™๋‹ค!! ์ด ์˜ˆ์ œ ์ฝ”๋“œ ๋•๋ถ„์— ์ „์ฒด์ ์ธ ํ๋ฆ„์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋งŽ์€ ๋„์›€์ด ๋๋‹ค.

๐Ÿš€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๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

ko-KR 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 ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‚ฌ์šฉ์ž์˜ ๋ฐœํ™”๋ฅผ ํ•™์Šต์‹œํ‚ค๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•œ ํ›„ ํฌ์ŠคํŒ…ํ•  ์˜ˆ์ •์ด๋‹ค.

๋น…์Šค๋น„ ์บก์А ์ฝ”๋“œ
[Bixby Capsule] ๋น…์Šค๋น„ ์บก์А ๊ฐœ๋ฐœ ์ผ์ง€ 1: ๋น…์Šค๋น„๋กœ http GET ์š”์ฒญ์„ ๋ณด๋‚ด๋ณด์ž