이전에 GET방식을 사용해서 정상적으로 데이터를 조회하는 것을 확인할 수 있었다. 이를 응용해서 POST방식으로 진행하고 있는 프로젝트에 데이터를 정상적으로 생성해주는 기능을 구현해보자
위와같은 흐름으로 진행된다.
진행하면서 궁금한 점이나 추가적인 정보는 빅스비 개발자 센터를 통해 더 자세히 알아볼 수 있습니다
빅스비 개발자 센터
우선 먼저 Java 프로젝트를 진행할때에 클래스를 설정하고 해당
클래스에 속성과 메서드
를 정의해주는 것처럼 빅스비 스튜디오에서는Model에 Concepts과 Actions
를 정의해준다.
Java | Bixby |
---|---|
Project | Capsule |
Class | Model |
Attributes | Concept |
Method | Action |
예를 들어서, '당근 5개 사용했어'라는 문장을 발화로 이용할 것이다.
때문에, action에서 input받고 input으로 action을 진행한뒤에 결과값을 output으로 받을 것이다.
그렇다면 input, output 각각에 맞는 Concept을 구현해야한다. 우리는 '당근', 과 '5개' 와 같은 발화를 저장할 것이기때문에 IngredientNameInput과 AmountInput의 컨셉을 생성한다.
'사용했어'와 같은 문장은 '이용했어', '써버렸어', '썼어' 등 과같은 다양한 말로 표현되기때문에 input으로 설정하기 애매하기에 제거한다.
발화를 담당하는 컨셉의 자료형은 주로 name으로 진행한다.
IngredientNameInput.model.bxb : 재료의 이름을 담당하는 컨셉
name (IngredientNameInput) {
description (발화에서 인식하는 재료 이름)
}
AmountInput.model.bxb : 재료의 양을 담당하는 컨셉
name (AmountInput) {
description (발화에서 인식하는 재료 양)
}
{
"data": {
"ingredientName": "당근",
"amount": 5.0
},
"message": "특이사항으로 정보 생성"
}
우리는 위와 같이 API 응답값을 설정했다. 그렇다면 이에 맞는 Concept을 생성해보자
일단 메시지는 무시하고 진행해본다.
CreateBySignificantResponse Concept(전체 응답을 받을 컨셉)
structure (CreateBySignificantResponse) {//구조체 컨셉의 이름
description (특이사항 생성 전체 응답 데이터)
property (data){ //프로퍼티의 이름
type (Data)//primitive 컨셉명
min(Required)
}
}
CreateBySignificantResponse(전체요청)는 data를 속성으로 갖음
type에는 어떤 Concept을 연결해줄 것인지 작성한다.
Data Concept
structure (Data) {//구조체 컨셉의 이름
description (특이사항 생성 응답 데이터중 data 부분)
property (ingredientName){ //프로퍼티의 이름
type (IngredientName)//primitive 컨셉명
min(Required)
}
property (amount){ //프로퍼티의 이름
type (Amount)//primitive 컨셉명
min(Required)
}
}
IngredientName Concept
text (IngredientName) {
description (특이사항 관련된 재료 이름)
}
Amount Concept
text (Amount) {
description (특이사항 관련된 재료의 양)
}
해당 코드에서 Amount는 double로 반환해주는데 이를 받기 위해서 빅스비 스튜디오에서 decimal 자료형을 제공해주는 것 같다. 하지만 text로 진행해본다.
CreateBySignificant.model.bxb 생성
input들은 반드시 필요하다면 Required, 없어도 대체 가능하다면 Optional로 작성하는 느낌
action (CreateBySignificant) {
type(Search)
description (특이사항으로 관련 정보 생성 action)
collect{
input (IngredientNameInput){
type (IngredientNameInput)
min (Required) max (One)
}
input (AmountInput){
type (AmountInput)
min (Required) max (One)
}
}
output (CreateBySignificantResponse){
throws{
error (NoUnderstand){
on-catch{
halt{
dialog{
template ("제대로 인식하지 못햇습니다!")
}
}
}
}
}
}
}
이전에 생성해놓은 Data 컨셉을 output으로 연결해준다
model을 작성했으면 어디에 어떤 요청을, 어떤 데이터를 담아서 등 과같은 내부 로직을 JS를 사용해서 정의한다
// 필요한 모듈 불러오기
var http = require('http'); // HTTP 요청을 위한 http 모듈
var console = require('console'); // 로그 출력을 위한 console 모듈
// 이 함수는 'data' 데이터를 외부 서버에 POST 요청으로 전송하고, 응답을 반환합니다.
module.exports.function = function createBySignificant(IngredientNameInput,AmountInput) {
// 전송할 데이터를 'significant' 객체로 정의
var data = {
"detail": IngredientNameInput + " " + AmountInput + "만큼 사용했습니다.", // 특이사항 설명
"restaurantId": 1, // 식당 ID
"ingredientName": IngredientNameInput, // 사용된 재료 이름
"amount": AmountInput // 사용된 재료의 양
};
// HTTP 요청 옵션 설정
var options = {
passAsJson: true, // 데이터를 JSON 형식으로 전송
returnHeaders: true, // 응답 헤더를 포함하여 반환
format: 'json' // 응답을 JSON 형식으로 수신
};
// POST 요청을 보낼 URL을 설정하고 요청 전송
var response = http.postUrl(
'https://k11a501.p.ssafy.io/api/significant', // 요청을 보낼 URL
data, // 요청 본문에 보낼 데이터
options // 요청 옵션
);
// 응답 데이터를 로그에 출력
console.log(response);
// 응답의 parsed 데이터를 반환
return response.parsed;
}
module.exports.function = function createBySignificant(IngredientNameInput,AmountInput) {
결과값이 빅스비에 보여질 화면을 설계하는 과정이다
데이터를 응답받고 고객에게 보여지는 것이 아닌 데이터를 발화로 등록하는 과정이기에 간단하게 어떤 데이터가 등록되었는지만 보여지는 Text 기반의 화면만 생성한다.
우선 먼저 전체적인 화면의 구조를 담당할 view를 설정한다.
CreateBySignificant.view.bxb
result-view {
match: CreateBySignificantResponse (createBySignificantResponse)
render {
if (size(createBySignificantResponse) == 1) {
layout{
macro(createBySignificant) {
param (createBySignificantResponse) {
expression (createBySignificantResponse)
}
}
}
}
그다음 macro를 통해서 구체적으로 어떤데이터가 어떻게 보여질 것인지를 설계한다.
CreateBySignificant.macro.bxb
macro-def(createBySignificant) {
params {
param (createBySignificantResponse) {
type (CreateBySignificantResponse)
min (Required)
max (One)
}
}
content {
section { // this macro returns a "section"
content {
paragraph {
value ("#{value(createBySignificantResponse.data.ingredientName)}이라는 재료가 #{value(createBySignificantResponse.data.amount)}만큼 등록되었습니다!")
style (Detail_M)
}
}
}
}
}
View로 화면을 설계해주었다면, 이어서 트레이닝을 시키고 시뮬레이터로 테스트를 진행해보자