본문 바로가기

SAP 사용자들의 오픈 커뮤니티

SAP Business Technology Platform(BTP)

VS Code로 비즈니스 서비스 만들기 (with Node.js) - 2부

페이지 정보

본문


Step 6: 데이터 모델 추가와 서비스 정의 적용하기

빠른 시작을 위해 간단한 올인원 서비스 정의를 추가했습니다. 일반적으로 정규화된 엔터티 정의를 별도의 데이터 모델에 넣고 서비스에서 엔터티에 대한 비정규화된 뷰를 노출하도록 할 수 있습니다.

  1. db 폴더에서 New File 를 클릭하여  data-model.cds 파일을 생성하세요.
  1. 다음의 코드를  data-model.cds 에 추가하세요.

    CDS

    namespace my.bookshop;
    using { Country, managed } from '@sap/cds/common';
    
    entity Books {
      key ID : Integer;
      title  : localized String;
      author : Association to Authors;
      stock  : Integer;
    }
    
    entity Authors {
      key ID : Integer;
      name   : String;
      books  : Association to many Books on books.author = $self;
    }
    
    entity Orders : managed {
      key ID  : UUID;
      book    : Association to Books;
      country : Country;
      amount  : Integer;
    }

  1. cat-service.cds 파일을 열고 기존 코드를 다음의 코드로 대체하세요.

    CDS

    using my.bookshop as my from '../db/data-model';
    
    service CatalogService {
      entity Books @readonly as projection on my.Books;
      entity Authors @readonly as projection on my.Authors;
      entity Orders @insertonly as projection on my.Orders;
    }



Step 7: 초기 데이터 추가하기



Visual Studio Code에서 일반 CSV 파일을 폴더 db/csv에 추가하여 데이터베이스 테이블을 초기 데이터로 채웁니다


  1. db 폴더에서 New File 을 선택한 후  csv/my.bookshop-Authors.csv 를 입력하여 my.bookshop-Authors.csv파일이 있는 새폴더 csv를 만듭니다. 파일에 다음을 추가하세요.

    CSV

    ID;name
    101;Emily Brontë
    107;Charlote Brontë
    150;Edgar Allen Poe
    170;Richard Carpenter

  1. 새로 만든 csv 폴더에서 새 파일을 선택하고 my.bookshop-Books.csv 파일을 만듭니다. 파일에 다음을 추가합니다.

    CSV

    ID;title;author_ID;stock
    201;Wuthering Heights;101;12
    207;Jane Eyre;107;11
    251;The Raven;150;333
    252;Eleonora;150;555
    271;Catweazle;170;22

    폴더 계층 db/csv/....이 있는지 확인합니다. csv 파일은 데이터 모델의 엔티티처럼 이름이 지정되어야 하며 db/csv 폴더 안에 있어야 합니다. 파일 추가 후 cds watch는 파일이 탐지되었으며 해당 내용이 자동으로 데이터베이스에 로드되었음을 알려 주는 출력과 함께 서버를 다시 시작합니다.

    Shell/Bash

    [cds] - connect to db > sqlite { database: ':memory:' }
    [cds] - using bindings from: { registry: '~/.cds-services.json' }
     > filling my.bookshop.Authors from ./db/csv/my.bookshop-Authors.csv
     > filling my.bookshop.Books from ./db/csv/my.bookshop-Books.csv
    /> successfully deployed to sqlite in-memory db
    
    [cds] - serving CatalogService { at: '/catalog', impl: './srv/cat-service.js' }
    
    [cds] - launched in: 656.931ms
    [cds] - server listening on { url: 'http://localhost:4004' }
    [ terminate with ^C ]

  1. cat-service.js에서 모의 데이터가 포함된 코드를 제거합니다. csv 파일에서 로드된 데이터를 보기위해서 이 코드를 제거하세요.
  1. 서비스를 테스트하려면 웹 브라우저를 열고 다음으로 이동하세요.

    http://localhost:4004/catalog/Books

    http://localhost:4004/catalog/Authors

    이제 일부 초기 데이터가 포함된 완전한 SQL 데이터베이스를 사용하므로 기본 제공 일반 공급자가 제공하는 복잡한 OData 쿼리를 전송할 수 있습니다.

    http://localhost:4004/catalog/Authors?$expand=books($select=ID,title)

    이제 제인 에어라는 책을 확인해야 합니다. 보이지 않는다면, cat-service.js에서 모의 데이터를 제거했는지 확인해보세요

     



Step 8: 영구 데이터베이스 추가



계속하기 전에 필수 구성 요소를 완료하고 SQLite를 설치했는지 확인하세요. (Windows 전용)

인메모리를 사용하는 대신 영구 데이터베이스를 사용할 수도 있습니다.

  1. cdswatch가 실행 중인 경우 명령줄에서 CTRL+C를 선택하여 서비스를 중지합니다.
  1. SQLite3 패키지를 설치합니다.

    Shell/Bash

    npm i sqlite3 -D

  2. 데이터 모델을 SQLite 데이터베이스에 배포합니다.

    Shell/Bash

    cds deploy --to sqlite:db/my-bookshop.db

    이제 db/my-bookshop.db 아래에 SQLite 데이터베이스 파일을 만들었습니다.이 파일은 package.json에 기본 데이터 원본으로 저장됩니다. 후속 배포의 경우 cds 배포만 실행하면 됩니다.자동으로 제공되는 인메모리 데이터베이스와의 차이점은 로컬 파일에 영구 데이터베이스가 저장된다는 것입니다.


  1. SQLite를 열고 새로 만든 데이터베이스를 확인합니다.

    Shell/Bash

    sqlite3 db/my-bookshop.db -cmd .dump

    이 방법이 작동하지 않으면 SQLite가 설치되어 있는지 확인합니다. Windows에서는 C:\sqlite\sqlite3db/my-bookshop.db -cmd.dump와 같은 SQLite의 전체 경로를 입력해야 할 수 있습니다.

  1. 'SQLite'를 중지하고 프로젝트 디렉토리로 돌아가려면 CTRL+C를 선택합니다.
  1. 서비스를 실행합니다

    Shell/Bash

    cds watch

    Shell/Bash

    [cds] - connect to db > sqlite { database: '/Users/xxxxxx/my-bookshop/db/my-bookshop.db' }
    [cds] - using bindings from: { registry: '~/.cds-services.json' }
    [cds] - serving CatalogService { at: '/catalog', impl: './srv/cat-service.js' }
    
    [cds] - launched in: 537.482ms
    [cds] - server listening on { url: 'http://localhost:4004' }
    [ terminate with ^C ]


Step 9: Postman을 사용하여 일반 핸들러 테스트하기


이제 CAP가 작동 중인 일반 핸들러를 볼 수 있습니다.

1. Postman 애플리케이션을 엽니다.

> Postman 이외의 다른 HTTP 클라이언트를 사용할 수 있습니다.

2. 다음 링크를 클릭하고 선택한 폴더에 파일을 저장합니다. [postman.json]

3. Postman 앱에서 toolbar의 Import 버튼을 사용합니다.

postman-import.png

4. 마법사에서 Import File 을 선택합니다. 파일 선택을 클릭하고 이전에 저장한 파일을 선택하거나 끌어서 놓기로 직접 추가합니다.

postman-import-from-file.png

5. 가져온 컬렉션에서 메타데이터 및 CRUD 그룹의 다양한 요청을 실행합니다.
postman-test-request.png 현재 서비스를 구현하면 POST 주문만 받을 수 있습니다. 주문 엔티티를 srv/cat-service.cds에서만 insert되도록 지정했으므로 주문에 대한 GET 또는 DELETE는 실패합니다.

Step 10: 커스텀 로직 추가하기


1. Visual Studio Code에서 cat-service.js 파일을 열고 기존 파일을 변경합니다.

module.exports = (srv) => {

  const {Books} = cds.entities ('my.bookshop')

  // Reduce stock of ordered books
  srv.before ('CREATE', 'Orders', async (req) => {
    const order = req.data
    if (!order.amount || order.amount <= 0)  return req.error (400, 'Order at least 1 book')
    const tx = cds.transaction(req)
    const affectedRows = await tx.run (
      UPDATE (Books)
        .set   ({ stock: {'-=': order.amount}})
        .where ({ stock: {'>=': order.amount},/*and*/ ID: order.book_ID})
    )
    if (affectedRows === 0)  req.error (409, "Sold out, sorry")
  })

  // Add some discount for overstocked books
  srv.after ('READ', 'Books', each => {
    if (each.stock > 111)  each.title += ' -- 11% discount!'
  })

}

주문이 생성될 때마다 이 코드가 트리거됩니다. 책이 충분하지 않으면 주어진 양만큼 도서 재고량을 갱신해 줍니다.


  1. Postman에서 GET Books 요청을 실행합니다. 책 201의 재고를 확인해보세요.

postman-get-books.png

이번에는 POST Orders 요청을 실행합니다. 이 트리거는 재고량을 감소시킬 것입니다.

 마지막으로 GET Books 요청을 다시 실행합니다. 책 201의 재고가 이전보다 더 감소합니다.



댓글목록

profile_image

최정아님의 댓글

no_profile 최정아 쪽지보내기 아이디로 검색 전체게시물 작성일 0

잘알겠습니다.

이용약관
개인정보처리방침