News

CSV 파일 한 줄로 초기 데이터 자동 로드

▶ YouTube에서 보기

CAP 초기 데이터 로딩이란

CAP for Node.js 프로젝트에서 개발, 테스트 환경의 초기 데이터(seed data)를 데이터베이스에 자동으로 로드하는 가장 간단한 방법은 CSV 파일을 특정 위치에 놓는 것입니다. 코드 한 줄 없이, 파일 이름 규칙만 지키면 CAP 서버 시작 시 자동으로 데이터가 INSERT됩니다.

CSV 파일 위치 규칙

my-cap-project/
├── db/
│   ├── schema.cds           # 엔티티 정의
│   └── data/                # 초기 데이터 폴더
│       ├── my.namespace-Products.csv
│       ├── my.namespace-Categories.csv
│       └── my.namespace-Orders.csv
├── srv/
│   └── service.cds
└── package.json

파일 이름 규칙: {네임스페이스}-{엔티티명}.csv입니다. 네임스페이스와 엔티티명은 CDS 정의에서 사용한 것과 정확히 일치해야 합니다.

CDS 스키마 정의

// db/schema.cds
namespace retail.inventory;

entity Products {
  key product_id  : String(18);
      name        : String(100);
      category_id : String(10);
      unit_price  : Decimal(15,2);
      currency    : String(3) default 'KRW';
      in_stock    : Boolean default true;
}

entity Categories {
  key category_id : String(10);
      name        : String(50);
      description : String(200);
}

CSV 파일 작성

# db/data/retail.inventory-Categories.csv
category_id,name,description
ELEC,전자제품,노트북/스마트폰/태블릿 등 전자기기
FURN,가구,책상/의자/수납장 등 사무용 가구
STAT,문구,펜/노트/파일 등 사무용품
# db/data/retail.inventory-Products.csv
product_id,name,category_id,unit_price,currency,in_stock
P-001,UltraBook 15,ELEC,1500000,KRW,true
P-002,비즈니스 의자,FURN,350000,KRW,true
P-003,볼펜 세트 10개입,STAT,12000,KRW,true
P-004,무선 마우스,ELEC,45000,KRW,true
P-005,스탠딩 데스크,FURN,890000,KRW,false

CSV 첫 줄이 컬럼 헤더입니다. 헤더는 CDS 엔티티의 필드 이름과 정확히 일치해야 합니다. 대소문자를 구분합니다.

서버 시작 및 데이터 로드 확인

# package.json 개발 스크립트
{
  "scripts": {
    "start": "cds-serve",
    "watch": "cds watch"
  }
}
# 서버 시작
npm run watch

# 출력 로그 (데이터 로드 성공 시)
[cds] - connect using bindings from: { registry: '~/.cds-services.json' }
[cds] - connect to db > sqlite { url: ':memory:' }
  > filling retail.inventory.Categories from db/data/retail.inventory-Categories.csv
  > filling retail.inventory.Products from db/data/retail.inventory-Products.csv
[cds] - serving retail.inventory { at: '/api' }
[cds] - server listening on { url: 'http://localhost:4004' }

연관 관계 데이터 CSV로 표현

// schema.cds에 Orders 추가
entity Orders {
  key order_id   : String(20);
      customer   : String(50);
      order_date : Date;
      items      : Composition of many OrderItems on items.order = $self;
}

entity OrderItems {
  key item_no  : Integer;
  key order    : Association to Orders;
      product  : Association to Products;
      quantity : Integer;
      amount   : Decimal(15,2);
}
# retail.inventory-Orders.csv
order_id,customer,order_date
ORD-2026-001,홍길동,2026-05-01
ORD-2026-002,김철수,2026-05-10
# retail.inventory-OrderItems.csv
# Association 필드는 외래키로 표현
item_no,order_order_id,product_product_id,quantity,amount
10,ORD-2026-001,P-001,1,1500000
20,ORD-2026-001,P-003,2,24000
10,ORD-2026-002,P-004,3,135000

Association 필드는 {필드명}_{참조필드명} 형식으로 표현합니다. order_order_id는 Orders 엔티티의 order_id 키를 참조합니다.

프로덕션 환경에서 CSV 데이터 로드 제어

// package.json CDS 설정
{
  "cds": {
    "requires": {
      "db": {
        "[development]": {
          "kind": "sqlite",
          "credentials": { "url": ":memory:" }
        },
        "[production]": {
          "kind": "hana",
          "deploy-format": "hdbtable"
        }
      }
    },
    "hana": {
      "deploy-format": "hdbtable"
    }
  }
}

프로덕션(HANA) 환경에서는 CSV 데이터가 HANA의 HDI Container 배포 시에만 로드됩니다. 앱 재시작마다 로드되지 않습니다.

공식 문서

CAP 초기 데이터 로딩 전체 가이드는 cap.cloud.sap/docs/guides/databases#providing-initial-data에서 확인하세요.

댓글 0

아직 댓글이 없습니다.