- MVC 패턴과 Spring MVC
- Spring MVC 설정
- MVC 웹 개발 패턴에 대해 이해하고 Spring MVC 프로젝트를 설정합니다.
- Front Controller 패턴과 ServletDispatcher에 대해 이해합니다.
[ 모델-뷰-컨트롤러(Model-View-Controlle, MVC)는 소프트웨어 공학에서 사용되는 아키텍처 패턴으로 MVC 패턴의 주 목적은 Business logic과 Presentation logic을 분리하기 위함이다. ]
- MVC 패턴을 사용하면, 사용자 인터페이스로부터 비지니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비지니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있음
- Model : 애플리케이션의 정보(데이터, Business Logic 포함)
- View : 사용자에게 제공할 화면(Presentation Logic)
- Controller : Model과 View 사이의 상호 작용을 관리
지난 포스팅에도 언급했듯이, MVC 패턴은 Layer들 중에서 Presentation Layer를 더 세분화하여 나눈 패턴입니다.
Java에서는 MVC 패턴을 모델 2 아키텍처라고도 부릅니다.
실질적으로 클라이언트는 컨트롤러와만 직접 소통을 하게 됩니다. 요청 접수도, 결과 응답도 컨프롤러가 수행합니다.
모델쪽에 Service와 DAO가 구현되어 있습니다.
뷰는 주로 HTML 형태입니다.
또는 JSON 형태로도 나갈 수도 있습니다. 이 경우는 클라이언트쪽에 HTML 파일이 있는 것이고 JSON 데이터를 받으면 그 데이터를 활용해서 HTML 페이지가 완성되는 데 이를 SPA라고 하죠(Vue, React 등과 같은)
- 데이터 저장소(ex : 데이터베이스)와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다루는 일을 함
- 여러 개의 데이터 변경 작업(추가, 변경, 삭제)을 하나의 작업으로 묶는 트랜잭션을 다루는 일도 함
- DAO 클래스, Service 클래스에 해당
모델은 데이터와 관련된 컴포넌트입니다. 데이터베이스 연동, 데이터 CRUD을 구현합니다. 또한 VO(Value Object, =도메인 객체)도 모델이라고 볼 수 있습니다.
- 모델이 처리한 데이터나 그 작업 결과를 가지고 사용자에게 출력할 화면을 만드는 일을 함
- 생성된 화면은 웹 브라우저가 출력하고, 뷰 컴포넌트는 HTML과 CSS, JavaScript를 사용하여 웹 브라우저가 출력할 UI를 만듦
- HTML과 JSP를 사용하여 작성할 수 있음.
- 클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트를 호출하는 일을 함
- 클라이언트가 보낸 데이터가 있다면, 모델을 호출할 때 전달하기 쉽게 데이터를 적절히 가공하는 일을 함
- 모델이 업무 수행을 완료하면, 그 결과를 가지고 화면을 생성하도록 뷰에게 전달(클라이언트 요청에 대해 모델과 뷰를 결정하여 전달)
- Servlet과 JSP를 사용하여 작성할 수 있음
컨트롤러가 제일 하는 일이 많습니다. 클라이언트 요청에 따라 모델을 적절히 제어합니다. 일단 클라이언트 요청을 받아서 분석해야 적절한 모델을 호출하겠죠? 데이터를 전달할 때 적절히 가공하는 일도 합니다. 모델로부터 받은 결과 데이터를 뷰에 전달하는 역할도 합니다.
- Front Controller 프로세스
- Front Controller는 클라이언트가 보낸 요청을 받아서 공통적인 작업을 먼저 수행
- Front Controller는 적절한 세부 Controller(내가 개발해야 할)에게 작업을 위임
- 각각의 애플리케이션 Controller는 클라이언트에게 보낼 뷰를 선택해서 최종 결과를 생성하는 작업
- Front Controller 패턴은 인증이나 권한 체크처럼, 모든 요청에 대하여 공통적으로 처리해야 하는 로직이 있을 경우 전체적으로 클라이언트의 요청을 중앙 집중적으로 관리하고자 할 경우에 사용
Spring은 MVC패턴에서 Front Controller 패턴을 추가로 사용합니다. 위에서 언급했듯이, 컨트롤러는 사용자가와 직접적으로 통신하는 유일한 컴포넌트이기 때문에 하는 일이 많습니다. 그래서 컨트롤러를 Front/애플리케이션 컨트롤러로 세분화해서 나눈 아키텍처가 위 그림입니다.
모든 요청을 받는 용도를 Front Controller가 합니다. 따라서 모든 요청은 Front Controller를 거쳐야 합니다. 과거서부터 Java는 servlet으로 Front Controller를 구현해왔습니다. 하지만 Spring에서는 미리 하나 내장시켜놓았습니다. 아무튼 Front Controller가 적절한 애플케이션 Controller를 호출하는 식의 프로세스입니다. 실제로 우리가 만들어야 하는 컨트롤러는 @Controller 어노테이션을 사용해서 코드를 작성합니다. Front Controller는 Spring에서 이미 제공하기 때문에 직접 구현할 필요 없습니다. 더 간결해졌죠?
그림처럼 Front Controller는 시스템 전방에 위치해있습니다. 이를 퍼사드 패턴(Facde Pattern)이라고도 합니다. 오우.. 객체지향 설계 전공 수업이 생각납니다;
Front Controller가 요청을 분석해서 우리가 직접 개발한 Controller를 호출합니다.
- Spring은 DI나 AOP와 같은 기능뿐만 아니라, 서블릿 기반의 웹 개발을 위한 MVC 프레임워크를 제공
- Spring MVC는 모델2 아키텍처와 Front Controller 패턴을 프레임워크 차원에서 제공
- Spring MVC 프레임워크는 Spring을 기반으로 하고 있기 때문에 Spring이 제공하는 트랜잭션 처리나 DI 및 AOP등을 손쉽게 사용
- 대부분의 MVC 프레임워크들은 Front Controller 패턴을 적용해서 구현
- Spring MVC도 Front Controller 역할을 하는 DispatcherServlet 이라는 클래스를 계층의 맨 앞단에 놓고, 서버로 들어오는 모든 요청을 받아서 처리하도록 구성
- 예외가 발생했을 때 일관된 방식으로 처리하는 것도 Fornt Controller의 역할
Controller : @Controller 어노테이션을 사용하여 우리가 개발할 Controller를 의미합니다.
HandlerMapping : Spring에 내장되어 있어서 개발자가 직접 건들 필요는 없습니다. DispatcherServlet이 요청을 최초를 받을 때 어떤 Controller를 호출할지 결정하는 클래스입니다.
ModelAndView : View의 이름(ex : jsp 파일 이름)과 View에 바인딩 되어야 할 데이터인 모델 객체를 모두 포함하는 객체입니다.
View : View의 이름(jsp의 파일 이름) 즉, 정보를 보유하는 객체입니다.
ViewResolver : Controller에서 어떤 View를 선택할지 결정합니다.
DispatcherServlet이 요청을 받으면 안에 있는 HandlerMapping 클래스에 의해서 적절한 Controller가 결정됩니다. 그 결정에 따라 해당 Controller를 호출합니다. Controller는 DispatcherServlet에 MedelAndView를 전달합니다. 여기에는 데이터와 JSP파일 이름이 들어가 있죠. DispatcherServlet는 View Resolver를 통해 View를 확보하게 되고 이를 클라이언트에게 응답합니다.
DispatcherServlet을 사용하려면 Web.xml 파일에 등록해야합니다.
servlet 태그, servelt-mapping 태그, filter 태그를 작성합니다.
filter는 POST방식으로 요청할 때 한글 깨짐 현상을 방지하기 위해 추가해야하는 부분입니다.
이번 실습에서는 1)spring-mvc 라이브러리를 설정하고 2)DispatcherServlet 등록을 위한 Web.xml 수정, 3) Spring MVC 패턴 사용을 위한 스프링 빈 설정파일 수정을 합니다.
Spring MVC를 사용하기 위해 pom.xml를 수정합니다.
pom.xml은 메이븐 기반 프로젝트에서 루트 디렉토리에 존재하는 설정파일이었습니다.
https://mvnrepository.com/artifact/org.springframework/spring-webmvc/4.3.9.RELEASE
위 사이트 들어가서 Spring MVC 라이브러리 태그를 긁어옵니다.
↑ pom.xml에 추가하고 저장하면 라이브러리가 로컬에 설치됩니다.
web.xml을 수정해야하므로 web.xml를 엽니다.
↑ web.xml에 기본적으로 들어있는 코드 일부를 삭제합니다.
↑ < servlet >, < servlet-mapping >을 작성합니다.
이제 servlet-context.xml을 만듭니다. spring-context.xml과 같은거라고 생각하시면 됩니다.
↑ web.xml < param-value >에 썼듯이, spring 폴더를 생성하고 그 안에 servlet-context.xml을 만듭니다.
↑ 파일 이름 작성합니다.
servlet-context.xml에 작성해하는 것들이 있습니다.
1) < context:component-scam ...> : 컴포넌트(빈) 오토 스캔
2) < mvc:annotation-driven /> : 컨트롤러 자동으로 찾아줌
3) viewResolver
↑ 먼저 context 태그를 작성할 수 있도록 체크합니다.
↑ context 태그를 작성
↑ Namespaces에서 mvc를 체크합니다. < mvc:annotation-driven /> 사용 위함입니다.
↑ 작성 완료
이제 viewResolver를 설정합니다.
↑ 작성 완료