서론
SpringMVC는 현재 가장 널리 사용되는 웹 MVC(모델-뷰-컨트롤러) 프레임워크 중 하나입니다.
- Model(모델 계층): 데이터베이스에서 데이터를 가져오거나 저장하는 역할을 담당합니다.
- View(뷰 계층): 모델 계층의 데이터를 기반으로 사용자에게 보여질 웹 페이지를 생성합니다.
- Controller(컨트롤러): 뷰로부터 입력을 읽고, 사용자 입력을 모델에게 전달하거나 데이터를 처리합니다.
SpringMVC의 실행流程을 이해하기 전에 먼저 전체적인 작업 흐름도를 확인해보겠습니다.
一, SpringMVC 작업 흐름
1. 요청 전송
사용자가 웹 서버로 HTTP 요청을 보내면, 웹 서버는 해당 HTTP 요청을 분석하여 DispatcherServlet의 요청 매핑 경로와 매칭합니다(web.xml 파일에 설정되어 있음). 웹 컨테이너는 이 요청을 DispatcherServlet에게 전달합니다.
2. 핸들러에 요청 위임
DispatcherServlet은 전달받은 요청을 기반으로 HandlerMapping에 설정된 정보(URL, 요청 메시지, HTTP 메서드 등)를 확인하여 해당 요청을 처리할 핸들러를 찾습니다.
그림 2
3. 핸들러 어댑터 실행
처리할 핸들러를 찾으면 요청 처리 권한이 해당 핸들러로移交됩니다. 핸들러는 실제 처리 로직을 캡슐화한 후, 구체적인处理器어댑터(HandlerAdapter)를 통해 실행됩니다(작업 흐름도의 3단계와 4단계에 해당).
4. ModelAndView 반환
핸들러가 실행을 완료하면 DispatcherServlet에게 ModelAndView 객체를 반환합니다. 이 ModelAndView는 논리적 뷰视图이며, 실제 최종 뷰는 아닙니다.
5. 뷰 렌더링
DispatcherServlet은 ModelAndView 객체를 수신하면 ViewResolver를 통해 논리적 뷰를 실제 뷰(View)로 변환합니다.
6. 클라이언트에게 뷰 반환
DispatcherServlet은 Model을 사용하여 ModelAndView의 매개변수를解析하고 최종 뷰 정보를 클라이언트에게 반환합니다.
二, web.xml 설정 파일
SpringMVC의 실행 흐름을 이해하는 것은 어렵지 않지만, 가장 번거로운 것은 설정 파일을 어떻게 작성해야 하는지입니다. 이제 web.xml 파일의 설정 방법을 살펴보겠습니다.
- 캐릭터 인코딩 설정
CharacterEncodingFilter는 Spring 프레임워크에서 제공하는 필터로, 모든 요청을 필터링하여 지정된 캐릭터 인코딩을 설정합니다.
<param-value>사용할 캐릭터 인코딩</param-value>
forceEncoding: request.getCharacterEncoding() 메서드를 무시할지 여부를 설정합니다. true로 설정하면 기존 인코딩 형식을 강제로 덮어씁니다.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
url-pattern의 경우, 컨테이너가 서블릿에 도달하면 요청 URL 경로에서 현재 애플리케이션의 컨텍스트 경로를 제외한 부분을 매핑 URL로 사용합니다. 예를 들어 URL이 http://127.0.0.1/myweb/login.html이고 컨텍스트가 myweb이라면, 컨테이너는 http://127.0.0.1/myweb을 제외하고 login.html만 가지고 매칭합니다. 매핑 과정에는 순서가 있습니다.
- 설정 파일 로드 리스너
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ContextLoaderListener의 역할은 웹 컨테이너가 시작될 때 자동으로 ApplicationContext 설정 정보를 로드하는 것입니다. ContextLoaderListener는 ServletContextListener 인터페이스를 구현하므로, 웹 컨테이너가 시작될 때 기본적으로 구현된 메서드가 실행됩니다.
- log4j 로그 리스너 설정
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
- applicationContext.xml 파일 배치 web.xml에 별도의 설정 파라미터가 없으면 기본 경로는 "/WEB-INF/applicationContext.xml"이며, WEB-INF 디렉토리에 생성하는 XML 파일은 반드시 applicationContext.xml这个名字으로 지정해야 합니다.
WEB-INF는 Java의 보안 디렉토리로, URL을 통해 직접 접근하고 싶지 않은 리소스 파일을 이 디렉토리에 배치할 수 있습니다. 이렇게 하면 사용자가 리소스 파일에 접근하려면 web.xml에서 해당 파일에 대한 매핑을 설정해야 합니다. 예를 들어, 사용자가 로그인한后才能 볼 수 있는 페이지가 있다면, 그 페이지의 URL을 알아도 로그인하지 않으면 접근할 수 없도록 보안 디렉토리에 배치해야 합니다.
파일 이름을 직접 지정하려면 web.xml에 다음 설정을 추가합니다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/applicationContext.xml</param-value>
</context-param>
param-value에 여러 XML 파일을 지정할 경우 쉼표로 구분합니다. 또는 applicationContext-*.xml과 같은 와일드카드를 사용할 수도 있으며, 해당 디렉토리에 있는 모든 매칭되는 파일이 로드됩니다. ContextLoaderListener는 ContextLoader 클래스와 연동되어 전체 설정 로드 과정을 담당합니다.
- 프론트 컨트롤러 DispatcherServlet 설정
DispatcherServlet은 매칭되는 요청을 가로채고, 정의된 규칙에 따라 목표 컨트롤러로 분배합니다.
- DispatcherServlet 초기화 과정에서 프레임워크는 웹 애플리케이션의 WEB-INF 폴더에서 [servlet-name]-servlet.xml이라는 이름의 설정 파일을 찾습니다.
- **.xml 부분에는 여러 가지 작성 방법이 있습니다:
- 기본값 사용: /WEB-INF/-servlet.xml
- 다른 경로 지정: /WEB-INF/classes/springmvc-servlet.xml
- 클래스패스 지정: classpath*:springmvc-servlet.xml
- 여러 값은 쉼표로 구분
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
url-pattern 설정 시:
-
*.do 또는 *.htm으로拦截: 전통적인 방식으로 가장 간단하고 실용적, 정적 파일(jpg, js, css)이拦截되지 않음
-
/로拦截: REST 스타일 구현 가능, 많은 인터넷 서비스에서 선호하는 방식, but 정적 파일이拦截되어 정상적으로 표시되지 않을 수 있음
-
환영 페이지 지정
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
- 404 에러 페이지 이동
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
- NullPointerException 페이지 이동
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/errorNull.jsp</location>
</error-page>
- 405 에러 페이지 이동
<error-page>
<error-code>405</error-code>
<location>/error405.jsp</location>
</error-page>
- 500 내부 서버 에러
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>