Sketch of ConvBridge - aragorn/home GitHub Wiki

ConvBridge - ๊ฒ€์ƒ‰์—”์ง„์„ ์œ„ํ•œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„ ์ธํ„ฐํŽ˜์ด์Šค

  • ์›์‹œ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ, ๋ฐ์ดํ„ฐ๋ณ€ํ™˜๊ธฐ API, ๊ฒ€์ƒ‰์—”์ง„์— ๋‚ด์žฅ๋œ ๋ฐ์ดํ„ฐ์ˆ˜์ง‘ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•œ๋‹ค.
  • ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ด๊ธฐ์ข… ๋ฐ์ดํ„ฐ์ €์žฅ์†Œ ๊ฐ„์˜ Extract, Transform, Load ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ณ€ํ™˜๊ธฐ API, ๋ฐ์ดํ„ฐ์ˆ˜์ง‘ ํ”„๋กœ๊ทธ๋žจ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ConvBridge ๋ผ ๋ถ€๋ฅธ๋‹ค.

๋ฐ์ดํ„ฐ๋ณ€ํ™˜๊ธฐ API์˜ ๊ตฌ์„ฑ

๊ฐœ์š”

๋ฐ์ดํ„ฐ๋ณ€ํ™˜๊ธฐ API๋Š” ์ž„์˜์˜ ๋ฐฑ์—”๋“œ ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์—ฐ๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ๋ชฉ๋ก, ๋ณ€๊ฒฝ๋‚ด์—ญ ๋ชฉ๋ก ๋“ฑ 2๊ฐ€์ง€ ๋ฐฉ์‹์˜ ๋ชฉ๋ก์„ ์ œ๊ณตํ•˜๊ณ , ์ด๋ฅผ ์ด์šฉํ•ด ์ด๊ธฐ์ข… DB ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ์—ฐ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์ „์ฒด ๋ชฉ๋ก์€ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ž๋ฃŒ๋ฅผ ๋น ์ง์—†์ด ๋ชจ๋‘ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ „์ฒด ๋ชฉ๋ก์„ ๋‚˜์—ดํ•˜๊ธฐ ์œ„ํ•ด API ํ˜ธ์ถœ์„ ์—ฌ๋Ÿฌ์ฐจ๋ก€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ๋Ÿฌ์ฐจ๋ก€ ์ˆ˜ํ–‰ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ์ฐจ๋ก€ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ(Consistency) ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, RDBMS์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ํŠน์ • ์‹œ์ ์˜ snapshot์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ณ€๊ฒฝ๋‚ด์—ญ ๋ชฉ๋ก์€ mysql binlog ์™€ ๊ฐ™์€ ์‹œ๊ฐ„์ˆœ์„œ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ CRUD๋ฅผ ๋น ์ง์—†์ด ๋ชจ๋‘ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋ณ€๊ฒฝ๋‚ด์—ญ ๋ชฉ๋ก์€ ๊ฐ ๋ฐ์ดํ„ฐ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ์ผ๋ จ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ์ด ์ผ๋ จ๋ฒˆํ˜ธ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๊ฒฐ๊ณผ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „์ฒด ๋ชฉ๋ก๊ณผ ๋ณ€๊ฒฝ๋‚ด์—ญ ๋ชฉ๋ก, 2๊ฐ€์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๊ธฐ์ข… DB ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ์—ฐ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„ ๋„์ค‘์—๋Š” ์—ฐ๊ณ„๋œ DB์˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ์ผ์‹œ์ ์œผ๋กœ ๊นจ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ฒฐ๊ตญ ์‹œ๊ฐ„์ด ์ง€๋‚˜ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถœ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” Eventual Consistency ๋ชจ๋ธ์„ ๋”ฐ๋ฅด๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜๊ธฐ API๋ฅผ 'Converter'๋ผ๊ณ  ์ด๋ฆ„ ์ง“๋Š”๋‹ค.

์šฉ์–ด

  • ์ •์ (static) ์—ฐ๊ณ„ : ์†Œ์Šค ๋ฐ์ดํ„ฐ์˜ ์ „์ฒด ๋ชฉ๋ก์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ๋™์ (dynamic) ์—ฐ๊ณ„ : ์†Œ์Šค ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ๋‚ด์—ญ ๋ชฉ๋ก์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • next_url : ๋ชฉ๋ก์„ ๋‚˜์—ดํ•˜๋Š” API์—์„œ ์ดํ›„ ํ˜ธ์ถœํ•  API ์ฃผ์†Œ๋ฅผ next_url ์ด๋ผ ํ•œ๋‹ค.

API ์•„ํ‚คํ…์ฒ˜

RESTful API

REST(Representational State Transfer) ๋ฐฉ์‹์˜ API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ์ผ๋ฐ˜์ ์ธ RESTful API์™€ ๋‹ฌ๋ฆฌ, ๋ฐ์ดํ„ฐ ์ž…๋ ฅ/์ˆ˜์ •์— ๋Œ€์‘ํ•˜๋Š” API๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ConvBridge๋Š” ๊ทธ ํŠน์„ฑ์ƒ ์†Œ์Šค ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์ฝ๊ธฐ์ „์šฉ ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณตํ•˜๋ฉฐ, ์†Œ์Šค ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ˆ˜์ •์ด๋‚˜ ์ž…๋ ฅ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ์†Œ์Šค ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ˆ˜์ •, ์ž…๋ ฅ์€ ํ•ด๋‹น ์†Œ์Šค DB์—์„œ ์ง์ ‘ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

URL ์ฒด๊ณ„

API์˜ URL์—์„œ ๋‹ค์Œ์˜ ํ•ญ๋ชฉ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‚ค์›Œ๋“œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋“œ๋Ÿฌ๋‚ธ๋‹ค.

  1. ์›์ถœ์ฒ˜ ๋ฐ์ดํ„ฐ์˜ ์ด๋ฆ„
  2. ๋ชฉ๋ก๋‚˜์—ด ๋ฐฉ์‹ : static or dynamic
  3. API ๋ฆฌ๋น„์ „
    ์„œ๋น„์Šค ์ค‘์ธ ๊ธฐ์กด ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ ์—†์ด ์ˆ˜์ •/๋ฐฐํฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๋”ฐ๋ผ์„œ, ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋Š” revision ๋‹จ์œ„๋กœ ๋ฐฐํฌํ•˜๊ณ , ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” revision์˜ ์ฝ”๋“œ๋Š” ์šด์˜์ž๊ฐ€ ์ ๊ฒ€ํ•˜์—ฌ ์„œ๋น„์Šค์—์„œ ์ œ๊ฑฐํ•œ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” revision์ด ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ์—๋„ ์šด์˜์ž๊ฐ€ ์ ๊ทน์ ์œผ๋กœ API ์‚ฌ์šฉ์ž์™€ ํ˜‘์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ „ํ™˜ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ revision ์ฒด๊ณ„๋ฅผ ํ†ตํ•ด, API ๊ฐœ์„ ์„ ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•˜๊ณ , ๋ฐฐํฌ ๊ณผ์ •์—์„œ ํ˜ธํ™˜์„ฑ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•œ๋‹ค.
  4. ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฐฉ์‹
    ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๋ชฉ๋ก ํ˜•ํƒœ๋กœ ์ ‘๊ทผํ•˜๋Š” list, ID๋ฅผ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋กœ ์ง€์ •ํ•˜์—ฌ ํŠน์ • ๋ฌธ์„œ๋ฅผ ์กฐํšŒํ•˜๋Š” each, 2๊ฐ€์ง€ ์กฐํšŒ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค. each์˜ ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐํ™•์ธ, ์ œํ•œ๋œ ๋ฐ์ดํ„ฐ ์กฐํšŒ, ๋””๋ฒ„๊น… ๋“ฑ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  5. ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ ํ˜•์‹์˜ ์ด๋ฆ„

URL์˜ ์˜ˆ์‹œ

http://cb.dev.example.com/v1/blog/r123/static/list.breeze2 http://cb.dev.example.com/v1/blog/r123/static/list.xml http://cb.dev.example.com/v1/blog/r123/static/each.xml http://cb.dev.example.com/v1/blog/current/static/list.breeze2 http://cb.dev.example.com/v1/blog/r123/dynamic/list.breeze2 http://cb.dev.example.com/v1/blog/current/dynamic/list.breeze2

URL ํŒŒ๋ผ๋ฏธํ„ฐ

๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์•„๋ž˜์™€ ๊ฐ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ž…๋ ฅ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, next_url๋งŒ์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋˜๊ณ , ๋ฐ์ดํ„ฐ๋Š” ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๊ฒฝ์šฐ ์ถœ๋ ฅ๋˜๋Š” next_url์€ ์ •์  ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„์˜ ๊ฒฝ์šฐ, ์ „์ฒด๋ชฉ๋ก์˜ ์ฒซ๋ฒˆ์งธ ๋ชฉ๋ก์— ํ•ด๋‹นํ•˜๊ณ , ๋™์  ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„์˜ ๊ฒฝ์šฐ ์ตœ์‹  ๋ชฉ๋ก์— ํ•ด๋‹นํ•œ๋‹ค.

  • list : from, count, to
    ์†Œ์Šค๋ฐ์ดํ„ฐ ๋ชฉ๋ก์˜ ๊ฐ entry์— ์ผ๋ จ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ์ด ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชฉ๋ก์˜ ์ผ๋ จ๋ฒˆํ˜ธ๋ฅผ sequence id๋ผ ํ†ต์นญํ•œ๋‹ค. from ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์ธ ์ผ๋ จ๋ฒˆํ˜ธ๋Š” ๋Œ€์†Œ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด๋ฉด ์ถฉ๋ถ„ํ•˜๋ฉฐ, ์‹ค์ œ ์ด ๊ฐ’์„ ํ•ด์„ํ•˜๋Š” ๊ฒƒ์€ API ๋‚ด๋ถ€ ๊ตฌํ˜„์ฒด์ด๋‹ค. ์™ธ๋ถ€์—์„œ๋Š” ์ด ๊ฐ’์„ ํ•ด์„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. to ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ์กฐ๊ฑด์„ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, from์˜ ๊ฐ’์ด to์˜ ๊ฐ’๋ณด๋‹ค ์ปค์ง€๋Š” ๊ฒฝ์šฐ, ์—ฐ๊ณ„๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ๋œ๋‹ค.
  • each : docid=xx docid=x1,x2,x3,x4 docid=x1&id=x2&id=x3 ํŒŒ๋ผ๋กœ ์ง€์ •ํ•œ ํŠน์ •ํ•œ ๋ฌธ์„œ๋ฅผ ์กฐํšŒํ•œ๋‹ค. TODO - ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„๊ณผ ๊ฐ’ ๋“ฑ ํ˜•์‹์€ ์ถ”ํ›„ ๊ฒฐ์ •.

๋ชฉ๋ก์˜ ๋‹ค์Œ ํ˜ธ์ถœ ๋งํฌ

๋ฐ์ดํ„ฐ ์—ฐ๊ณ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ชฉ๋ก ์ ‘๊ทผ API์˜ ๊ฒฝ์šฐ, ์—ฐ์†๋œ ์ดํ›„ API ํ˜ธ์ถœ์˜ URL์„ ์ œ๊ณตํ•œ๋‹ค. API ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ๋Š” ์ œ๊ณต๋˜๋Š” ์ดํ›„ API ํ˜ธ์ถœ URL๋งŒ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์† ๋”ฐ๋ผ๊ฐ€๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๋‹น ๋ชฉ๋ก์„ ๋ชจ๋‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ, API๋Š” ๋น ์ง์—†์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์„ฑ์„ ๋ณด์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

API ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชฉ๋ก์˜ ๋‹ค์Œ ํ˜ธ์ถœ ๋งํฌ๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด, API ํ˜ธ์ถœ ํŒŒ๋ผ๋ฉ”ํ„ฐ์˜ ์„ธ๋ถ€ ๋‚ด์šฉ์— ๋Œ€ํ•ด ๊ด€์—ฌํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ ํ˜•์‹

API์—์„œ ๋ณ€ํ™˜ํ•˜์—ฌ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์œผ๋กœ๋Š” ๋‹ค์Œ์˜ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

  • custom json - ๊ฒ€์ƒ‰์—”์ง„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  • source tag - ๊ฒ€์ƒ‰์—”์ง„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  • mysql - MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ž๋ฃŒ๋ฅผ ์—ฐ๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

API ์„œ๋ฒ„ ์žฅ์• ์— ๋”ฐ๋ฅธ ์˜ค๋ฅ˜๋ณต๊ตฌ ๋ฐฉ์•ˆ

API ์„œ๋ฒ„๋Š” ๋‹จ์ผ ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, ํŠน์ • ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, API ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์„ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ์žฌ์‹œ๋„ํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋ณต๊ตฌํ•˜๊ฒŒ ๋œ๋‹ค. API ํด๋ผ์ด์–ธํŠธ๋Š” next_url์„ ์ฐธ์กฐํ•˜์—ฌ ์ดํ›„์˜ API ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, API ์„œ๋ฒ„๋Š” ๋ณต์ˆ˜์˜ next_url์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ด next_url ์€ ์–ด๋А ๊ฒƒ์„ ์„ ํƒํ•˜์—ฌ ํ˜ธ์ถœํ•˜์—ฌ๋„ ๋™๋“ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ณด๋‚ด์–ด ์ค€๋‹ค. API ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณต์ˆ˜์˜ next_url์— ๋Œ€ํ•ด ์ž„์˜์˜ ์ˆœ์„œ๋กœ ์š”์ฒญ์„ ์‹œ๋„ํ•˜๋ฉด ๋˜๊ณ , ๋ชจ๋“  next_url์— ๋Œ€ํ•ด ํ˜ธ์ถœ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐ˜๋ณต์ ์œผ๋กœ ์š”์ฒญ์„ ์žฌ์‹œ๋„ ํ•œ๋‹ค.

next_url

API ์„œ๋ฒ„๋Š” ๋ณต์ˆ˜์˜ next_url์„ ๋ฆฌ์ŠคํŠธ ํ˜•์œผ๋กœ ๋‚ด๋ณด๋‚ด์–ด ์ค€๋‹ค. 1๊ฐœ์˜ null์„ list ํ•ญ๋ชฉ์œผ๋กœ ๊ฐ–๋Š” ๊ฒฝ์šฐ, next_url์ด ๋น„์–ด์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋ฆฌ์ŠคํŠธ ์ž์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ณ  null์ด ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†์–ด์•ผ ํ•œ๋‹ค.

"next_urls" : ["http://host1/path/api", "http://host2/path/api"] - ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ
"next_urls" : [null] - ์ •์ƒ์ ์œผ๋กœ next_url์ด ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ
"next_urls" : null - ์—†๋Š” ๊ฒฝ์šฐ์ž„. API์„œ๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ์‘๋‹ต์„ ํ•˜์ง€ ์•Š์Œ.

๋ฐ์ดํ„ฐ์—ฐ๊ณ„ ํ”„๋กœ์„ธ์Šค

์ •์  ๋ฐ์ดํ„ฐ์—ฐ๊ณ„์˜ ์ƒ์„ธ ํ”„๋กœ์„ธ์Šค

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

์ •์  ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„์˜ ๊ฒฝ์šฐ, ์ดˆ๊ธฐ ํ˜ธ์ถœ URL ์ดํ›„ next_url์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, next_url์ด ๋นˆ ๊ฐ’์ด ๋˜๋Š” ๊ฒฝ์šฐ, ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ ‘๊ทผํ•œ ๊ฒƒ์ด๋ฉฐ, ์ •์  ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์ด๋‹ค.

API ์ƒ์„ธ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ์ •์  ์ƒ‰์ธ์˜ ๊ฒฝ์šฐ, ์ตœ์ดˆ ์‹œ๋„์‹œ from=seqid1&to=seqid2&count=100 ๊ณผ ๊ฐ™์€ next_url์„ ์ œ๊ณตํ•œ๋‹ค. API ์„œ๋ฒ„๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ์ „๋‹ฌ๋˜๋Š” to ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๋ฒ”์œ„๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๊ทธ ์ดํ›„์—๋Š” next_url์„ ๋นˆ ๊ฐ’์œผ๋กœ ์‘๋‹ตํ•œ๋‹ค.

๋™์  ๋ฐ์ดํ„ฐ์—ฐ๊ณ„

๋™์  ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„์˜ ๊ฒฝ์šฐ, ์ดˆ๊ธฐ ํ˜ธ์ถœ URL ์ดํ›„ next_url์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ •์  ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„์™€ ๋‹ฌ๋ฆฌ, ์™„๋ฃŒ์‹œ์ ์ด ์—†์œผ๋ฉฐ, ๋™์  ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„๋ฅผ ์œ ์ง€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œํžˆ next_url์„ ๊ณ„์† ์ ‘๊ทผํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ๋™์  ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ค‘๋‹จํ•˜๋Š” ๊ฒฝ์šฐ, API ํด๋ผ์ด์–ธํŠธ๋Š” ์ด next_url์„ ๊ธฐ์–ตํ•ด ๋‘๊ณ , ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„๋ฅผ ์žฌ๊ฐœํ•  ๋•Œ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

๋ฐ์ดํ„ฐ ์—ฐ๊ณ„ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ

์ •์  ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„์˜ ๊ฒฝ์šฐ, ์–ด๋–ค url์— ๋Œ€ํ•ด 1ํšŒ์˜ ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ์ด ์กด์žฌํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ, next_url์ด ๋นˆ ๊ฐ’์ด ๋œ๋‹ค. ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ์€ ๋”์ด์ƒ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ด๊ฑฐ๋‚˜, from ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์ด to ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’๋ณด๋‹ค ์ปค์ง€๋Š” ๊ฒฝ์šฐ์ด๋‹ค. from, to ํŒŒ๋ผ๋ฉ”ํ„ฐ์˜ ๊ฐ’์„ ์„ธ๋ถ€์ ์œผ๋กœ ์‚ดํŽด๋ณด๋ฉด, ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์–‘๊ณผ ํ˜„์žฌ ์ง„ํ–‰ ์ •๋„๋ฅผ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™์  ๋ฐ์ดํ„ฐ ์—ฐ๊ณ„์˜ ๊ฒฝ์šฐ, ์ตœ๊ทผ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋ชจ๋“œ ์—ฐ๊ณ„๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ์ด ์ผ์‹œ์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์‘๋‹ต์„ API ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. TODO

์ฐธ๊ณ ์ž๋ฃŒ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ