Spring 에서 RESTful을 지원하면서 사용빈도가 높아진(개인적인 견해)  @PathVariable Annotation이 사용에 있어서 주의할 점이 있습니다.

 

일반적으로 다음과 같이 사용을 합니다.

 

@RequestMapping(value = "/test/{aaa}/{bbb}", method = RequestMethod.GET)
 public String homeTest(Locale locale, Model model, @PathVariable String aaa,@PathVariable String bbb) {
  
  logger.info("Welcome home! The client locale is {} {}.", aaa, bbb);
  ... 중략 ... 
  return "home";
 }

 

 

위의 코드는 일반적으로는 오류없이 실행이 됩니다.

하지만 다음과 같이 이클립스의 컴파일러 옵션을 변경한 상태에서 컴파일 & 실행을 하게 될 경우 다음과 같은 오류가 발생합니다.

 

 

디폴트는 위의 체크박스가 모두 체크되어 있는 상태입니다.

 

오류내용은 다음과 같습니다. 결과적으로 해당 URL을 인식하지 못합니다. 때문에 해당 클래스의 메소드까지 전달되지도 못하는 상태라 디버그도 찍히지 않습니다.

 

 

 

차이점은 뭘까요?

 

@PathVariable을 사용하는 데 있어서의 차이점입니다.

위와 같은 옵션에서도 오류가 없게 하려면 다음과 같이 사용을 해야합니다.

 

@RequestMapping(value = "/test/{aaa}/{bbb}", method = RequestMethod.GET)
 public String homeTest(Locale locale, Model model, @PathVariable("aaa") String abcd,@PathVariable("bbb") String bcd) {
  
  logger.info("Welcome home! The client locale is {} {}.", abcd, bcd);
  ... 중략 ... 
  return "home";
 }

 

 

경우에 따라서 서버의 컴파일러 옵션이 디버깅을 지원하지 않은 상태일때를 만날 수 가 있는데, 이런 경우를 피하기 위해서는 가급적 위와 같은 형태로 @PathVariable을 사용하길 권장합니다.

 

SpringFramework 공식사이트인 springsource.org 에서도 다음과 같은 내용을 확인할 수 있습니다.

 

"Or if the URI template variable name matches the method argument name you can omit that detail. As long as your code is not compiled without debugging information, Spring MVC will match the method argument name to the URI template variable name:"

 

자세한 내용 :  springsource.org

 

 

추가.

실제 관련 프로젝트 중 IBM AIX 서버에서 ant build(ibm java 1.6)후 WebSphere 에서 실행하는데, 모든 기능이 정상임에도 불구하고 위와 관련된 내용만 오류가 발생하는 사례가 있었습니다. 물론 권장내용대로 수정 후 오류는 없어졌습니다. 

 

혹시 개발PC에서는 잘 되는데, 서버로 가져가면 안되는 경우가 발생한다면 이부분을 확인하시기 바랍니다.