Spring 3.0 (41) @Deprecated SpringMVC
스프링이 3.0까지 오면서 @Deprecated 된 것들은 얼마나될까?
아예 삭제가 된 것이 있을지는 모르겠지만, 최신 소스를 기준으로 하면 @Deprecated는 총 98개가 있다. 일부는 클래스에 일부는 메소드에 달려있기 때문에 정확한 양을 가늠하기는 그렇지만, 아무튼 그정도 된다는 얘기다.
그 중 상당 수는 스프링이 내부적으로 사용하는 인터널 클래스나 메소드를 보다 나은 것으로 개선하면서 사용하지 않게 된 것 들이다.
하지만 스프링 개발자들이 직접 사용하는 것들 중에도 기능이나 사용방법이 확장/개선되거나 JDK버전이 올라가면서 자연스럽게 @Deprecated되는 것들도 있다.
예를 들어보자.
2.0에서 도입된 scope 개념은 빈의 라이프싸이클을 매우 유연하게 확장할 수 있도록 해주었다. 대신 기존에 singleton과 prototype 두가지 밖에 없을 때 사용했던 singleton 항목은 그에 따라 사용 scope가 매우 제한적이고 오해의 소지가 있으므로 @Deprecated되었다.
또 JDK1.5이하 버전과 이상버전이 혼재해 있던 시절에 등장했던 JdbcTemplate의 ParameterizedRowMapper는 이제 JDK5+로 기준이 바뀌면서 아예 기존의 RowMapper에 Generics를 적용한 RowMapper<T>로 통합되었다. 그러면서 역시 @Deprecated.
그 외에 대폭적으로 @Deprecated된 것들은 주로 템플릿 메소드 패턴을 기반으로 만들어진 기능들이다. 대표적으로 TestCase를 상속해서 만든 Spring Test들이나, AbstractController 클래스의 하위 클래스로 이루어진 SpringMVC들이다.
템플릿 메소드 패턴을 기가막히게 사용해서 상당히 매력적이고 편리한 사용방법을 제공했던 이 두가지는, 그러나 구현상속을 기반으로 한 패턴이 가지는 한계에 도달할 수 밖에 없었고, 결국 SpringTest는 2.5에서 등장한 JUnit 리쓰너 기반의 TestContext Framework에게, SpringMVC도 2.5에서 등장한 애노테이션+POJO 클래스 기반 컨트롤러방식인 @MVC에게 자리를 내줄 수 밖에 없었다.
테스트는 그렇다 치고, 지난 5년간 지지고 볶고 하면서 함께 해온 내 사랑 SpringMVC 심플폼컨트롤러까지 사라지는 운명에 처한다는 것이 조금은 서운하기는 하다.
내가 처음 스프링을 기반으로 프로젝트를 시작했던 2004년 초에 스프링과 하이버네이트까지는 일단 어렵지 않게 결정할 수 있었다. 문제는 웹MVC 부분을 무엇을 적용할까 하는 것이었다. 스트럿츠1이 당시엔 대세였지만, 이미 그 한심한 구조에 많이 실망했던 터라 패스. 그리고 나서 고민을 했던 것은 당시 2.0이 막 나왔던 WebWork과 최신 SpringMVC였다. 그땐 WebWork의 간결한 구조도 맘에 들었고, 당시에 막 등장해서 관심을 끌었던 Confluence도 그것을 쓴다고 해서 WebWork을 선택하기로 마음이 기울어졌다. 그러던 중에 SpringMVC를 본격적으로 살펴보게 되었다.
처음엔 뭐가 이리 복잡한가 하면서 싶었다. 레퍼런스 문서에는 Controller 인터페이스 설명이 달랑있을 뿐이었고, 책도 물론 없었고, 결국 API문서와 소스를 가지고 씨름을 하면서 이해를 하려고 노력을 했다. 그러다가 처음 사용해본 SimpleFormController에 완전히 반해버렸다. 이런 식으로 폼을 사용하는 컨트롤러 코드를 멋지게 만들어내다니 하는 감동을 온몸으로 느끼고 나서, 바로 WebWork을 취소하고 SpringMVC로 개발하는 것으로 변경했다. 하이버네이트를 쓰기로 한 것과 더불어 가장 잘한 선택이었다고 생각한다.
근데 그 SimpleFormController를 비롯한 주요한 SpringMVC 컨트롤러들이 이제 용도폐기되게 되어버렸다. 쩝~
정확히 말하자면 BaseCommandController와 그 하위 5개 컨트롤러들이 @Deprecated된 것이다. 구체으로 Command(요즘은 모델이라고 하는..) 기반의 컨트롤러들이 모두 사라진 것이다. 당연히 SimpleFormController도.
이제는 CoC 스타일의 메소드 패턴 분석과 @ModelAttribute 설정을 이용해서 기존의 command object를 처리하던 것이 모두 대치되버렸다.
그렇다고 Controller인터페이스 기반의 컨트롤러구조가 모두 사라진 것은 아니다. Controller 인터페이스와 가장 기본적인 구현인 AbstractController는 살아남았다. 또한 애노테이션 없는 CoC 방식의 MultiActionController도 아직 @Deprecated되지 않았다. @MVC가 있는데 이건 왜 그대로 두엇나 모르겠다. 정식버전 나오기전에 사라질지도..
여전히 @MVC에서도 Controller 인터페이스를 구현한 클래스나, 같은 방식으로 만들어진 컨트롤러(1 URL : 1 Controller 매핑을 가지는)를 사용할 수 있다. 원한다면 Controller인터페이스를 구현해서 확장한 새로운 컨트롤러 구조를 만들어도 된다. Controller인터페이스를 가지는 컨트롤러(스프링용어로는 핸들러)를 지원하는 SimpleControllerHandlerAdapter는 여전히 존재하고 있으니까.
3.0에서는 @Deprecated로만 된 것들 중 상당 수는 다음 버전에서 아예 제거될 것이라고 한다. JDK 라이브러리도 아니고 구지 용량을 차지하면서 계속 끌고갈 필요는 없으니까 말이다.