Backend
home

API GateWay & MSA

Github ๋งํฌ
๋‚ ์งœ
2025/09/23

ย ํ”„๋กœํ† ์Šค์˜ Gateway์™€ API Gateway

1. ํ”„๋กœํ† ์Šค ๊ฒŒ์ดํŠธ์›จ์ด๋ž€?

โ€ข
์Šคํƒ€ํฌ๋ž˜ํ”„ํŠธ์—์„œ ๊ฒŒ์ดํŠธ์›จ์ด(Gateway)๋Š” ํ”„๋กœํ† ์Šค์˜ ๊ธฐ๋ณธ ๋ณ‘๋ ฅ(์งˆ๋Ÿฟ, ๋“œ๋ผ๊ตฐ, ํ…œํ”Œ๋Ÿฌ ๋“ฑ)์„ ์ƒ์‚ฐํ•˜๋Š” ํ•ต์‹ฌ ๊ฑด๋ฌผ์ด๋‹ค.
โ€ข
ํ”„๋กœํ† ์Šค ๋ณ‘๋ ฅ์€ ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€(์ „์žฅ)์— ๋“ฑ์žฅํ•œ๋‹ค(์•„์ด์–ด๋ฅผ ์œ„ํ•˜์—ฌ~!).
โ€ข
์ฆ‰, ๋ชจ๋“  ๋ณ‘๋ ฅ ์ƒ์‚ฐ์˜ ๋‹จ์ผ ์ง„์ž…์ (Entry Point) ์—ญํ• ์„ ํ•˜๋Š” ๊ฑด๋ฌผ์ด๋‹ค.
[ Nexus (๋ณธ์ง„) ] โ”‚ โ–ผ [ Gateway ] โ†’ [ Zealot / Dragoon / High Templar ... ]
Plain Text
๋ณต์‚ฌ

2. API Gateway์™€์˜ ๋น„์œ 

โ€ข
API Gateway = ํ”„๋กœํ† ์Šค ๊ฒŒ์ดํŠธ์›จ์ด
โ—ฆ
๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค(MSA)์˜ ๋ชจ๋“  ์š”์ฒญ์ด API Gateway๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋œ๋‹ค.
โ—ฆ
ํ”„๋กœํ† ์Šค๊ฐ€ ๋ณ‘๋ ฅ์„ ์•„๋ฌด๋ฐ์„œ๋‚˜ ์†Œํ™˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, MSA๋„ ์„œ๋น„์Šค๊ฐ€ ์™ธ๋ถ€์— ์ง์ ‘ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
โ€ข
๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค = ํ”„๋กœํ† ์Šค ๋ณ‘๋ ฅ
โ—ฆ
User Service, Order Service, Payment Service ๊ฐ™์€ ๊ฐœ๋ณ„ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” ๊ฐ๊ฐ์˜ ๋ณ‘๋ ฅ ์œ ๋‹›๊ณผ ๊ฐ™๋‹ค.
โ€ข
ํด๋ผ์ด์–ธํŠธ = ์ „์žฅ
โ—ฆ
์‹ค์ œ ์‚ฌ์šฉ์ž๋Š” ์ „์žฅ์—์„œ ์œ ๋‹›(์„œ๋น„์Šค)์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์ง€๋งŒ, ๊ทธ ์œ ๋‹›์„ ์ƒ์‚ฐํ•˜๋Š” ๊ณผ์ •์€ ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
[ Client (์ „์žฅ) ] โ”‚ โ–ผ [ API Gateway (ํ”„๋กœํ† ์Šค ๊ฒŒ์ดํŠธ์›จ์ด) ] โ”œโ”€โ”€> [ User Service (Zealot) ] โ”œโ”€โ”€> [ Order Service (Dragoon) ] โ””โ”€โ”€> [ Payment Service (Dark Templar) ]
Plain Text
๋ณต์‚ฌ

3. ๊ฒŒ์ดํŠธ์›จ์ด์˜ ์—ญํ•  ๋น„๊ต

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

4. Spring Boot API Gateway ์˜ˆ์‹œ

spring: application: name: api-gateway cloud: gateway: routes: - id: zealot-service # ์งˆ๋Ÿฟ ์œ ๋‹› = User Service uri: lb://USER-SERVICE predicates: - Path=/users/** - id: dragoon-service # ๋“œ๋ผ๊ตฐ ์œ ๋‹› = Order Service uri: lb://ORDER-SERVICE predicates: - Path=/orders/**
YAML
๋ณต์‚ฌ
๋งˆ์น˜ ๊ฒŒ์ดํŠธ์›จ์ด ๊ฑด๋ฌผ์—์„œ ์งˆ๋Ÿฟ ๋˜๋Š” ๋“œ๋ผ๊ตฐ ์„ ๋ฝ‘๋“ฏ์ด, API Gateway๋Š” /users/** ์š”์ฒญ์„ User Service๋กœ, /orders/** ์š”์ฒญ์„ Order Service๋กœ ์ „๋‹ฌํ•œ๋‹ค.

5. ์ •๋ฆฌ

โ€ข
API Gateway๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ โ€œ์ƒ์‚ฐ ๊ฑด๋ฌผโ€์ด๋‹ค.
โ€ข
ํด๋ผ์ด์–ธํŠธ๋Š” ์ง์ ‘ ๋ณ‘๋ ฅ(์„œ๋น„์Šค)์—๊ฒŒ ๊ฐ€์ง€ ์•Š๊ณ , ๊ฒŒ์ดํŠธ์›จ์ด(์ƒ์‚ฐ ๊ฑด๋ฌผ)๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์œ ๋‹›์„ ์–ป๋Š”๋‹ค.
โ€ข
๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก โ†’ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๋Ÿ‰(๋ณ‘๋ ฅ ์ƒ์‚ฐ๋Ÿ‰)์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
โ€ข
๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋ฌด๋„ˆ์ง€๋ฉด โ†’ ์ „์žฅ์— ๋” ์ด์ƒ ์œ ๋‹›์ด ํˆฌ์ž…๋˜์ง€ ๋ชปํ•œ๋‹ค(SPOF ์œ„ํ—˜).
โ—ฆ
SPOF(๋‹จ์ผ ์žฅ์•  ์ง€์ , Single Point of Failure):ย ์‹œ์Šคํ…œ์˜ ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ณ ์žฅ๋‚˜๋ฉด ์ „์ฒด ์‹œ์Šคํ…œ์ด ์ค‘๋‹จ๋˜๋Š” ์ทจ์•ฝ์ ์„ ์˜๋ฏธ
โ—ฆ
๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ํŒŒ์ผ๋Ÿฐ์ด ์—†์–ด์„œ Unpowered ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฑธ ์ƒ๊ฐํ•˜๋ฉด ๋จ
โ€ข
์‰ฝ๊ฒŒ ์ •๋ฆฌ:
โ—ฆ
API Gateway๋Š” ํ”„๋กœํ† ์Šค์˜ ๊ฒŒ์ดํŠธ์›จ์ด๋‹ค.
โ—ฆ
ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ณ‘๋ ฅ(์„œ๋น„์Šค)์„ ๊ณต๊ธ‰๋ฐ›๋Š”๋‹ค.
โ—ฆ
์•ค ํƒ€๋กœ ์•„๋‘” ์ œ๋ผํˆด

API Gateway์™€ MSA, ๊ทธ๋ฆฌ๊ณ  Spring Boot ์ ์šฉ

1. ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉฐ

โ€ข
์•ž์„œ ์„ค๋ช…ํ•œ ํ”„๋กœํ† ์Šค ๊ฒŒ์ดํŠธ์›จ์ด์— ๋น„์œ ํ•˜์—ฌ API Gateway์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณธ๋‹ค.
โ€ข
API Gateway๊ฐ€ MSA(Microservice Architecture)์—์„œ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๊ณ , ์™œ ์ค‘์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  Java + Spring Boot๋ฅผ ํ™œ์šฉํ•ด ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.
โ€ข
MSA ํ™˜๊ฒฝ์—์„œ API Gateway๋Š” ๋‹จ์ˆœํ•œ ์š”์ฒญ ๋ถ„๋ฐฐ๋ฅผ ๋„˜์–ด ๋ณด์•ˆ, ๋ผ์šฐํŒ…, ๋ชจ๋‹ˆํ„ฐ๋ง๊นŒ์ง€ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

2. MSA(Microservice Architecture)๋ž€?

โ€ข
์ •์˜: ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์€ ์„œ๋น„์Šค ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ/๋ฐฐํฌ/์šด์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜
โ€ข
ํŠน์ง•
โ—ฆ
๊ฐ ์„œ๋น„์Šค๋Š” ๋…๋ฆฝ์ ์ธ ๋ฐฐํฌ ๊ฐ€๋Šฅ
โ—ฆ
์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ์ˆ  ์Šคํƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โ—ฆ
์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์€ ์ฃผ๋กœ REST API ๋˜๋Š” gRPC ํ™œ์šฉ
โ—ฆ
ํ™•์žฅ์„ฑ(Scalability) ๋ฐ ์œ ์—ฐ์„ฑ(Flexibility) ๊ฐ•ํ™”
ํ•˜์ง€๋งŒ ์„œ๋น„์Šค๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํด๋ผ์ด์–ธํŠธ์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋ฉด ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ API Gateway์ด๋‹ค.

3. API GateWay๋ž€?

โ€ข
์ •์˜: ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ›์•„ ์ ์ ˆํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ•˜๊ณ , ์‘๋‹ต์„ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹จ์ผ ์ง„์ž…์ (Entry Point)
โ€ข
์ฃผ์š” ์—ญํ• 
1.
๋ผ์šฐํŒ…: ์š”์ฒญ์„ ํ•ด๋‹น ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ
2.
๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ: ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ
3.
๋ณด์•ˆ: ์ธ์ฆ/์ธ๊ฐ€, JWT ํ† ํฐ ๊ฒ€์ฆ
4.
API ๊ด€๋ฆฌ: ์š”์ฒญ/์‘๋‹ต ๋กœ๊น…, ๋ชจ๋‹ˆํ„ฐ๋ง
5.
๋ณ€ํ™˜: REST gRPC, ๋ฐ์ดํ„ฐ ํฌ๋งท ๋ณ€ํ™˜
6.
์†๋„ ์ œํ•œ/์บ์‹ฑ: Rate Limiting, Response Caching

4. MSA์™€ API Gateway์˜ ์—ฐ๊ณ„ ๊ตฌ์กฐ

[ Client ] โ”‚ โ–ผ [ API Gateway ] โ”œโ”€โ”€> [ Auth Service ] โ”œโ”€โ”€> [ User Service ] โ”œโ”€โ”€> [ Order Service ] โ””โ”€โ”€> [ Payment Service ]
Markdown
๋ณต์‚ฌ
โ€ข
ํด๋ผ์ด์–ธํŠธ๋Š” Gateway๋งŒ ๋ฐ”๋ผ๋ด„
โ€ข
์„œ๋น„์Šค๋ณ„ Endpoint๋Š” ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ
โ€ข
API Gateway๊ฐ€ ํŠธ๋ž˜ํ”ฝ ์กฐ์œจ์ž ์—ญํ•  ์ˆ˜ํ–‰

5. Spring Boot ๊ธฐ๋ฐ˜ API Gateway ๊ตฌํ˜„

โ€ข
Spring Boot์—์„œ API Gateway๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๋ณดํ†ต Spring Cloud Gateway๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค,.
Gradle ์˜์กด์„ฑ ์ถ”๊ฐ€
dependencies { implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' // ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ }
Groovy
๋ณต์‚ฌ
application.yml ์˜ˆ์‹œ
spring: application: name: api-gateway cloud: gateway: routes: - id: user-service uri: lb://USER-SERVICE predicates: - Path=/users/** - id: order-service uri: lb://ORDER-SERVICE predicates: - Path=/orders/**
YAML
๋ณต์‚ฌ
โ€ข
lb:// : Eureka(์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ)์™€ ์—ฐ๋™ ์‹œ ์‚ฌ์šฉ
โ€ข
/users/** ์š”์ฒญ์€ User Service๋กœ ์ „๋‹ฌ
โ€ข
/orders/** ์š”์ฒญ์€ Order Service๋กœ ์ „๋‹ฌ
JWT ์ธ์ฆ ํ•„ํ„ฐ ์ถ”๊ฐ€ ์˜ˆ์‹œ
@Component public class JwtAuthenticationFilter implements GatewayFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String token = exchange.getRequest().getHeaders().getFirst("Authorization"); if (token == null || !token.startsWith("Bearer ")) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } // JWT ๊ฒ€์ฆ ๋กœ์ง (๊ฐ„๋‹จ ์˜ˆ์‹œ) try { String jwt = token.substring(7); // ๊ฒ€์ฆ ๋กœ์ง (์˜ˆ: Jwts.parser().setSigningKey(...).parseClaimsJws(jwt)) } catch (Exception e) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } }
Java
๋ณต์‚ฌ

6. API Gateway ๋„์ž… ์žฅ์ 

โ€ข
ํด๋ผ์ด์–ธํŠธ ๋‹จ์ˆœํ™”: ์—ฌ๋Ÿฌ ์„œ๋น„์Šค ํ˜ธ์ถœ์„ Gateway๊ฐ€ ๋Œ€์‹  ์ฒ˜๋ฆฌ
โ€ข
๋ณด์•ˆ ๊ฐ•ํ™”: ๋ชจ๋“  ์š”์ฒญ์„ ์ค‘์•™์—์„œ ์ œ์–ด
โ€ข
์šด์˜ ํŽธ์˜์„ฑ: ๋ชจ๋‹ˆํ„ฐ๋ง, ๋กœ๊น… ์ผ์›ํ™”
โ€ข
ํ™•์žฅ์„ฑ: ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ ์‹œ Gateway ๋‹จ์—์„œ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

7. ๊ณ ๋ คํ•ด์•ผ ํ•  ๋‹จ์ 

โ€ข
๋‹จ์ผ ์žฅ์•  ์ง€์ (SPOF, Single Point of Failure)
โ€ข
์ถ”๊ฐ€ Latency ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ
โ€ข
Gateway ์ž์ฒด์˜ ์„ฑ๋Šฅ/ํ™•์žฅ์„ฑ ๊ด€๋ฆฌ ํ•„์š”
๋”ฐ๋ผ์„œ Kubernetes + Service Mesh(Istio, Linkerd)์™€ ์—ฐ๊ณ„ํ•˜๋Š” ๋ฐฉ์‹๋„ ๊ณ ๋ ค๋œ๋‹ค.