ํŒŒ์šฐ์ŠคํŠธ์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ ์ž‘์—…, XNUMX๋ถ€: ์†Œ๊ฐœ

ํŒŒ์šฐ์ŠคํŠธ์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ ์ž‘์—…, XNUMX๋ถ€: ์†Œ๊ฐœ

๋‚ด๊ฐ€ ์–ด์ฉŒ๋‹ค๊ฐ€ ์ด๋ ‡๊ฒŒ ์‚ด๊ฒŒ ๋์ง€?

์–ผ๋งˆ ์ „ ์ €๋Š” ๋กœ๋“œ๊ฐ€ ๋งŽ์€ ํ”„๋กœ์ ํŠธ์˜ ๋ฐฑ์—”๋“œ ์ž‘์—…์„ ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ณต์žกํ•œ ๊ณ„์‚ฐ๊ณผ ํƒ€์‚ฌ ์„œ๋น„์Šค ์š”์ฒญ์ด ํฌํ•จ๋œ ์ˆ˜๋งŽ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์˜ ์ •๊ธฐ์ ์ธ ์‹คํ–‰์„ ๊ตฌ์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋น„๋™๊ธฐ์‹์ด๋ฉฐ ์ œ๊ฐ€ ์˜ค๊ธฐ ์ „์—๋Š” ํฌ๋ก  ์‹คํ–‰ ์ž‘์—…์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ˜„์žฌ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๋Š” ๋ฃจํ”„์™€ ์ˆ˜์ง‘์„ ํ†ตํ•ด ์ฝ”๋ฃจํ‹ด ๊ทธ๋ฃน์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ทธ๋Ÿฌํ•œ ์ฝ”๋ฃจํ‹ด์ด ์ˆ˜์‹ญ, ์ˆ˜๋ฐฑ ๊ฐœ๊ฐ€ ์žˆ์„ ๋•Œ๊นŒ์ง€ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ˆ˜๊ฐ€ XNUMX๋ช…์„ ์ดˆ๊ณผํ•˜๋ฉด ๋ธŒ๋กœ์ปค, ์—ฌ๋Ÿฌ ์ž‘์—…์ž ๋“ฑ์œผ๋กœ ์ผ๋ฐ˜ ์ž‘์—… ๋Œ€๊ธฐ์—ด์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ด์ „์— ์‚ฌ์šฉํ–ˆ๋˜ ์…€๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ๋น„๋™๊ธฐ์  ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์ €๋Š” ์งˆ๋ฌธ์— ๊นŠ์ด ๋น ์ ธ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ัั‚ะฐั‚ัŒัŽ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ณ„ํš, ๊ธฐ์‚ฌ ์ž‘์„ฑ์ž๊ฐ€ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋งค์šฐ ํฅ๋ฏธ๋กญ๊ณ  ์šฐ๋ฆฌ ํŒ€์˜ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งค์šฐ ์„ฑ๊ณต์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ ์ €์ž ์ž์‹ ๋„ ๋น„๋™๊ธฐ์‹ ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ”„๋กœ๋•์…˜์— ์ถœ์‹œํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ณ„๋กœ ์ ํ•ฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ ๊ทธ๋ฃน ์ž‘์—… ์‹œ์ž‘(์ฐธ์กฐ: ๊ทธ๋ฃน). ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ ๋ฐœํ–‰๋ฌผ ์ด๋ฏธ ๋ฌธ์„ ๋‹ซ์•˜์ง€๋งŒ ์ž‘์—…์€ ํ•œ ๋‹ฌ ๋™์•ˆ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ž‘์„ฑ์ž์—๊ฒŒ ํ–‰์šด์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๋ฏธ lib์— ์ž‘์—… ์ค‘์ธ ์ž‘์—…์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์š”์ ์€ ๋‚˜์—๊ฒŒ ์žˆ๊ณ  ๋„๊ตฌ๋Š” ๋‚˜์—๊ฒŒ ์Šตํ•œ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ถ€ ์ž‘์—…์—๋Š” ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ 2-3๊ฐœ์˜ http ์š”์ฒญ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์„ ์ตœ์ ํ™”ํ•˜๋”๋ผ๋„ ์•ฝ 4์‹œ๊ฐ„๋งˆ๋‹ค 2๊ฐœ์˜ TCP ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋‹ค์ง€ ์ข‹์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค... ํ•œ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์„ธ์…˜์„ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์ž๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์ž‘์—…. aiohttp๋ฅผ ํ†ตํ•œ ๋Œ€๋Ÿ‰ ์š”์ฒญ์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”. ์—ฌ๊ธฐ์—.

์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๋‚˜๋Š” ์ฐพ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ ๊ทธ๋ฆฌ๊ณ  ์ฐพ์•˜์–ด์š”! ํŠนํžˆ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ์…€๋Ÿฌ๋ฆฌ์˜ ์ฐฝ์‹œ์ž๋Š” ์†”๋ ˜์—๊ฒŒ ๋ฌผ์–ด๋ณด์„ธ์š”, ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค ํŒŒ์šฐ์ŠคํŠธ, ์›๋ž˜ ํ”„๋กœ์ ํŠธ์šฉ robinhood. Faust๋Š” Kafka Streams์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ Kafka๋ฅผ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•˜๊ณ , RocksDB๋Š” ์—์ด์ „ํŠธ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋น„๋™๊ธฐ์‹์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋‹น์‹ ์€ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋น ๋ฅธ ๋น„๊ต ํ›„์ž ์ œ์ž‘์ž์˜ ์…€๋Ÿฌ๋ฆฌ์™€ ํŒŒ์šฐ์ŠคํŠธ : ์ฐจ์ด์ , ๋ธŒ๋กœ์ปค ๊ฐ„์˜ ์ฐจ์ด์ , ๊ธฐ๋ณธ ์ž‘์—… ๊ตฌํ˜„. ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ํŒŒ์šฐ์ŠคํŠธ์˜ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ๊ด€์‹ฌ์„ ๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ฃผ์ œ๋กœ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ญ˜ ํ• ๊ฑฐ ๋‹ˆ?

๊ทธ๋ž˜์„œ ์งง์€ ๊ธฐ์‚ฌ ์‹œ๋ฆฌ์ฆˆ์—์„œ Faust๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค๋Š” ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. alphavantage.co. ์—์ด์ „ํŠธ ์ž‘์„ฑ ๋ฐฉ๋ฒ•(์‹ฑํฌ, ํ† ํ”ฝ, ํŒŒํ‹ฐ์…˜), ์ผ๋ฐ˜(cron) ์‹คํ–‰ ๋ฐฉ๋ฒ•, ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ faust cli ๋ช…๋ น(ํด๋ฆญ์— ๋Œ€ํ•œ ๋ž˜ํผ), ๊ฐ„๋‹จํ•œ ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ์‹œ์—ฐํ•˜๊ณ  ๋งˆ์ง€๋ง‰์—๋Š” datadog( ์ฆ‰์‹œ ์ž‘์—…) ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์‹ญ์‹œ์˜ค. ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด mongodb์™€ ๋ชจํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ถ”์‹ : ๋ชจ๋‹ˆํ„ฐ๋ง์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์ž์‹ ๊ฐ์žˆ๊ฒŒ ์“ฐ์—ฌ์ง„ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜๋ฉด, ๋งˆ์ง€๋ง‰ ๊ธฐ์‚ฌ ๋ ๋ถ€๋ถ„์˜ ๋…์ž๋Š” ์—ฌ์ „ํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์šฐ์ŠคํŠธ์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ ์ž‘์—…, XNUMX๋ถ€: ์†Œ๊ฐœ

ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ

์ด๋ฏธ ์•ฝ์†ํ–ˆ์œผ๋ฏ€๋กœ ์„œ๋น„์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๋ชฉ๋ก์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์ฆ๊ถŒ ๋ฐ ๊ฐœ์š”(์ง€๋‚œํ•ด ์†์ต, ๋Œ€์ฐจ๋Œ€์กฐํ‘œ, ํ˜„๊ธˆ ํ๋ฆ„ ํฌํ•จ)๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ์—…๋กœ๋“œํ•˜์„ธ์š”.
  2. ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ(๋งค ๊ฑฐ๋ž˜ ์—ฐ๋„๋งˆ๋‹ค ๊ฑฐ๋ž˜ ์ข…๊ฐ€์˜ ๊ทน๋‹จ๊ฐ’ ์ฐพ๊ธฐ) - ์ •๊ธฐ์ ์œผ๋กœ
  3. ์ตœ์‹  ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ - ์ •๊ธฐ์ ์œผ๋กœ
  4. ๊ฐ ์ฆ๊ถŒ์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ์ง€ํ‘œ ๋ชฉ๋ก์„ ์ •๊ธฐ์ ์œผ๋กœ ์—…๋กœ๋“œ

์˜ˆ์ƒ๋Œ€๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ํ˜ธํŠผ

์ธํ”„๋ผ๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

์ œ๋ชฉ์€ ํ™•์‹คํžˆ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ kafka(๋ฐ Zookeeper - ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ์— ์žˆ์Œ), kafdrop(์ฃผ์ œ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ ค๋Š” ๊ฒฝ์šฐ), mongodb๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ docker-compose์— ๋Œ€ํ•œ ์ž‘์€ ๊ตฌ์„ฑ์„ ์ž‘์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ป๋Š”๋‹ค [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

version: '3'

services:
  db:
    container_name: horton-mongodb-local
    image: mongo:4.2-bionic
    command: mongod --port 20017
    restart: always
    ports:
      - 20017:20017
    environment:
      - MONGO_INITDB_DATABASE=horton
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin_password

  kafka-service:
    container_name: horton-kafka-local
    image: obsidiandynamics/kafka
    restart: always
    ports:
      - "2181:2181"
      - "9092:9092"
    environment:
      KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9092"
      KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka-service:29092,EXTERNAL://localhost:9092"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
      KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
      KAFKA_ZOOKEEPER_SESSION_TIMEOUT: "6000"
      KAFKA_RESTART_ATTEMPTS: "10"
      KAFKA_RESTART_DELAY: "5"
      ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL: "0"

  kafdrop:
    container_name: horton-kafdrop-local
    image: 'obsidiandynamics/kafdrop:latest'
    restart: always
    ports:
      - '9000:9000'
    environment:
      KAFKA_BROKERCONNECT: kafka-service:29092
    depends_on:
      - kafka-service

์—ฌ๊ธฐ์—๋Š” ์ „ํ˜€ ๋ณต์žกํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. Kafka์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜(๋‚ด๋ถ€)๋Š” ๋ณตํ•ฉ ๋„คํŠธ์›Œํฌ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๊ณ , ๋‘ ๋ฒˆ์งธ(์™ธ๋ถ€)๋Š” ์™ธ๋ถ€ ์š”์ฒญ์„ ์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์™ธ๋ถ€๋กœ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. 2181 - ์‚ฌ์œก์‚ฌ ํฌํŠธ. ๋‚˜๋จธ์ง€๋Š” ๋ถ„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ๋ผˆ๋Œ€ ์ค€๋น„

๊ธฐ๋ณธ ๋ฒ„์ „์—์„œ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

horton
โ”œโ”€โ”€ docker-compose.yml
โ””โ”€โ”€ horton
    โ”œโ”€โ”€ agents.py *
    โ”œโ”€โ”€ alphavantage.py *
    โ”œโ”€โ”€ app.py *
    โ”œโ”€โ”€ config.py
    โ”œโ”€โ”€ database
    โ”‚   โ”œโ”€โ”€ connect.py
    โ”‚   โ”œโ”€โ”€ cruds
    โ”‚   โ”‚   โ”œโ”€โ”€ base.py
    โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
    โ”‚   โ”‚   โ””โ”€โ”€ security.py *
    โ”‚   โ””โ”€โ”€ __init__.py
    โ”œโ”€โ”€ __init__.py
    โ”œโ”€โ”€ records.py *
    โ””โ”€โ”€ tasks.py *

*๋‚ด๊ฐ€ ๋ฉ”๋ชจํ•œ ๋ชจ๋“  ๊ฒƒ ์•„์ง ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ๋นˆ ํŒŒ์ผ๋งŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.**

์šฐ๋ฆฌ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ•„์š”ํ•œ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ตฌ์„ฑ์„ ์ž‘์„ฑํ•˜๊ณ  mongodb์— ์—ฐ๊ฒฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์‚ฌ์— ํฌํ•จ๋œ ํŒŒ์ผ์˜ ์ „์ฒด ํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ•„์š”ํ•œ ๋ฒ„์ „์— ๋Œ€ํ•œ ๋งํฌ๋Š” ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ข…์†์„ฑ๊ณผ ๋ฉ”ํƒ€๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. pyproject.toml

๋‹ค์Œ์œผ๋กœ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๊ณ  virtualenv๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” venv ํด๋”๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ์Œ).

pip3 install poetry (ะตัะปะธ ะตั‰ั‘ ะฝะต ัƒัั‚ะฐะฝะพะฒะปะตะฝะพ)
poetry install

์ด์ œ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค config.yml - ์ž๊ฒฉ ์ฆ๋ช… ๋ฐ ๋…ธํฌ ์žฅ์†Œ. ๊ฑฐ๊ธฐ์— Alphavantage์šฉ ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€์ž config.py โ€” ๊ตฌ์„ฑ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ๋„ค, ๊ณ ๋ฐฑํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” lib๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œํŠธ๋ฆฌ.

Mongo์— ์—ฐ๊ฒฐํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ฐœํ‘œ ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค ์—ฐ๊ฒฐํ•˜๊ณ  ๊ธฐ๋ณธ ํด๋ž˜์Šค ํฌ๋ฃจ๋“œ์˜ ๊ฒฝ์šฐ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ์€ ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์„œ๋Š” ๋™๊ธฐ ๋ถ€์—ฌ์™€ ์ค€๋น„์— ๋Œ€ํ•ด์„œ๋งŒ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ธฐ์‚ฌ๊ฐ€ ๊ทธ๋ฆฌ ๊ธธ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ €๋ฅผ ๋น„๋‚œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‹ค์Œ ๋ถ€๋ถ„์—๋Š” ์•ก์…˜๊ณผ ๊ทธ๋ž˜ํ”ฝ์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐ”๋กœ ๋‹ค์Œ ๋ถ€๋ถ„์—์„œ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•„์š”ํ•œ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ aiohttp์— alphavantage์šฉ ์†Œ๊ทœ๋ชจ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  2. ์ฆ๊ถŒ ๋ฐ ๊ณผ๊ฑฐ ๊ฐ€๊ฒฉ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ

์ด ๋ถ€๋ถ„์˜ ์ฝ”๋“œ

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€