나의개발일지

Spring) SpringMVC 본문

Back-End/Spring

Spring) SpringMVC

아. 이렇게 하면 될거 같은데.. 2024. 1. 4. 21:59
728x90



MVC Pattern

MVC란 모델(Model), 뷰(view), 컨트롤러(Controller)를 이용해서 프로그램이하는 소프트웨어 설계 방법

Model

  • 어플리케이션 샅애의 캡슐화
  • 상태 쿼리에 대한 응답
  • 어플리케이션의 기능 표현
  • 변경을 view에 통지

View

  • 모델을 화면에 시각적으로 표현
  • 모델에게 업데이트 요청
  • 사용자의 입력을 컨트롤러에 전달
  • 컨트롤러가 view를 선택하도록 허용

Controller

  • 어플리케이션의 행위 정의
  • 사용자 액션을 모델 업데이트와 mapping
  • 응답에 대한 view 선택

 

장점 1. 예를 들어프레젠테이션 로직과 비즈니스 로직을 분리할 수 있고, 각각의 기능을 모듈화해서 개발을 체계적으로 진행

장점 2. 유지 보수 시점에서도 MVC 패턴의 구조로 구축되어 있기 때문에 새로운 개발자는 모델, 뷰, 컨트롤러 각각의 모듈을 찾아가면 전체적인 구조를 파악하기 수월하다.


스프링 MVC

스프링 MVC는 웹 애플리케이션을 개발하기 위한 전용 프레임워크로, 기본적으로는 MVC 패턴을 따르고 있다.

즉, 모델, 뷰, 컨트롤러를 스프링에 적용해서 웹 애플리케이션 개발을 더욱 쉽고 체계적으로 진행

 

스프링 MVC의 흐름

 

1단계

클라이언트의 요청이 들어오면 DispatcherServlet, HandlerMapping, HandlerAdapter를 이용해 클라이언트 요청에 적합한 컨트롤러를 찾고 해당 컨트롤러의 메서드를 실행

 

  • 클라이언트의 요청

        클라이언트의 요청이 최초 발생한다. 요청이 발생하면 스프링 MVC 프레임 워크의 DispatcherServlet이 요청을 받는

        다.

 

  • DispatcherServlet

        클라이언트의 요청을 분석해서 가장 적합한 컨트롤러를 찾는다

        이때 DispatcherServlet이 직접 클라이언트의 요청에 해당하는 컨트롤러를 찾지 않고 HandlerMapping 객체에 위임            한다

        HandlerMapping 객체는 클라이언트의 요청에 적합한 컨트롤러 객체를 반환

        DispatchServlet은 반환 받은 컨트롤러를 호출

        여기서 HandlerAdapter  객체를 거치는 단계 추가

 

  • HandlerAdpater

        DispatcherServlet이 HandlerMapping 객체로부터 받은 컨트롤러 객체를 이용할 때 컨트롤러에 명시되어 있는 클라이

        언트 요청에 적합한 메서드를 호출

        즉, HandlerAdapter 객체에 컨트롤러의 메서드 호출을 위임하는 것이다.

 

  • ModelAndView

        컨트롤러에서는 요청에 부합한 작업(비즈니스 로직)을 한 후 다시 HandlerAdpater에 처리 결과를 반환

        이때 사용되는 객체가 ModleAndView다.

        ModelAndView 객체는 처리 결과의 데이터와 View 정보를 가지고 있다.

        최종적으로 클라이언트에게 전달한다.

 

 

2단계

DispatcherServlet이 클라이언트의 요청을 처리한 결과를 HandlerAdapter로부터 받으면, 처리 결과를 클라이언트에 응답하기 위해 뷰를 찾는 단계

 

  • ViewResolver

        처리 결과에 적합한 뷰를 찾기 위해 DispatcherServlet 객체는 ViewResolver 객체를 이용한다.

        ViewResolver에서 적합한 뷰를 찾기 위해 ModelAndView에 담겨 있는 뷰 정보를 이용

        ViewResolver 객체가 응답에 적합한 뷰를 생성하면 다시 DispatcherServlet에 뷰 정보를 반환

 

 

3단계

DispatcherServlet 객체는 ViewResolver 객체가 보내준 뷰 정보를 이용해 뷰 객체를 준비한다.

뷰 객체는 일반적으로 JSP파일이며, JSP 파일은 WAS를 통해 클라이언트의 브라우저에 응답 결과를 출력한다.

 


스프링 MVC 설정파일

web.xml

  • <init-param>을 설정 하지 않으면 " <servlet-name>-servlet.xml " file에서 applicationContext의 정보를 load
  • Spring Container는 설정파일의 내용을 읽고 ApplicationContext 객체를 생성
  • <url-pattern>은 DispatcherServlet이 처리하는 URL Mapping pattern을 정의
  • Servlet이므로 1개 이상의 DispatcherServlet 설정가능
  • <load-on-startup>1</load-on-startup>설정 시 WAS startup시 초기화 작업진행

<web.xml 예시>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
         
    <!-- listener Configuration -->
    <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>
    </listner>
   
    <!-- Servlet Configuration -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- Init parameters -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Servlet Mapping -->
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

 

 

  • 서블릿 구성 내부의 <init-param> 요소는 Spring 애플리케이션 컨텍스트 구성 파일( servlet-context.xml )의 위치를 지정한다. <init-param>이 제공되지 않으면 기본적으로 WEB-INF 디렉토리에 servlet-context.xml 파일을 찾는다.
  • <servlet-mapping> 요소는 서블릿을 /로 지정된 URL 패턴을 사용하여 요청을 처리하도록 매핑한다. 이는 dispatcher 서블릿이 애플리케이션에 들어오는 모든 요청을 처리하도록 한다.
  • Context 설정 파일들을 로드하기 위해 web,xml 파일에 리스너 설정 (contextLoaderListener)
    리스너 설정이 되면 /WEB-INF/spring/root-context.xml 파일을 읽어서 공통적으로 사용되는 최상위 Context를 생성

 

root-context.xml

  • root-context.xml 파일은 Spring 애플리케이션의 루트 컨텍스트를 정의한다.
  • 주로 데이터베이스 연결, 서비스 빈 등과 같은 애플리케이션 전반에 걸쳐 사용되는 빈을 정의한다.
  • 이 파일에 정의된 빈들은 애플리케이션의 생명주기 동안 유지된다.
  • 예를 들어, 데이터베이스 연결과 트랜잭션 관리를 위한 DataSource, Hibernate 또는 JPA를 위한 EntityManagerFactory 등이 여기에 포함될 수 있다.
  • 웹 애플리케이션에서는 주로 ContextLoaderListener를 통해 로드된다.

servlet-context.xml

  • servlet-context.xml 파일은 Spring MVC 서블릿의 컨텍스트를 정의한다.
  • 주로 컨트롤러, 뷰 리졸버, 리소스 핸들러와 같이 웹 관련 빈을 정의한다.
  • 이 파일에 정의된 빈들은 DispatcherServlet의 생명주기에 따라 생성되며, 각 HTTP 요청마다 새로 생성되거나 캐시된다.
  • 예를 들어, 컨트롤러 클래스, 뷰 리졸버 및 HandlerMapping 등이 여기에 포함될 수 있다.
  • 또한, 멀티파트 파일 업로드, 국제화 설정 및 세션 관리와 같은 웹 애플리케이션 특정 설정도 여기에서 처리된다.
  • 보통 웹 애플리케이션의 DispatcherServlet를 통해 로드된다.

스프링 MVC 프레임워크를 사용하는 이유

스프링 프레임워크의 다양한 객체들 중 실제로 개발자가 코딩해야 하는 객체는 모델의 로직 과 컨트롤러와 뷰뿐이다. 다시 말해 DispatcherServlet, HandlerMapping, HandlerAdapter 객체는 스프링 MVC 프레임워크에 이미 만들어져 있다.

 

이것이 바로 스프링 프레임워클르 사용하는 이유이다. 개발자는 프레임워크의 구조를 이해하는 수준에서 개발을 진행하면 되고 직접 구조를 만들지 않아도 된다

728x90
반응형

'Back-End > Spring' 카테고리의 다른 글

Spring) DI 의존성 주입  (0) 2024.04.15
Spring) IoC & Container  (0) 2024.04.15
Spring) Row Mapper  (1) 2023.12.18
Spring) 쿠키와 세션  (0) 2023.12.14
Spring) STS와 MySQL연결하기 for.Mac  (0) 2023.11.10