BR-Sung
56
2019-02-02 14:46:36
5
743

스프링 PathVariable 어노테이션 사용 시, Mapping URL이 같으면 컨트롤러 어떻게 선택되는지 궁금합니다.


첫 번째 URL : /test/test1.do


두 번째 URL : /test/{var}.do 으로 선언되어있을때 (pathvariable 사용)


/test/test1.do 으로 요청하면, 위의 두 URL에 모두 해당이 되는데


어떤 기준을 우선으로 URL 맵핑이 되는건지 궁금합니다.


감사합니다~^^

0
0
  • 답변 5

  • 나도아빠다
    2k
    2019-02-02 17:23:58

    순서상으로 첫url이 호출될겁니다

    변수로 인해 중복 매칭이 발생할 경우, 변수값이 적은 url을 우선 매칭하는걸로 알고있습니다.


    사실.. 애초에 저런경우를 안만드는게 맞지않나 싶네요..  설계와는 예상하지 못한동작이 발생할 수도 있으니까요.

    0
  • 잡초
    1k
    2019-02-02 19:33:27 작성 2019-02-02 20:55:08 수정됨

    서버 구동 시 에러날걸요?

    방식이 틀리면 상관없어요 

    get,post,put,dellete 등 각 방식이 다르면 중복 되는 

    Url 은 관계 없습니다


    0
  • 녹색이념
    833
    2019-02-03 00:53:50

    잡초님 말씀대로, 


    HTTP 메소드 방식이 같은데 URI가 같은 경우 = 에러

    HTTP 메소드 방식이 다른데 URI가 같은 경우 = 동작


    이렇게 될 것 같습니다..!!

    0
  • 나도아빠다
    2k
    2019-02-03 01:04:34 작성 2019-02-03 01:25:24 수정됨

    @잡초 @최고보다는최선

    한번 직접 해보시면 에러안난다는거 아실겁니다.

    첫 번째 URL : /test/test1.do

    두 번째 URL : /test/{var}.do

    두개는 엄연히 다른 URL입니다.


    package com.example.demo.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class IndexController {
    	
    	@RequestMapping("/index.do")
    	public String index(Model model) {
    		model.addAttribute("world", "세계");
    		return "index";
    	}
    	
    	@RequestMapping("/test/test1.do")
    	public String test1() {
    		return "test1";
    	}
    
    	@RequestMapping("/test/{var}.do")
    	public String test2(@PathVariable String var) {
    		return "test2";
    	}
    }

    로 세팅후 실행해보시면 당연히 서버오류는 안납니다. 보시다시피 method는 똑같이 default입니다.

    저기의 test1 뷰에 들어가면 test1, test2 뷰에 들어가면 test2가 찍히도록 처리하고 실행해보았습니다.


    아래 스크린샷의 URL을 잘보시기 바랍니다.


    test/test1.do 라는 url은 위 컨트롤러 설정 두군데 다 만족하는 조건이지만,

    test/test1.do를 실행하고 test/{var}.do는 실행하지 않았다는걸 확인가능합니다.


    혹시 두분 댓글 보고 잘못 아실분들계실까봐 스크린샷으로 남겨둡니다. ;)


    첫 댓글로도 달았지만, 다시 말씀드리면

    path variable로 인해 중복 URL이 생길 가능성은 충분히 높습니다.


    이런 pathvariable 해소는 스프링 내부적으로 가장 깊게 매칭되는 URL을 우선적으로 선택해 디스패쳐가 컨트롤러에 매핑시킵니다.


    1. test/{var1}/{var2}

    2. test/A/{var1}

    3. test/A/B

    이렇게 3개의 URL이 있다고 한다면,


    test/A/B 호출시 3번

    test/A/C 호출시 2번

    test/B/C 호출시 1번이 불리는 식입니다.


    대신 본인의 원하는 동작이 가장 깊은 URL이 아니라 pathvariable이 실행되길 바랄경우에는 조치가 상당히 어려운지라.. 애초에 이런상황을 안만들도록 설계하는게 머리가 덜아프실 겁니다.

    2
  • BR-Sung
    56
    2019-03-14 17:16:25

    나도아빠다 / 이해가 쉽도록 답변해주셔서 감사드립니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.