๐Ÿ“Œ Spring Cloud Gateway API ์‚ฌ์šฉ ๊ตฌ์กฐ์™€ ํ•„ํ„ฐ ํ™œ์šฉ ์ •๋ฆฌ

ghgh2505380ยท2026๋…„ 3์›” 18์ผ

MSA(Microservice Architecture)

๋ชฉ๋ก ๋ณด๊ธฐ
6/13

๐Ÿ“– ๊ฐœ์š”

Spring Cloud Gateway
ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ›์•„ ๋‚ด๋ถ€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ•˜๋Š” API Gateway

์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€

  • ์„œ๋น„์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ ๋‹จ์ผ ์ง„์ž…์  ๊ตฌ์„ฑ ํ•„์š”
  • ์ธ์ฆ, ๋กœ๊น…, ํ•„ํ„ฐ๋ง ๊ณตํ†ต ์ฒ˜๋ฆฌ
  • ์„œ๋น„์Šค ์ฃผ์†Œ(IP/Port) ์ˆจ๊ธฐ๊ธฐ ๊ฐ€๋Šฅ

ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ

  • ์„œ๋น„์Šค๋ณ„ URL ์ง์ ‘ ํ˜ธ์ถœ ๋ฌธ์ œ ํ•ด๊ฒฐ
  • ๊ณตํ†ต ๋กœ์ง ์ค‘๋ณต ์ œ๊ฑฐ
  • ๋ผ์šฐํŒ… ๋ฐ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ค‘์•™ ๊ด€๋ฆฌ

ํ•ต์‹ฌ ํŠน์ง•

  • URL ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ
  • Predicate + Filter ๊ตฌ์กฐ
  • Eureka ์—ฐ๋™ ์‹œ ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

โš™๏ธ ํ•ต์‹ฌ ๊ฐœ๋…

1๏ธโƒฃ ๋ผ์šฐํŒ… (Routing)

์š”์ฒญ URL ๊ธฐ์ค€์œผ๋กœ ์„œ๋น„์Šค ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

Client โ†’ Gateway โ†’ Service

2๏ธโƒฃ Predicate (์กฐ๊ฑด)

์š”์ฒญ์„ ์–ด๋–ค ์„œ๋น„์Šค๋กœ ๋ณด๋‚ผ์ง€ ๊ฒฐ์ •

  • Path
  • Method
  • Header

3๏ธโƒฃ Filter (์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌ)

Gateway์—์„œ ์š”์ฒญ ์ „/ํ›„ ๋กœ์ง ์ˆ˜ํ–‰

  • ์š”์ฒญ ๋กœ๊น…
  • ์‘๋‹ต ๋กœ๊น…
  • ์ธ์ฆ ์ฒ˜๋ฆฌ
  • ํ—ค๋” ๋ณ€๊ฒฝ

4๏ธโƒฃ Eureka ์—ฐ๋™

์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

lb://PRODUCT-SERVICE

๐Ÿ” ๋™์ž‘ ์›๋ฆฌ

์ „์ฒด ํ๋ฆ„

Client ์š”์ฒญ
โ†’ Gateway ์ˆ˜์‹ 
โ†’ Predicate ์กฐ๊ฑด ํ™•์ธ
โ†’ Filter (์š”์ฒญ ์ „ ์‹คํ–‰)
โ†’ ์„œ๋น„์Šค ํ˜ธ์ถœ (Eureka ์กฐํšŒ)
โ†’ Filter (์‘๋‹ต ํ›„ ์‹คํ–‰)
โ†’ Client ์‘๋‹ต

Microservices

  • Product Service
  • Order Service

๐Ÿ’ป ์ฝ”๋“œ ์˜ˆ์‹œ

1๏ธโƒฃ application.yml ์„ค์ •

spring:
cloud:
gateway:
routes:
- id: product-service
uri: lb://PRODUCT-SERVICE
predicates:
- Path=/products/**

    - id: order-service
      uri: lb://ORDER-SERVICE
      predicates:
        - Path=/orders/**

2๏ธโƒฃ Global Filter (๊ธฐ๋ณธ ๊ตฌ์กฐ)

@Component
public class LoggingFilter implements GlobalFilter, Ordered {

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

    ServerHttpRequest request = exchange.getRequest();
    System.out.println("Request URI: " + request.getURI());

    return chain.filter(exchange)
            .then(Mono.fromRunnable(() -> {
                ServerHttpResponse response = exchange.getResponse();
                System.out.println("Response Status: " + response.getStatusCode());
            }));
}

@Override
public int getOrder() {
    return -1;
}

}

๐Ÿš€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์ •๋ฆฌ

1๏ธโƒฃ Gateway์—์„œ API ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ

  • ํด๋ผ์ด์–ธํŠธ๋Š” Gateway๋งŒ ํ˜ธ์ถœ
  • Gateway๊ฐ€ ๋‚ด๋ถ€ ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ

์˜ˆ์‹œ

Client โ†’ /products/1 ์š”์ฒญ
โ†’ Gateway
โ†’ product-service ํ˜ธ์ถœ
โ†’ ์‘๋‹ต ๋ฐ˜ํ™˜

2๏ธโƒฃ ์‹ค์ œ API ํ˜ธ์ถœ ํ๋ฆ„

GET /products/1

โ†’ Gateway
โ†’ Predicate ๋งค์นญ (/products/**)
โ†’ product-service๋กœ ๋ผ์šฐํŒ…
โ†’ ์‘๋‹ต ๋ฐ˜ํ™˜

3๏ธโƒฃ ํ•„ํ„ฐ ๋™์ž‘ ์œ„์น˜

์š”์ฒญ โ†’ [Request Filter] โ†’ Service โ†’ [Response Filter] โ†’ ์‘๋‹ต

โž• ํ•„ํ„ฐ ๋ณต์‚ฌ ์žฌ์‚ฌ์šฉ ๊ฟ€ํŒ

ํ•„ํ„ฐ๋Š” ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • ๊ธฐ์กด ํ•„ํ„ฐ ํด๋ž˜์Šค ๋ณต์‚ฌ
  • ํด๋ž˜์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ
  • ํ•„์š”ํ•œ ๋กœ์ง๋งŒ ์ˆ˜์ •

์˜ˆ์‹œ (์‘๋‹ต ๋กœ๊น…๋งŒ ๋ณ€๊ฒฝ)

@Component
public class ResponseLoggingFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        return chain.filter(exchange)
                .then(Mono.fromRunnable(() -> {
                    ServerHttpResponse response = exchange.getResponse();
                    System.out.println("Custom Response Log: " + response.getStatusCode());
                }));
    }

    @Override
    public int getOrder() {
        return -2;
    }
}

ํ•ต์‹ฌ ์ •๋ฆฌ

  • ํ•„ํ„ฐ ๊ตฌ์กฐ ๋™์ผ โ†’ ๋ณต์‚ฌํ•ด์„œ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์š”์ฒญ/์‘๋‹ต ๋กœ์ง๋งŒ ๋ถ„๋ฆฌํ•ด์„œ ์ˆ˜์ •
  • ๊ณตํ†ต ๋กœ์ง ๋น ๋ฅด๊ฒŒ ํ™•์žฅ ๊ฐ€๋Šฅ

๐Ÿง  TIL (Today I Learned)

  • Gateway๋Š” ๋ชจ๋“  ์š”์ฒญ์˜ ์ง„์ž…์  ์—ญํ•  ์ˆ˜ํ–‰
  • Predicate๋กœ ์„œ๋น„์Šค ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ
  • Filter๋กœ ๊ณตํ†ต ๋กœ์ง ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • Eureka ์—ฐ๋™ ์‹œ ์„œ๋น„์Šค ์ด๋ฆ„ ๊ธฐ๋ฐ˜ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ํ•„ํ„ฐ๋Š” ๋ณต์‚ฌ ํ›„ ์ผ๋ถ€ ๋กœ์ง๋งŒ ์ˆ˜์ •ํ•ด์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
profile

0๊ฐœ์˜ ๋Œ“๊ธ€