WebServer/Spring

[Spring] Spring MVC 구조와 컴포넌트

gangintheremark 2023. 9. 16. 22:01
728x90

Spring MVC 구조

스프링 프레임워크는 MVC2 패턴을 준수한다. MVC2 패턴은 쉽게 말해 로직과 화면을 분리하는 스타일의 개발방식이다. UI코드와 비즈니스 코드를 분리함으로써 종속성을 줄이고 재사용성을 높여 보다 쉬운 유지보수를 확보할 수 있다.

출처) https://chanhuiseok.github.io/posts/spring-3/

MVC2 방식에서 사용자의 Reqeust를 처리하기 위해 주로 Controller를 호출한다. 나중에 View를 교체하더라도 사용자가 호출하는 URL 자체에 변화가 없게 만들어주기 때문이다.

 

스프링 MVC의 기본 구조는 아래와 같다

출처) https://chanhuiseok.github.io/posts/spring-3/

① 사용자의 Request는 Front-Controller인 DispatcherServlet을 통해 처리한다.
HandlerMapping은 Request의 처리를 담당하는 Controller를 찾는다. @RequestMapping("/매핑요청값") 어노테이션으로 적용된 것을 기준으로 적절한 Controller를 찾았다면 HandlerAdapter를 이용해 해당 Controller를 동작시킨다.
Controller는 실제 Request를 처리하는 로직을 작성한다. 이 때, View에 전달해야 하는 데이터는 주로 Model 객체에 담아 전달한다. Controller은 다양한 타입의 결과를 반환하는데 이에 대한 처리는 ViewResolver을 이용한다.
ViewResolver은 Controller가 반환한 결과를 어떤 View를 통해 처리하는 것이 좋을지 해석하는 역할이다. 가장 흔하게 사용하는 설정은 servlet-context.xml에 정의된 InternalResourceViewResolver 이다.
View는 실제로 응답 보내야 하는 데이터를 JSP 등을 이용해 생성하는 역할이다. 만들어진 응답은 DispatcherServlet을 통해 전송된다.

💡 이러한 방식을 Front-Controller 패턴이라 한다.

Spring MVC 프로젝트

프로젝트 생성

1. File > New > Spring legacy project
2. 프로젝트명 지정 후 templates 항목에서 Spring MVC Project 선택
3. 클래스의 패키지명 입력 (메인패키지.서브패키지.서브패키지2)

💡 서브패키지2 가 자동으로 context명이된다.
예) com.xxx.app 지정하면 app이 context명이 된다 ➜ http://localhost:8090/app

 

pom.xml에서 버전 수정

변경 후, 프로젝트 오른쪽 클릭 후 maven > update project

 

📁 디렉토리 구조

스프링 MVC 프로젝트는 일반 JAVA 영역인 root-context.xml 과 Web 관련 영역인 servlet-context.xml영역을 같이 연동해서 구동하게 된다. 사용자의 요청을 처리할 DispatcherServletweb.xml 파일에 등록한다

    <!-- root-context.xml 등록 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- servlet-context.xml 등록 -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

Spring MVC 컴포넌트

DispatcherServlet

클라이언트 요청이 들어오면 가장 먼저 요청을 받는다.

💡 요청 URL : http://localhost:8090/context명/서블릿매핑명
예) http://localhost:8090/app/ ➜ DispatcherServlet이 요청을 받는다

Controller

  • POJO (Plain Old Java Object) 기반: 어떤 클래스 및 인터페이스를 상속받거나 구현하지 않은 순수한 클래스
  • 반드시 @Controller 어노테이션 지정
  • servlet-context.xml에 빈으로 등록 ➜ component-scan 이용
💡 http://localhost:8090/컨텍스트명/요청매핑값 ➜ 요청매핑값에 의해 실제로 처리되는 Controller가 선택
    @Controller
      public class DeptController{    
       // 요청url: http://localhost:8090/app/del
        @RequestMapping("/del")
        public String delete(){
           //요청처리 (삭제기능)

          //응답처리 : 보여줄 jsp 설정 (/WEB-INF/views/list.jsp)
          return "list"; 
        }

        // 요청url: http://localhost:8090/app/add
        @RequestMapping("/add")  
        public String insert(){
         // 요청처리 (저장기능)

         //응답처리 : 보여줄 jsp 설정 (/WEB-INF/views/list.jsp )
         return "list";
        }
      }

 

HandlerMappingHandlerMappingAdapter

  • DispatcherServlet이 요청을 전송할 Controller을 알기위해 HandlerMapping에게 도움을 요청
  • @RequestMapping어노테이션을 Controller클래스나 메서드에 부여하고 이를 이용해 매핑하는 전략
  • URL뿐만 아니라 GET/POST 같은 HTTP 메서드, 파라미터와 HTTP 헤더정보까지 매핑에 활용
요청매핑값 Controller
/add @RequestMapping("/add")의 insert() 메서드
/del @RequestMapping("/del")의 delete() 메서드

 

ViewResolver

  • Conroller에 의해 반환된 논리적인 뷰 이름에 기반한 뷰 선택
  • InternalResourceViewResolver : 자바의 JSP을 사용한 환경에서 사용되는 컴포넌트
💡 /WEB-INF/views/main.jsp
경로정보(/WEB-INF/views)와 확장자(.jsp)로 나눠 웹 어플리케이션에 위치한 파일을 찾는다.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

 

View

  • 뷰 (view)는 MVC 아키텍처에서 모델이 가진 정보를 어떻게 표현하는지에 대한 로직을 갖고있는 컴포넌트
728x90