Spring Cloud Gateway 동적 라우팅 추가시 Lambda 표현식

2025. 3. 13. 15:43·Spring

유튜브에서 “개발자 유미”님의 스프링 클라우드 MSA강의를 듣던 중 “게이트웨이 라우팅 추가” 파트에서 생긴 궁금증입니다.

🌐 Spring Cloud Gateway의 특성

Spring Cloud Gateway는 가장 앞단에서 Public Endpoint 역할을 하기 때문에 서비스를 시작한 후 절대 멈추면 안된다. 게이트웨이가 중단되면 모든 서비스 접근 경로가 차단되기 때문에 항상 가동 상태를 유지 해야한다. 이러한 특성 때문에 새로운 마이크로 서비스(새로운 경로)가 추가될 경우 게이트웨이를 재시작하는 대신 Postman을 통해 Spring Cloud Gateway에 동적으로 라우팅을 추가하는 방식을 사용한다.

⚙️ 기존 라우팅 설정 상태

Image

처음에는 "jisutudy" 어플리케이션(포트8081)에 대해 /sms/** 패턴의 경로만 라우팅 설정이 되어 있었다.

 

 

Image

그러나 사실 jisutudy 어플리케이션에 접근할 수 있는 경로는 /sms/** 뿐만 아니라 /cust/** 도 있다

 

❌ 게이트웨이 접근 문제 확인

Image

)

Image

동적 라우팅 추가를 실습해보기 위해 Spring Cloud Gateway를 통해 /cust/** 경로로 접근을 시도했으나 역시 실패했다.

 

 

 

Image

/actuator/gateway/routes

Spring Cloud Gateway 어플리케이션에 spring-boot-starter-actuator 의존성을 추가하여 위 URL에서 현재 설정된 라우팅 정보를 확인 할 수 있다

 

 

 

🔄 동적 라우팅 추가 구현

Image

Postman을 사용하여 새로운 라우팅을 추가해주었다

POST : {Spring Cloud Gateway}/actuator/gateway/routes/{id}
{
    "predicate": "Paths: [/cust/**]",
    "filters": [],
    "uri": "http://localhost:8081",
    "order": 0
}

엔드포인트 끝에 라우트id를 지정하고 아래와 같은 JSON 형식으로 요청을 보냈다

 

 

 

⚠️ Lambda 표현식 문제 발견

Image

라우팅을 추가한 후 refresh하여 확인해보니 아래에 route_id 가 cust로 추가된 경로가 보인다
그러나 위의 경로 처럼 "Paths: [/cust/], match trailing slash: true" 가 나오지 않고
"predicate" 부분에 "RouteDefinitionRouteLocator$$Lambda$1540/0x0000007001773098"
이런 식의 Lambda 표현식이 나오고 있다

 


🔍 왜 이런 현상이 발생할까?

Spring Cloud Gateway는 동적으로 라우트를 추가할 때 RouteDefinitionLocator를 통해 RouteDefinition을 변환하고 RouteLocator로 등록합니다.
이 과정에서 람다 표현식 기반의 익명 클래스를 사용해 Predicate가 동적으로 생성됩니다.

즉,

  • application.properties나 application.yml에서 등록한 라우팅은 정상적으로 표시되지만,
  • Postman을 통해 /actuator/gateway/routes API로 동적 추가한 라우팅은
    → 내부적으로 Lambda 기반 객체가 만들어지면서 해당 표현식이 보이는 것.

이는 정상적인 동작이지만,
actuator/gateway/routes에서 predicate를 사람이 읽을 수 있는 형태로 보고 싶다면,
Predicate를 명확하게 JSON 형식으로 추가해야 합니다.


🛠 해결 방법

✅ 라우팅 추가 시 올바른 JSON 형식 사용

Postman을 통해 /actuator/gateway/routes에 동적 라우트 추가할 때,
올바른 JSON 형식으로 추가해야 합니다.

{
  "id": "cust",
  "uri": "http://localhost:8081",
  "predicates": [
    {
      "name": "Path",
      "args": {
        "_genkey_0": "/cust/**"
      }
    }
  ]
}

이런 형태로 보내야 정상적으로 `Path=/cust/`와 같은 사람이 읽을 수 있는 형태로 저장됩니다.

 

❌ 잘못된 JSON 예시 (람다 표현식이 생길 가능성이 있음)

{
  "id": "ms1",
  "uri": "http://localhost:8081",
  "predicates": [
    "/sms/**"
  ]
}

위처럼 predicates를 배열로만 두면 내부적으로 람다 객체가 생성되어 $$Lambda$... 같은 이상한 값이 나올 수 있음.


🚀 결론

  • RouteDefinitionRouteLocator$$Lambda$... 같은 값은 Spring이 동적으로 생성한 Predicate 객체이므로 정상적인 동작이지만 사람이 읽기 어렵다.
  • Postman에서 JSON 데이터를 올바르게 보내야 Predicate가 정상적으로 반영됨.
  • /actuator/gateway/refresh를 실행해서 제대로 반영되었는지 확인.

'Spring' 카테고리의 다른 글

Spring Cloud Gateway와 WebFlux 관계 이해하기 (1편)  (0) 2025.05.06
Spring Cloud Gateway에서 라우팅 설정 방법  (0) 2025.03.17
Spring Cloud Gateway로 마이크로서비스 라우팅 시 발생하는 404 오류의 원인과 해결책  (0) 2025.03.11
Spring Cloud Config Client 설정 후 포트번호가 변경되지 않을 때  (0) 2025.02.20
컨트롤러 메서드에서 매개변수 이름을 명시하지 않아서 발생한 IllegalArgumentException  (0) 2025.01.28
'Spring' 카테고리의 다른 글
  • Spring Cloud Gateway와 WebFlux 관계 이해하기 (1편)
  • Spring Cloud Gateway에서 라우팅 설정 방법
  • Spring Cloud Gateway로 마이크로서비스 라우팅 시 발생하는 404 오류의 원인과 해결책
  • Spring Cloud Config Client 설정 후 포트번호가 변경되지 않을 때
꾸준히 기록하는 지수
꾸준히 기록하는 지수
서비스 백엔드 개발자가 되기 위해 제 경험들을 하나씩 기록해봅니다
  • 꾸준히 기록하는 지수
    지수블로그
    꾸준히 기록하는 지수
  • 전체
    오늘
    어제
    • 분류 전체보기 (37)
      • Spring (15)
      • JAVA (9)
      • 클라우드_인프라 (4)
      • Data (5)
      • CS (3)
      • 돌아보기 (0)
      • 취업준비 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DASP합격
    데이터아키텍처준전문가
    DAsP
    MSA
    자격증
    트러블슈팅
    스프링
    트랜잭션전파
    스프링클라우드
    스프링트랜잭션
    트랜잭션
    SCG
    DASP합격후기
    Spring
    DASP후기
    스프링부트
    궁금증
    스프링테스트
    SpringCloudGateway
    AWS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
꾸준히 기록하는 지수
Spring Cloud Gateway 동적 라우팅 추가시 Lambda 표현식
상단으로

티스토리툴바