[Spring] 어떤 컨트롤러를 사용해야 하는가

스프링을 사용하다 보면 컨트롤러 구현시 수많은 컨트롤러 클래스&인터페이스들중에서 무엇을 선택해야 할지 고민하게 될때가 있다. 자꾸 이것으로 고민을 하여 시간을 낭비 하는것 같아 이참에 각 컨트롤러들을 사용해 보고 내 스스로의 결정을 내리게 되었다.

스프링에서 제공하는 컨트롤러는 다음과 같다.

단순 컨트롤러
[code]Controller (Interface), AbstractController[/code]
단순 컨트롤러에는 Controller라는 인터페이스와 AbstractController라는 클래스 두가지를 제공한다. 두가지를 혼합해 사용하며 프로젝트를 진행해 보았는데 다음과 같은 결과를 내렸다. Controller에는 ServletContext등에 접근이 용이하지 못하다, 그야말로 간단한 컨트롤러. 기왕이면 AbstractController를 사용하도록 하자. 모든 시스템 자원을 손쉽게 접근할 수 있다. 하지만 특정 클래스를 상속받아 사용하게 될 경우에는 부득이하게 여러개를 구현해도 되는 Controller 인터페이스를 사용하도록 하자.

일회성 컨트롤러
[code]ThrowawayController (Interface)[/code]
단순하지만 강력한 기능을 제공하는 컨트롤러. execute()메서드에서 비지니스 로직을 구현한다. 하지만 request나 response를 받지 못한다. 사실상 쓸일이 없는 컨트롤러.

다중 액션 컨트롤러
[code]MultiActionController[/code]
하나의 컨트롤러에 한개 이상의 액션을 처리 할 수 있다. 의미상 여러개의 기능을 하나의 컨트롤러로 묶는것이 좋을 경우 다중 액션 컨트롤러를 사용하도록 하자. 하지만 난무할 경우 유지보수에 어려움을 겪을 수 있을 클래스이다.

커맨드 컨트롤러
[code]BaseCommandController, AbstractCommandController[/code]
아래에서 나올 폼 컨트롤러에서 미리 폼을 보여주는 기능만 빠졌다고 생각하면 좋을 컨트롤러들이다. BaseCommandController는 아래의 폼컨트롤러까지 상속을 받게 되는 부모 클래스이다. 이쪽에 좀더 특화된 AbstractCommandController를 사용하도록 하자. GET혹은 POST로 넘겨받는 인자들을 command로 묶어 제공받을 수 있다. 보통의 한두개의 인자를 받을 경우에는 request.getAttribute(“foo”); 로 받으면 되겠지만 인자가 다양하다면 이 커맨드컨트롤러를 사용하자. validate구현이 가능하며 비지니스로직에서 보기싫은 request 인자값들의 널 or “” 처리를 없앨 수 있다.

폼 컨트롤러
[code]AbstractFormController, SimpleFormController[/code]
이건 누구나 다 아실 폼 컨트롤러 처리이다. 보통 SImpleFormController를 사용하실 것이다. AbstractFormController보다 더욱 특화된 SimpleFormController를 사용하는것이 좋겠다고 생각한다. Spring의 form태그를 같이 사용하면 더욱 더 강력한 힘을 발휘할 수 있다.

마법사 컨트롤러
[code]AbstractWizardFormController[/code]
여러 페이지를 거쳐 입력 받은 값을 하나의 폼같이 처리하는 컨트롤러이다. 간단한 설문조사 개발하는것이 아니고서야 쓸일이 없다고 생각한다. 요즘에야 자바스크립트 등으로 얼마든지 동일한 구현을 할 수 있고, 페이지 이동이라도 있을 경우 값을 완전히 잃어버리는 문제도 있고 별로 안좋다고 생각한다.