최대 1 분 소요

webflux에서 router를 작성하는 경우 아래처럼 작성해줄 수 있다.
/tutorial, /tutorial/stage1라는 path의 API 2개를 지원하고 있는 모습이다.

@Configuration
class TestRouter {

    @Bean
    fun testRouterBean(testHandler: TestHandler) = 
    coRouter {
        GET("/tutorial", testHandler::startTutorial)
        GET("/tutorial/stage1", testHandler::startTutorialStage)
    }
}


API path에는 정규표현식을 지정할 수 있다. 아래처럼 [a-z]+를 추가하면 /tutorial/ 뒤에 최소 1자 이상의 소문자 알파벳으로 들어오는 요청을 모두 해당 API로 받을 수 있게된다. (Webflux 뿐만 아니라 MVC 에서도 지원한다)

GET("/tutorial/[a-z]+", testHandler::startTutorial)


문제 상황

router를 아래처럼 작성하고 /tutorial/stage1를 호출하면 어떻게 될까?

@Configuration
class TestRouter {

    @Bean
    fun testRouterBean(testHandler: TestHandler) = 
    coRouter {
        GET("/tutorial/[a-z]+", testHandler::startTutorial)
        GET("/tutorial/stage1", testHandler::startTutorialStage)
    }
}


?

그러면 /tutorial/[a-z]+에서 요청을 읽어버리게 된다😅 stage1[a-z]+에서 읽어버린 상황이다..!
router는 위에서 아래로 매칭되는지 확인한다.

해결 방법

stage1이 정규표현식 [a-z]+에 읽히지 않도록 핸들러 순서를 바꿔주면 해결된다.

@Configuration
class TestRouter {

    @Bean
    fun testRouterBean(testHandler: TestHandler) = 
    coRouter {
        GET("/tutorial/stage1", testHandler::startTutorialStage)
        GET("/tutorial/[a-z]+", testHandler::startTutorial)
    }
}

References

카테고리:

업데이트:

댓글남기기