어 나 갱수.

[Spring] Spring Cloud Gateway RewritePath 경로 문제 본문

Spring

[Spring] Spring Cloud Gateway RewritePath 경로 문제

김경수 2024. 4. 29. 14:07
728x90

문제 배경

msa 프로젝트를 진행하면서 Spring Cloud API Gateway를 통해 /member/signup 요청을 보내려고 했으나 아래와 같은 에러가 발생하였습니다.

Spring Cloud Gateway를 사용하여 마이크로서비스 간의 요청 경로를 설정할 때, /member/signup으로 POST 요청을 보냈으나, 예상과 달리 404 NOT_FOUND "No static resource signup." 오류가 발생했습니다. 이는 요청이 user-sevice의 signUp 메소드로 제대로 라우팅되지 않았음을 의미합니다.

 

문제 분석

문제의 원인은 Spring Cloud Gateway에서 application.yml의 RewritePath 필터 설정에 있었습니다. 처음에 application.yml의 설정을 아래와 같았습니다.

filters:
  - RewritePath=/member/(?<path>.*), /$\\{path}

이 설정의 의도는 /member/로 시작하는 모든 경로를 캡처하고, 해당 경로를 /로 리라이트하는 것이었습니다.

예를 들어, /member/signup 요청이 들어왔을 때, /member 를 제거하고 /signup으로 변환하여 user-service의 signUp 메소드로 요청을 전달하려는 의도였습니다. 그러나 user-serivce의 라우터는 아래와 같이 구성되어 있으며 /signup 경로의 API는 존재하지 않습니다

@Configuration
class MemberRouter {

    @Bean
    fun memberBaseRouter(memberHandler: MemberHandler) = coRouter {
        "/member".nest {
            contentType(MediaType.APPLICATION_JSON)
            GET("/id/{memberId}", memberHandler::queryMemberById)
            GET("/ids", memberHandler::queryMembersByIds)
            POST("/signup", memberHandler::signUp)
            POST("/login", memberHandler::login)
        }
    }
}

문제 해결

해결방안 1

signup 요청을 하려면 /member/member/signup 경로로 요청을 보내거나 user-service의 router를 아래와 같이 수정해야합니다.

@Configuration
class MemberRouter {

    @Bean
    fun memberBaseRouter(memberHandler: MemberHandler) = coRouter {
        "/".nest {
            contentType(MediaType.APPLICATION_JSON)
            GET("/id/{memberId}", memberHandler::queryMemberById)
            GET("/ids", memberHandler::queryMembersByIds)
            POST("/signup", memberHandler::signUp)
            POST("/login", memberHandler::login)
        }
    }
}

해결방안 2

문제를 해결하기 위해 RewritePath 필터의 정규 표현식을 수정했습니다.

filters:
  - RewritePath=/member/(?<path>.*), /member/$\\{path}

이 변경을 통해, /member/로 시작하는 모든 경로는 이제 /member/로 시작하는 경로 그대로 user-service로 라우팅 됩니다. 예를 들어, /member/signup 요청은 /member/signup으로 그대로 라우팅 되어 user-service 내의 signUp 메서드로 올바르게 도달하게 되었습니다.

 

 

728x90