๋ฉ”์ธ ์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๊ฐœ์š”

Benzinga TypeScript/JavaScript SDK๋Š” Benzinga API์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“ˆ์‹, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. TypeScript๋กœ ์ž‘์„ฑ๋œ ์ด SDK๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ Node.js ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ์›ํ™œํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ, ์บ์‹ฑ, ๊นŠ์€ ๋น„๊ต(deep comparison) ๋ฐ ๊ธฐํƒ€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ ํ–ฅ์ƒ๋œ ๊ตฌํ˜„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • TypeScript ์ง€์› - ์™„์ „ํ•œ TypeScript ํƒ€์ž…๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
  • ๋ฒ”์šฉ - ๋ธŒ๋ผ์šฐ์ €์™€ Node.js ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ๋™์ž‘
  • ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜ - ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ์„ค์น˜ ๊ฐ€๋Šฅ
  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ - ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด
  • ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ - ๋‚ด์žฅ ์บ์‹ฑ, ๊นŠ์€ ๋น„๊ต, ๊ฐ์ข… ์ตœ์ ํ™” ๊ธฐ๋Šฅ
  • ์ตœ์‹  - async/await๋ฅผ ์ง€์›ํ•˜๋Š” ES6+ ๋ฌธ๋ฒ•

์š”๊ตฌ ์‚ฌํ•ญ

  • Node.js 14 ์ด์ƒ

์„ค์น˜

SDK๋Š” ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ํ•ต์‹ฌ ์„ธ์…˜ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜์„ธ์š”:
npm install @benzinga/session
๊ทธ๋‹ค์Œ ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜์„ธ์š”:
# ์˜ˆ์ œ: ํŠน์ • ๋ชจ๋“ˆ ์„ค์น˜
npm install @benzinga/calendar-data
npm install @benzinga/quotes
npm install @benzinga/news-data

์‹œ์ž‘ํ•˜๊ธฐ

์„ธ์…˜ ์„ค์ •

@benzinga/session ๋ชจ๋“ˆ์€ Benzinga API ์ธ์ฆ์„ ์œ„ํ•œ ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๋ชจ๋“ˆ์€ ์ด Session ๊ฐ์ฒด์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.
import { Session } from '@benzinga/session';

// API ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜ ์ดˆ๊ธฐํ™”
const session = new Session({
  apiKey: 'YOUR_API_KEY'
});

๊ตฌ์„ฑ ์˜ต์…˜

Session ๊ฐ์ฒด๋Š” ๋™์ž‘์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ ์˜ต์…˜์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค:
const session = new Session({
  apiKey: 'YOUR_API_KEY',
  environment: 'production', // ๋˜๋Š” 'sandbox'
  timeout: 30000,            // ์š”์ฒญ ํƒ€์ž„์•„์›ƒ(๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„)
  // ์ถ”๊ฐ€ ๊ตฌ์„ฑ ์˜ต์…˜
});

ํ•ต์‹ฌ ๊ฐœ๋…

๋ชจ๋“ˆํ˜• ์„ค๊ณ„

๊ฐ Benzinga API ๋„๋ฉ”์ธ์€ ๋ณ„๋„์˜ npm ๋ชจ๋“ˆ๋กœ ํŒจํ‚ค์ง•๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  • ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ์„ค์น˜
  • ๋ฒˆ๋“ค ํฌ๊ธฐ ์ถ•์†Œ
  • ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ
  • ๋ชจ๋“ˆ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜

SDK๋Š” ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ๋ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
// ์˜ˆ์‹œ: ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ๊ตฌ๋…
dataManager.subscribe((data) => {
  console.log('New data received:', data);
});

// Example: Handle events
dataManager.on('update', (event) => {
  console.log('Data updated:', event);
});

์บ์‹ฑ ๋ฐ ์„ฑ๋Šฅ

SDK์—๋Š” ๋‹ค์Œ์„ ์œ„ํ•œ ๋‚ด์žฅ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:
  • ๋ถˆํ•„์š”ํ•œ API ํ˜ธ์ถœ ๊ฐ์†Œ
  • ์‘๋‹ต ์‹œ๊ฐ„ ๊ฐœ์„ 
  • ๋Œ€์—ญํญ ์‚ฌ์šฉ ์ตœ์ ํ™”
  • ์˜คํ”„๋ผ์ธ ๋Œ€์ฒด ๊ธฐ๋Šฅ ์ œ๊ณต

์‹ฌ์ธต ๋น„๊ต

๊ณ ๊ธ‰ ๋ฐ์ดํ„ฐ ๋น„๊ต ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  • ์ค‘์ฒฉ ๊ฐ์ฒด ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ฐ์ง€
  • ํšจ์œจ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ
  • ์Šค๋งˆํŠธํ•œ ์—…๋ฐ์ดํŠธ ํŠธ๋ฆฌ๊ฑฐ
  • UI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๊ฐ์†Œ

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ

SDK๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ API ๋„๋ฉ”์ธ์— ๋งž์ถฐ ํŠนํ™”๋œ ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”์–ด ๋ชจ๋“ˆ

  • @benzinga/session - ์ธ์ฆ ๋ฐ ์„ธ์…˜ ๊ด€๋ฆฌ (ํ•„์ˆ˜)
  • @benzinga/calendar-data - ์บ˜๋ฆฐ๋” ์ด๋ฒคํŠธ ๋ฐ ๊ธฐ์—… ํ–‰๋™
  • @benzinga/news-data - ๋‰ด์Šค ๊ธฐ์‚ฌ ๋ฐ ์‹œ์žฅ ์ •๋ณด
  • @benzinga/quotes - ์‹ค์‹œ๊ฐ„ ๋ฐ ์ง€์—ฐ ์‹œ์„ธ
  • @benzinga/fundamentals - ๊ธฐ์—… ๊ธฐ์ดˆ ์žฌ๋ฌด ์ง€ํ‘œ ๋ฐ ์žฌ๋ฌด ๋ฐ์ดํ„ฐ

์ „์šฉ ๋ชจ๋“ˆ

  • @benzinga/ratings - ์• ๋„๋ฆฌ์ŠคํŠธ ๋“ฑ๊ธ‰ ๋ฐ ๋ชฉํ‘œ๊ฐ€
  • @benzinga/options - ์˜ต์…˜ ๊ฑฐ๋ž˜ ๋™ํ–ฅ ๋ฐ ๋ถ„์„
  • @benzinga/transcripts - ์‹ค์  ๋ฐœํ‘œ ์ฝœ ๋…น์ทจ๋ก
  • @benzinga/logos - ๊ธฐ์—… ๋กœ๊ณ  ๋ฐ ๋ธŒ๋žœ๋”ฉ
  • @benzinga/signals - ๊ฑฐ๋ž˜ ์‹œ๊ทธ๋„ ๋ฐ ์ง€ํ‘œ

TypeScript ์ง€์›

์ด SDK๋Š” TypeScript๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ์™„์ „ํ•œ ํƒ€์ž… ์ •์˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
import { Session } from '@benzinga/session';
import { CalendarData, DividendEvent } from '@benzinga/calendar-data';

// TypeScript๋Š” ์ž๋™ ์™„์„ฑ ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค
const session = new Session({ apiKey: 'YOUR_API_KEY' });
const calendar = new CalendarData(session);

// ํƒ€์ž… ์•ˆ์ „ API ํ˜ธ์ถœ
const dividends: DividendEvent[] = await calendar.getDividends({
  dateFrom: '2024-01-01',
  dateTo: '2024-12-31',
  ticker: 'AAPL'
});

์‚ฌ์šฉ ์˜ˆ์ œ

๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์กฐํšŒ

import { Session } from '@benzinga/session';
import { NewsData } from '@benzinga/news-data';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const news = new NewsData(session);

// ์ตœ์‹  ๋‰ด์Šค ๊ฐ€์ ธ์˜ค๊ธฐ
const articles = await news.getNews({
  pageSize: 10,
  displayOutput: 'full'
});

console.log(articles);

์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ

import { Session } from '@benzinga/session';
import { QuoteStream } from '@benzinga/quotes';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const quoteStream = new QuoteStream(session);

// ์‹ค์‹œ๊ฐ„ ์‹œ์„ธ ๊ตฌ๋…
quoteStream.subscribe(['AAPL', 'MSFT', 'GOOGL'], (quote) => {
  console.log('Quote update:', quote);
});

// ์™„๋ฃŒ๋˜๋ฉด ๊ตฌ๋… ํ•ด์ œ
quoteStream.unsubscribe(['AAPL']);

calendar ์ด๋ฒคํŠธ

import { Session } from '@benzinga/session';
import { CalendarData } from '@benzinga/calendar-data';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const calendar = new CalendarData(session);

// ์˜ˆ์ •๋œ ์‹ค์  ์กฐํšŒ
const earnings = await calendar.getEarnings({
  dateFrom: '2024-01-01',
  dateTo: '2024-01-31',
  importance: 3  // ๋†’์€ ์ค‘์š”๋„๋งŒ ํ•ด๋‹น
});

// ๋ฐฐ๋‹น ์ •๋ณด ์กฐํšŒ
const dividends = await calendar.getDividends({
  ticker: 'AAPL'
});

๊ธฐ์—…์˜ ๊ธฐ์ดˆ ์žฌ๋ฌด ์ง€ํ‘œ

import { Session } from '@benzinga/session';
import { Fundamentals } from '@benzinga/fundamentals';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const fundamentals = new Fundamentals(session);

// ํšŒ์‚ฌ ํ”„๋กœํ•„ ๊ฐ€์ ธ์˜ค๊ธฐ
const profile = await fundamentals.getCompanyProfile('AAPL');

// ๋ฐธ๋ฅ˜์—์ด์…˜ ๋น„์œจ ๊ฐ€์ ธ์˜ค๊ธฐ
const valuationRatios = await fundamentals.getValuationRatios('AAPL');

// ์žฌ๋ฌด์ œํ‘œ ๊ฐ€์ ธ์˜ค๊ธฐ
const financials = await fundamentals.getFinancials('AAPL');

๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ

SDK๋Š” Webpack, Rollup, Vite์™€ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
// React, Vue ๋˜๋Š” Angular ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ
import { Session } from '@benzinga/session';
import { NewsData } from '@benzinga/news-data';

export function NewsComponent() {
  const session = new Session({ apiKey: process.env.BENZINGA_API_KEY });
  const news = new NewsData(session);

  // ์ปดํฌ๋„ŒํŠธ ๋กœ์ง์—์„œ ์‚ฌ์šฉ
  useEffect(() => {
    news.getNews({ pageSize: 5 }).then(articles => {
      setNewsData(articles);
    });
  }, []);
}

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

try-catch ๋ธ”๋ก์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜์„ธ์š”:
import { Session } from '@benzinga/session';
import { NewsData } from '@benzinga/news-data';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const news = new NewsData(session);

try {
  const articles = await news.getNews({ pageSize: 10 });
  console.log(articles);
} catch (error) {
  if (error.code === 'UNAUTHORIZED') {
    console.error('์ž˜๋ชป๋œ API ํ‚ค');
  } else if (error.code === 'RATE_LIMIT') {
    console.error('์†๋„ ์ œํ•œ ์ดˆ๊ณผ๋จ');
  } else {
    console.error('์˜ค๋ฅ˜ ๋ฐœ์ƒ:', error.message);
  }
}
ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ฒฐ๊ณผ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์‹ญ์‹œ์˜ค:
import { Session } from '@benzinga/session';
import { NewsData } from '@benzinga/news-data';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const news = new NewsData(session);

// ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ
let page = 0;
let allArticles = [];

while (page < 5) {
  const articles = await news.getNews({
    page: page,
    pageSize: 100
  });

  if (articles.length === 0) break;

  allArticles = allArticles.concat(articles);
  page++;
}

console.log(`Fetched ${allArticles.length} articles`);

์บ์‹ฑ ์ „๋žต

์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋‚ด์žฅ๋œ ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์„ธ์š”:
import { Session } from '@benzinga/session';
import { CalendarData } from '@benzinga/calendar-data';

const session = new Session({
  apiKey: 'YOUR_API_KEY',
  cache: {
    enabled: true,
    ttl: 300000  // 5๋ถ„๊ฐ„ ์บ์‹œ
  }
});

const calendar = new CalendarData(session);

// ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์€ API ์š”์ฒญ
const earnings1 = await calendar.getEarnings({ ticker: 'AAPL' });

// ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ์€ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ(TTL ๋‚ด์ธ ๊ฒฝ์šฐ)
const earnings2 = await calendar.getEarnings({ ticker: 'AAPL' });

๋ชจ๋ฒ” ์‚ฌ๋ก€

1. ์„ธ์…˜ ๊ฐ์ฒด ์žฌ์‚ฌ์šฉ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์„ธ์…˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜์„ธ์š”:
// session.ts
export const globalSession = new Session({ apiKey: process.env.BENZINGA_API_KEY });

// ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค์—์„œ
import { globalSession } from './session';
const news = new NewsData(globalSession);

2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜

API ํ‚ค๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜์„ธ์š”.
// .env ํŒŒ์ผ
BENZINGA_API_KEY=your_api_key_here

// ์ฝ”๋“œ ๋‚ด
const session = new Session({
  apiKey: process.env.BENZINGA_API_KEY
});

3. ํƒ€์ž… ์•ˆ์ „์„ฑ

ํƒ€์ž… ์•ˆ์ „ํ•œ API ์ƒํ˜ธ ์ž‘์šฉ์„ ์œ„ํ•ด TypeScript๋ฅผ ํ™œ์šฉํ•˜์‹ญ์‹œ์˜ค:
import type { NewsArticle, NewsParams } from '@benzinga/news-data';

const params: NewsParams = {
  pageSize: 10,
  displayOutput: 'full',
  ticker: 'AAPL'
};

const articles: NewsArticle[] = await news.getNews(params);

4. ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.
const safeApiCall = async (fn: () => Promise<any>) => {
  try {
    return await fn();
  } catch (error) {
    console.error('API Error:', error);
    // ์˜ค๋ฅ˜ ์ถ”์  ์„œ๋น„์Šค์— ๋กœ๊ทธ ๊ธฐ๋ก
    return null;
  }
};

const articles = await safeApiCall(() => news.getNews({ pageSize: 10 }));

๋ฆฌ์†Œ์Šค

๋ชจ๋“ˆ ๋ฌธ์„œ

ํŠน์ • ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ฐ ํŒจํ‚ค์ง€์˜ README๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค:
  • @benzinga/session - ํ•ต์‹ฌ ์ธ์ฆ ๋ฐ ๊ตฌ์„ฑ
  • @benzinga/calendar-data - calendar ์ด๋ฒคํŠธ API
  • @benzinga/news-data - ๋‰ด์Šค ๋ฐ ๊ธฐ์‚ฌ API
  • @benzinga/quotes - ์‹ค์‹œ๊ฐ„ ์‹œ์„ธ API
  • @benzinga/fundamentals - ๊ธฐ์ดˆ ์žฌ๋ฌด ์ง€ํ‘œ ๋ฐ ์žฌ๋ฌด ์ •๋ณด API

์ง€์›

๊ธฐ์ˆ  ์ง€์›์ด๋‚˜ API ํ‚ค ๋ฐœ๊ธ‰์ด ํ•„์š”ํ•˜๋ฉด cloud.benzinga.com์—์„œ Benzinga์— ๋ฌธ์˜ํ•˜์„ธ์š”.

๊ธฐ์—ฌํ•˜๊ธฐ

Benzinga JavaScript SDK๋Š” ์˜คํ”ˆ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ๊ธฐ์—ฌํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ์ €์žฅ์†Œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”.