일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 갱신 이상
- DB
- Redis
- 페이지네이션
- 삭제 이상
- AWS
- java
- 캐시 오염
- HTTP
- null
- JPA
- 데이터베이스
- 스레드 풀
- 네트워크
- 3-way handshaking
- gatway
- 낙관적 락
- well-know port
- 비관적 락
- buildSrc
- Kotlin
- MSA
- 정규화
- 자바
- Kafka
- Dirty Checking
- ocp
- Spring
- 삽입 이상
- 자료구조
- Today
- Total
어 나 갱수.
[Spring] Spring Cloud Gateway RewritePath 경로 문제 본문
문제 배경
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 메서드로 올바르게 도달하게 되었습니다.
'Spring' 카테고리의 다른 글
[Spring] 클린 아키텍처 - 유지보수가 용이한 아키텍처 (0) | 2024.05.20 |
---|---|
[Spring] AOP를 적용한 logging을 해보자 (0) | 2024.05.10 |
[Spring] SpringSecurity 6.1에서 SecurityConfig 마이그레이션 (0) | 2024.04.28 |
[Spring Boot] ResponseEntity를 왜 사용하나요 ? 😀 (0) | 2024.03.01 |
[Spring] 싱글톤 패턴 🐶 (0) | 2024.02.06 |