빅스비(Bixby) 데이터 등록(1)

박세건·2024년 11월 7일
0

기술 실습

목록 보기
16/18
post-thumbnail

이전에 GET방식을 사용해서 정상적으로 데이터를 조회하는 것을 확인할 수 있었다. 이를 응용해서 POST방식으로 진행하고 있는 프로젝트에 데이터를 정상적으로 생성해주는 기능을 구현해보자

과정


위와같은 흐름으로 진행된다.

진행하면서 궁금한 점이나 추가적인 정보는 빅스비 개발자 센터를 통해 더 자세히 알아볼 수 있습니다
빅스비 개발자 센터

POST 방식으로 통신

Model(Concepts & Actions) 생성

우선 먼저 Java 프로젝트를 진행할때에 클래스를 설정하고 해당 클래스에 속성과 메서드를 정의해주는 것처럼 빅스비 스튜디오에서는 Model에 Concepts과 Actions를 정의해준다.

JavaBixby
ProjectCapsule
ClassModel
AttributesConcept
MethodAction

Concepts 생성

예를 들어서, '당근 5개 사용했어'라는 문장을 발화로 이용할 것이다.
때문에, action에서 input받고 input으로 action을 진행한뒤에 결과값을 output으로 받을 것이다.
그렇다면 input, output 각각에 맞는 Concept을 구현해야한다. 우리는 '당근', 과 '5개' 와 같은 발화를 저장할 것이기때문에 IngredientNameInput과 AmountInput의 컨셉을 생성한다.
'사용했어'와 같은 문장은 '이용했어', '써버렸어', '썼어' 등 과같은 다양한 말로 표현되기때문에 input으로 설정하기 애매하기에 제거한다.

input

발화를 담당하는 컨셉의 자료형은 주로 name으로 진행한다.

IngredientNameInput.model.bxb : 재료의 이름을 담당하는 컨셉

name (IngredientNameInput) {
  description (발화에서 인식하는 재료 이름)
}

AmountInput.model.bxb : 재료의 양을 담당하는 컨셉

name (AmountInput) {
  description (발화에서 인식하는 재료 양)
}

output

{
    "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로 진행해본다.

Actions 생성

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으로 연결해준다


Code 생성

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) {

  • input으로 지정했던 컨셉들을 해당 메서드로 가져와서 사용할 수 있도록 구현
  • 가져온 input 컨셉을 JSON데이터로 변환하여 http 통신한다
  • 발화에서 데이터를 뽑아 통신한다

View

결과값이 빅스비에 보여질 화면을 설계하는 과정이다
데이터를 응답받고 고객에게 보여지는 것이 아닌 데이터를 발화로 등록하는 과정이기에 간단하게 어떤 데이터가 등록되었는지만 보여지는 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로 화면을 설계해주었다면, 이어서 트레이닝을 시키고 시뮬레이터로 테스트를 진행해보자

profile
멋있는 사람 - 일단 하자

0개의 댓글