arrow-left

All pages
gitbookPowered by GitBook
1 of 7

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

API Handler

hashtag
B. API Handler

Dynamic Handler

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

๋™์  ํ•ธ๋“ค๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ธŒ๋žœ์น˜ ํ•ธ๋“ค๋Ÿฌ๋กœ ์š”์ฒญ์„ ํ”„๋ก์‹œํ•ฉ๋‹ˆ๋‹ค.

Branch Handler

๋ธŒ๋žœ์น˜ ํ•ธ๋“ค๋Ÿฌ๋Š” ํƒœ๊ทธ์— ๋”ฐ๋ผ ๋ฒ„์ „ ํ•ธ๋“ค๋Ÿฌ๋กœ ์š”์ฒญ์„ ํ”„๋ก์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ธŒ๋žœ์น˜ ํ•ธ๋“ค๋Ÿฌ๋“ค์€ ์•„๋ž˜์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

  • master ๋ธŒ๋žœ์น˜๋ฅผ ์ œ์™ธํ•˜๊ณ , 60๋ถ„ ์ด์ƒ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๋ธŒ๋žœ์น˜ ํ•ธ๋“ค๋Ÿฌ๋Š” ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

Version Handler

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

์ด ๋ฒ„์ „ ํ•ธ๋“ค๋Ÿฌ๋“ค์€ ์•„๋ž˜์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

  • 10๊ฐœ๋ฅผ ์ดˆ๊ณผ(๊ธฐ๋ณธ๊ฐ’)ํ•˜๋Š” ๋ฒ„์ „์ด ์กด์žฌํ•œ๋Š” ๊ฒฝ์šฐ ์˜ค๋ž˜๋œ ์ˆœ์œผ๋กœ ๋ฒ„์ „ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

Non-Persistence

API ์Šคํ‚ค๋งˆ์˜ ๋ธŒ๋žœ์น˜ ๋ฐ ํƒœ๊ทธ ๊ธฐ๋Šฅ์€ ๋ฒ„์ „ ๊ด€๋ฆฌ(/v1, /v2 ๊ฐ™์€)๊ฐ€ ์•„๋‹Œ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ๊ฐœ๋ฐœ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ

  • Gateway์—๋Š” Persistence Layer๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • Gateway ์žฌ์‹œ์ž‘์‹œ ๋ธŒ๋žœ์น˜, ๋ฒ„์ „ ๋ฐ ํƒœ๊ทธ ์ •๋ณด๊ฐ€ ๋ณต์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • Gateway ๋…ธ๋“œ๊ฐ„์— ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ์ „๋žต์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Gateway ์žฌ์‹œ์ž‘ ์ดํ›„ ๋ชจ๋“  ์„œ๋น„์Šค๋“ค์— ๋Œ€ํ•œ discover๊ฐ€ ์ง„ํ–‰๋˜๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฐ ๋ธŒ๋žœ์น˜์˜ latest ๋ฒ„์ „์—๋Š” ์ตœ์‹  Gateway API ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณต์›๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ธŒ๋žœ์น˜์˜ latest ๋ฒ„์ „์˜ ์‹ ๋ขฐ์„ฑ์€ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

Gateway ๋…ธ๋“œ๊ฐ„์— ์„œ๋น„์Šค API ์Šคํ‚ค๋งˆ ๋ณ‘ํ•ฉ์˜ ์ˆœ์„œ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Branch, Version, Integration

Integration Process

๋ณ‘ํ•ฉ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • discover

    • discover ๋ฐœ์ƒ ์ฆ‰์‹œ ๋ณ‘ํ•ฉ ์š”์ฒญ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

    • ํ”„๋กœํ† ์ฝœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋”ฐ๋ผ ์Šคํ‚ค๋งˆ ํฌ๋งท์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

      • ํฌ๋งท ์—๋Ÿฌ๋Š” ๋ณ‘ํ•ฉ ์š”์ฒญ ๋ฉ”์„ธ์ง€ ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

      • ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์šฐํšŒํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๊ฐ€ ๋ณ‘ํ•ฉ ์š”์ฒญ ๋ฉ”์„ธ์ง€ ๋ฆฌ์ŠคํŠธ์— ํฌํ•ฉ๋ฉ๋‹ˆ๋‹ค.

    • ๊ฒ€์ฆ ์„ฑ๊ณต์‹œ ๋ณ‘ํ•ฉ ์š”์ฒญ์ด ํ์— ์‚ฝ์ž…๋˜๋ฉด์„œ ํŠน์ • ์‹œ๊ฐ„(2์ดˆ๋ฅผ ๊ธฐ๋ณธ๊ฐ’) ๋™์•ˆ debounce ํ›„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

      • ํ์—์„œ ํŠน์ • ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์š”์ฒญ์ด ๋‹ค์ˆ˜์ธ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

      • ํ”„๋กœํ† ์ฝœ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ integrationDependencyResolver๊ฐ€ ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ (eg. GraphQL) ํ ์•ˆ์—์„œ ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ์กฐ์ • ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๊ฒ€์ฆ ์‹คํŒจ์‹œ report ๋‹จ๊ณ„๋กœ ๊ฑด๋„ˆ ๋œ๋‹ˆ๋‹ค.

  • hash

    • ์„œ๋น„์Šค API ์Šคํ‚ค๋งˆ์—์„œ branch, description, deprecated๋“ฑ์˜ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ์ œ์™ธํ•œ ์Šคํ‚ค๋งˆ ๊ฐ์ฒด ์ „์ฒด๋ฅผ MD5 ํ•ด์‹ฑํ•˜์—ฌ ๊ณ ์œ ํ•œ ๋ฒ„์ „ ํ•ด์‹œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • update

    • master ๋ธŒ๋žœ์น˜์˜ ์Šคํ‚ค๋งˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋“  ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ์ด ์‹œ๋„๋ฉ๋‹ˆ๋‹ค.

      • ์ด ๋•Œ master

  • report

    • ๋ณ‘ํ•ฉ ์š”์ฒญ์˜ ๋ฉ”์„ธ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋””๋ฒ„๊ทธ ๋ฉ”์„ธ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ๋ณ‘ํ•ฉ ์š”์ฒญ์˜ ์ถœ์ฒ˜ ๋…ธ๋“œ๋กœ ๋””๋ฒ„๊ทธ ๋ฉ”์„ธ์ง€๋ฅผ reportํ•ฉ๋‹ˆ๋‹ค.

  • Branch Strategy Diagram

    ๋ธŒ๋žœ์น˜๊ฐ„ ๋ณ‘ํ•ฉ ์ „๋žต์„ ํ‘œ๋กœ ๋„์‹ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    ํ‘œ์—์„œ a@v1๋Š” a ์„œ๋น„์Šค ์Šคํ‚ค๋งˆ ์ค‘ v1 ๋ฒ„์ „์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ดํŠธ์›จ์ด์— ๋ฒ„์ „์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ์ด ๋Š๊ธด ๊ฒฝ์šฐ๋Š” ์—ฐ๊ด€๋œ ์Šคํ‚ค๋งˆ์˜ ๋…ธ๋“œํ’€์—์„œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    • ์ด ๋•Œ ์—ฐ๊ด€๋œ ์Šคํ‚ค๋งˆ๋“ค์—์„œ ๋…ธ๋“œํ’€์ด ๋นˆ ์Šคํ‚ค๋งˆ๋“ค์„ ์ œ๊ฑฐํ•˜๊ธฐ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

  • ์™ธ์˜ ๋ธŒ๋žœ์น˜์—์„œ ์Šคํ‚ค๋งˆ์˜ ์„œ๋น„์Šค๋ช…์ด ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์Šคํ‚ค๋งˆ์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.
  • ์ด์™ธ์˜ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฃผ์–ด์ง„ ๋ธŒ๋žœ์น˜์—๋งŒ ๋ณ‘ํ•ฉ์ด ์‹œ๋„๋ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœํ† ์ฝœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋”ฐ๋ผ ๊ฐ ํ”„๋กœํ† ์ฝœ๋ณ„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ๋ณ‘ํ•ฉ์— ์„ฑ๊ณตํ•˜๋ฉด ์ƒ์„ฑ๋œ Gateway API ์Šคํ‚ค๋งˆ ๋ฒ„์ „์— latest ํƒœ๊ทธ ๋ฐ 8 ๊ธ€์ž์˜ ์ˆ ํ•ด์‹œ(eg. abcdefgh)๊ฐ€ ํƒœ๊ทธ๋กœ ๋ถ€์ฐฉ๋ฉ๋‹ˆ๋‹ค.

  • ์˜ต์…˜์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ๋ธŒ๋žœ์น˜๋ณ„ API Catalog๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

  • ์˜ต์…˜์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ๋ธŒ๋žœ์น˜๋ณ„ Service Catalog๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

  • master

    dongwook

    ๋น„๊ณ 

    initial schema

    (empty)

    N/A

    a added to master

    a@v1

    N/A

    a updated to master

    a@v2

    N/A

    b added to dongwook

    a@v2

    a@v2 b@v1

    ์ƒˆ๋กœ์šด b ์„œ๋น„์Šค๋ฅผ dongwook ๋ธŒ๋žœ์น˜๋กœ ๋ถ„๊ธฐํ•ด์„œ ์ž‘์—…; ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ์Šคํ‚ค๋งˆ๋“ค์€ ๋ณต์ œ๋˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค.

    a updated to master

    a@v3

    a@v3 b@v1

    master ๋ธŒ๋žœ์น˜์˜ ์—…๋ฐ์ดํŠธ๋Š” ๋ชจ๋“  ๋ธŒ๋žœ์น˜๋กœ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.

    a updated to dongwook

    a@v3

    a@v4 b@v1

    master ์ด์™ธ์˜ ๋ธŒ๋žœ์น˜์˜ ์—…๋ฐ์ดํŠธ๋Š” ์ž๊ธฐ ๋ธŒ๋žœ์น˜๋กœ๋งŒ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.

    a updated to master

    a@v3-2

    a@v4 b@v1

    ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ ์ž๊ธฐ ๋ธŒ๋žœ์น˜ ์Šคํ‚ค๋งˆ์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.

    c added to master

    a@v3-2 c@v1

    a@v5 b@v1 c@v1

    master ๋ธŒ๋žœ์น˜์˜ ์—…๋ฐ์ดํŠธ๋Š” ๋ชจ๋“  ๋ธŒ๋žœ์น˜๋กœ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.

    b added to master

    a@v3-2 b@v1 c@v1

    a@v5 b@v1 c@v1

    ๊ฐœ๋ฐœ๋œ b ์„œ๋น„์Šค๋ฅผ dongwook ๋ธŒ๋žœ์น˜์—์„œ master ๋ธŒ๋žœ์น˜๋กœ ๋ณ€๊ฒฝ

    a updated to master

    a@v5 b@v1 c@v1

    a@v5 b@v1 c@v1

    ์ˆ˜์ •๋œ a ์„œ๋น„์Šค๋ฅผ dongwook ๋ธŒ๋žœ์น˜์—์„œ master ๋ธŒ๋žœ์น˜๋กœ ๋ณ€๊ฒฝ

    dongwook branch removed

    a@v5 b@v1 c@v1

    N/A

    Routing Rule

    Gateway ์›น ์„œ๋ฒ„๋Š” [/~BRANCH[@TAG]]/<ENDPOINT>์˜ ๊ทœ์น™๋Œ€๋กœ API ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ผ์šฐํŠธํ•ฉ๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ๊ฒฝ๋กœ ์กฐ๊ฐ์„ ๋ธŒ๋žœ์น˜(master๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ)๋กœ ๋‘๋ฒˆ์งธ ๊ฒฝ๋กœ ์กฐ๊ฐ์„ ํƒœ๊ทธ(latest๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ)๋กœ ์ดํ•˜ ๊ฒฝ๋กœ๋ฅผ API ์—”๋“œํฌ์ธํŠธ๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค.

    ๋ผ์šฐํŠธ ์˜ˆ์‹œ

    ๊ฐ„๋žต

    ๋ธŒ๋žœ์น˜ ํฌํ•จ

    ํƒœ๊ทธ ํฌํ•จ

    GET /players/1

    GET /~master/players/1

    GET /~master@latest/players/1

    -

    -

    GET /~master@h4g3f2e1/players/1

    -

    GET /~dongwook/players/1

    GET /~dongwook@latest/players/1

    -

    ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰์€ ๋™์ผํ•œ ๋ฒ„์ „์˜ ํ•ธ๋“ค๋Ÿฌ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

    ๋ธŒ๋žœ์น˜ ์ด๋ฆ„ ๊ทœ์น™

    • ์˜๋ฌธ ์†Œ๋ฌธ์ž ๋ฐ ์ˆซ์ž, -, _๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

    • ๊ธฐ์กด ์Šคํ‚ค๋งˆ ์—”๋“œํฌ์ธํŠธ๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ base ๊ฒฝ๋กœ์™€ ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    ํƒœ๊ทธ ์ด๋ฆ„ ๊ทœ์น™

    • ์˜๋ฌธ ์†Œ๋ฌธ์ž ๋ฐ ์ˆซ์ž๋กœ๋งŒ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

    ์ด๋ฒคํŠธ/๋ธŒ๋žœ์น˜

    -

    GET /~dongwook@a4b3c2d1/players/1

    POST /graphql

    POST /~master/graphql

    GET /~master@latest/graphql

    -

    POST /~dongwook/graphql

    GET /~dongwook@latest/graphql

    -

    GET /~ws-dev/chat

    GET /~ws-dev@latest/chat

    Schema Registry

    hashtag
    A. Schema Integration

    ์„œ๋น„์Šค API ์Šคํ‚ค๋งˆ๋Š” ์„œ๋น„์Šค ๋ธŒ๋กœ์ปค์— ์˜์กดํ•ด Gateway๋กœ ์ˆ˜์ง‘๋˜๊ณ  ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. Moleculer ์–ด๋Œ‘ํ„ฐ๋กœ ์ž‘์„ฑ๋œ ์„œ๋น„์Šค ๋ธŒ๋กœ์ปค์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ServiceSchema์˜ metadata.api ํ•„๋“œ์—์„œ ์„œ๋น„์Šค API ์Šคํ‚ค๋งˆ๊ฐ€ ์ˆ˜์ง‘๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

    ์„œ๋น„์Šค API ์Šคํ‚ค๋งˆ์˜ ๋ณ‘ํ•ฉ์€ ์„œ๋น„์Šค ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ, ์ข…๋ฃŒ, ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค API ์Šคํ‚ค๋งˆ๋Š” ์ž์‹ ์˜ ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ‘ํ•ฉ ํ•  ๋ธŒ๋žœ์น˜๋ฅผ ์Šคํ‚ค๋งˆ์— ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. Gateway์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ master ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒ์„ฑ๋˜์–ด์žˆ์œผ๋ฉฐ, master ๋ธŒ๋žœ์น˜๋Š” ์ œ๊ฑฐ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    Health Check

    API Document Generation

    hashtag
    C. Reflection

    API Gateway Health Check

    Gateway ์›น์„œ๋ฒ„ ์ž์ฒด์˜ ์ƒํƒœ ํ™•์ธ์šฉ HTTP ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋‚˜ Kubernetes ๋“ฑ์˜ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ์—์„œ ํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • GET /~health/liveness ์—”๋“œํฌ์ธํŠธ์—์„œ ์›น ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • GET /~health/readiness ์—”๋“œํฌ์ธํŠธ์—์„œ ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Gateway ์ƒํƒœ์— ๋”ฐ๋ฅธ ๊ฐ ์—”๋“œํฌ์ธํŠธ์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    API Endpoint Health Check

    Gateway API ์Šคํ‚ค๋งˆ์˜ ๊ฐ ์—”๋“œํฌ์ธํŠธ ๋ณ„ ์ƒํƒœ ํ™•์ธ ๊ธฐ๋Šฅ์„ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—”๋“œํฌ์ธํŠธ์— ์—ฐ๊ฒฐ๋œ ์ปค๋„ฅํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํƒœ๊ฐ€ ์ธก์ •๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ปค๋„ฅํ„ฐ์˜ ์ƒํƒœ ํ™•์ธ์€ ์„œ๋น„์Šค ๋ธŒ๋กœ์ปค์—๊ฒŒ ์œ„์ž„๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์•„๋ž˜์˜ ์„น์…˜์„ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    API ์—”๋“œํฌ์ธํŠธ์˜ ์ƒํƒœ๋Š” ์œ„์ฒ˜๋Ÿผ HTTP๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉฐ ์•„๋ž˜์˜ API Catalog๋ฅผ ํ†ตํ•ด์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

    API Catalog

    API Catalog๋Š” REST, GraphQL, WebSocket ๋“ฑ์˜ Protocol Plugin์— ๋”ฐ๋ผ ๊ฐ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ๋ฌธ์„œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. API Catalog ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ ‘๊ทผ ์ œ์–ด ์ •์ฑ…์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ API ํƒ€์ž…์ด GraphQL ์Šคํ‚ค๋งˆ์— ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผ ์ œ์–ด ์ •์ฑ…์€ ํ™œ์„ฑํ™”์‹œ ์˜ต์…˜์œผ๋กœ ์ฃผ์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Service Catalog

    Service Catalog๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์„œ๋น„์Šค๋“ค์˜ ๊ฐ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. Service Catalog ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ ‘๊ทผ ์ œ์–ด ์ •์ฑ…์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ Service ํƒ€์ž…์ด GraphQL ์Šคํ‚ค๋งˆ์— ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผ ์ œ์–ด ์ •์ฑ…์€ ํ™œ์„ฑํ™”์‹œ ์˜ต์…˜์œผ๋กœ ์ฃผ์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    200

    503

    500

    Gateway ์ƒํƒœ

    ์‹œ์ž‘์ค‘

    ๋ณ‘ํ•ฉ์ค‘

    ์ž‘๋™์ค‘

    ์ข…๋ฃŒ์ค‘

    ์˜ค๋ฅ˜

    GET /~health/liveness

    200

    200

    200

    200

    500

    GET /~health/readiness

    503

    Connector

    200

    Protocol Plugin

    hashtag
    Plugin

    ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์„œ๋น„์Šค API ์Šคํ‚ค๋งˆ์˜ ํฌ๋งท๊ณผ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š”๋ฐ ์“ฐ์ž…๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์œ„์ž„๋œ ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ ๊ฒ€์ฆ, ํ•ด์„, ์ž‘๋™ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๊ณ  ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ ํ”„๋กœํ† ์ฝœ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ ์Šคํ‚ค๋งˆ์˜ ์–‘์‹์„ ์ •์˜ํ•˜๊ณ , ์Šคํ‚ค๋งˆ ๋ณ‘ํ•ฉ, ์š”์ฒญ ํ”„๋ก์‹œ, ์˜์กด์„ฑ ํŒŒ์•…, ์„œ๋ฒ„ ํ™•์žฅ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ ์ ‘๊ทผ ์ œ์–ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•ด๋‹น ์ ‘๊ทผ ์ œ์–ด ์Šคํ‚ค๋งˆ์˜ ์–‘์‹์„ ์ •์˜ํ•˜๊ณ , call, publish, subscribe ์ปค๋„ฅํ„ฐ์˜ ์ •์ฑ…์„ ํ•ด์„ํ•˜๊ณ  ์ ‘๊ทผ ์ œ์–ด๋ฅผ ํŒ๋‹จํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

    hashtag
    1. Protocol Plugin

    ํ”„ํ† ํ† ์ฝœ ํ”Œ๋Ÿฌ๊ทธ์ธ๋ณ„ ์Šคํ‚ค๋งˆ ์–‘์‹์€ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด ์„น์…˜์—์„œ๋Š” ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ตฌ๋™ ๋ฐฉ์‹์„ ๊ฐœ๊ด„์ ์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    hashtag
    A. REST

    REST ํ”„๋กœํ† ์ฝœ์€ ๋ถ„์‚ฐ ์„œ๋น„์Šค์— ๋Œ€ํ•œ call, publish ์ปค๋„ฅํ„ฐ๋ฅผ ํŠน์ • ์—”๋“œํฌ์ธํŠธ์— ๋งตํ•‘ํ•ฉ๋‹ˆ๋‹ค. HTTP ์š”์ฒญ์˜ Paylo,ad๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด ํŒŒ์‹ฑ๋˜์–ด params ์ปค๋„ฅํ„ฐ๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜๋˜์–ด call, publish ์ปค๋„ฅํ„ฐ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

    ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ ๋ณ‘ํ•ฉ์„ ๋ฐœ์ƒ์‹œํ‚จ ์ถœ์ฒ˜ ๋…ธ๋“œ๋กœ ๋””๋ฒ„๊ทธ ๋ฉ”์„ธ์ง€๊ฐ€ report๋˜๋ฉฐ ๋ณ‘ํ•ฉ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

    API Catalog๋ฅผ ํ†ตํ•ด์„œ ์—”๋“œํฌ์ธํŠธ ๋ณ„ ์ ์šฉ๋œ ์ •์ฑ… ๋ฐ ์ปค๋„ฅํ„ฐ์™€ ๊ทธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    TODO: $headers, $status, $body field for REST response

    hashtag
    B. GraphQL

    GraphQL ํ”„๋กœํ† ์ฝœ์€ ๋ถ„์‚ฐ ์„œ๋น„์Šค์— ๋Œ€ํ•œ call ๋ฐ publish, subscribe ์ปค๋„ฅํ„ฐ๋ฅผ ํŠน์ • ํƒ€์ž…์˜ ํ•„๋“œ์— ๋งตํ•‘ํ•ฉ๋‹ˆ๋‹ค. HTTP ์š”์ฒญ์˜ Payload๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด ํŒŒ์‹ฑ๋˜์–ด params ์ปค๋„ฅํ„ฐ๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜๋˜์–ด call, publish, subscribe, map ์ปค๋„ฅํ„ฐ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

    GraphQL ์Šคํ‚ค๋งˆ ์ƒ์„ฑ์— ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ‘ํ•ฉ์„ ๋ฐœ์ƒ์‹œํ‚จ ์ถœ์ฒ˜ ๋…ธ๋“œ๋กœ ๋””๋ฒ„๊ทธ ๋ฉ”์„ธ์ง€๊ฐ€ report๋˜๋ฉฐ ๋ณ‘ํ•ฉ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

    API Catalog๋ฅผ ํ†ตํ•ด์„œ ๊ฐ GraphQL Type ๋ณ„ ์ ์šฉ๋œ ์ •์ฑ… ๋ฐ ์ปค๋„ฅํ„ฐ์™€ ๊ทธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    ์„œ๋น„์Šค API ์Šคํ‚ค๋งˆ๋ฅผ ํ†ตํ•ด์„œ GraphQL Custom Scalar ์ •์˜๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Gateway ์ƒ์„ฑ์‹œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์˜ต์…˜์„ ํ†ตํ•ด Scalar ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ DateTime, Date, Time, JSON๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

    hashtag
    C. WebSocket

    TODO: WIP

    hashtag

    API Schema

    Policy Plugin

    hashtag
    2. Access Control Policy

    ์ ‘๊ทผ ์ œ์–ด ํ”Œ๋Ÿฌ๊ทธ์ธ๋ณ„ ์Šคํ‚ค๋งˆ ์–‘์‹์€ Access Control Policy ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด ์„น์…˜์—์„œ๋Š” ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ตฌ๋™ ๋ฐฉ์‹์„ ๊ฐœ๊ด„์ ์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    ํ”„๋กœํ† ์ฝœ์˜ ํ™•์žฅ์„ฑ๊ณผ ์ ‘๊ทผ์ œ์–ด ์ •์ฑ…์˜ ์ •ํ•ฉ์„ฑ์„ ์œ„ํ•ด์„œ, ์ ‘๊ทผ ์ œ์–ด ์ •์ฑ…์€ ํ”„๋กœํ† ์ฝœ๋ณ„ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์•ก์…˜๊ณผ ์ด๋ฒคํŠธ๋ฅผ ์ฃผ์ฒด๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

    ์ ‘๊ทผ ์ œ์–ด ์ •์ฑ…์˜ ํ‰๊ฐ€๋Š” API Gateway์˜ ๋ฉ”๋ชจ๋ฆฌ์— LRU ๋ฐฉ์‹์œผ๋กœ ์บ์‹œ๋˜๋ฉฐ ํ•œ ์š”์ฒญ์—์„œ ์ค‘๋ณต ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์บ์‹œ ํ‚ค๋ฅผ ์ƒ์„ฑ ํ•  ๋•Œ ์š”์ฒญ์„ ์ •ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปจํ…์ŠคํŠธ(์ธ์ฆ ์ •๋ณด) ๋ฐ ํ˜ธ์ถœ ํŽ˜์ด๋กœ๋“œ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

    ์ ์šฉ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ˆœ์„œ๋Š” ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„ ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์‹คํŒจ ํ•  ๊ฒฝ์šฐ ๋‹ค์Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ •์ฑ…์€ ํ‰๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผ ์ œ์–ด ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ธฐ๋ณธ ์˜ต์…˜์—์„œ OAuth2 Scope ํ”Œ๋Ÿฌ๊ทธ์ธ(scopes)์ด FBAC ํ”Œ๋Ÿฌ๊ทธ์ธ(filter)๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

    hashtag
    A. OAuth2 Scope

    OAuth2 Scope ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฐ ์ •์ฑ…์˜ scopes์— ๋‚˜์—ด๋œ ์Šค์ฝ”ํ”„๋ฅผ context.scopes๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šค์ฝ”ํ”„๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

    hashtag
    B. FBAC

    FBAC ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฐ ์ •์ฑ…์˜ filter ํ•ญ๋ชฉ์— ๋งตํ•‘๋œ Inline JavaScript Function String์„ VM์—์„œ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ Boolean ๊ฐ’์œผ๋กœ ์ ‘๊ทผ ์ œ์–ด ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ‰๊ฐ€์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ Boolean ๊ฐ’์ด ๋ฆฌํ„ด๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, API Gateway์—์„œ ์ถœ์ฒ˜ ๋…ธ๋“œ๋กœ ์ „๋‹ฌ๋˜๋ฉฐ ์ ‘๊ทผ์ด ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.

    ๋””๋ฒ„๊น… ์ค‘์— Inline JavaScript Function String์—์„œ console ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ ๋ฉ”์„ธ์ง€๋Š” console ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ report ์ปค๋„ฅํ„ฐ๊ฐ€ ์ถœ์ฒ˜ ๋…ธ๋“œ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.