Spring MVC

1c2·2024년 4월 17일
0

Spring Framework

목록 보기
5/5

MVC

  • 어플리케이션 확장을 위해 Model, View, Controller로 분리
  • 컴포넌트의 변경이 다른 영역 컴포넌트에 영향을 미치지 않음(유지 보수 용이)
  • 컴포넌트 간의 결합성이 낮아 프로그램의 수정이 용이(확장성이 뛰어남)
  • 장점
    • 화면과 비지니스 로직을 분리해서 작업 가능
    • 영역별 개발로 인하여 확장성이 뛰어남
    • 표준화된 코드를 사용하므로 공동작업이 용이하고 유지보수성이 좋음
  • 단점
    • 개발과정이 복잡해 초기 개발속도가 늦음
    • 초보자가 이해하고 개발하기에 다소 어려움

Spring MVC

  • Spring MVC 특징
    • Spring은 DI나 AOP같은 기능 뿐만 아니라, Servlet 기반의 WEB개발을 위한 MVC Framework를 제공
    • Spring MVC는 Model2 Architecture와 Front Controller Pattern을 Framework 차원에서 제공
    • Spring MVC Framework는 Spring을 기반으로 하고 있기 때문에 Spring이 제공하는 Transaction 처리나 DI 및 AOP등을 손쉽게 사용
  • Spring MVC 구성 요소
    • DispatcherServlet (Front Controller) -> web.xml
      • 모든 클라이언트의 요청을 전달받음
      • Controller에서 클라이언트의 요청을 전달하고, Controller가 리턴한 결과값을 View에게 전달하여 알맞은 응답을 생성.
    • HandlerMapping-> Spring Bean
      • 클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정
      • URL과 요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 결정하는 객체이며, DispatcherServlet은 하나 이상의 핸들러 매핑을 가질 수 있음
    • Controller
      • 클라이언트의 요청을 처리한 뒤, Model을 호출하고 그 결과를 DispatcherServlet에 알려준다.
    • Model And View
      • Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
    • ViewResolver -> Spring Bean
      • Controller가 리턴한 뷰를 기반으로 Controller의 처리 결과를 보여줄 View를 결정

    Spring MVC 요청 흐름

    간단하게 하면

Spring MVC 구현

  • Spring MVC를 이용한 Application 구현 Step
    • web.xml에 DispatcherServlet 등록 및 Spring 설정파일 등록.
    • 설정 파일에 HandlerMapping 설정
    • Controller 구현 및 Context 설정 파일 (servlet-context.xml, root-context.xml)에 등록
    • Controller와 JSP의 연결을 위해 View Resolver 설정.
    • JSP 코드 작성
  • Controller 작성
    • 좋은 디자인은 Controller가 많은 일을 하지 않고 Service에 처리를 위임

Spring MVC project의 기본 구조

Spring MVC 구현

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

Spring MVC 구현 및 실행 과정

  • web.xml - 최상위 Root ContextLoader 설정

    • Context 설정 파일들을 로드하기 위해 web.xml파일에 리스너 설정
      1. DispatcherServlet이 클라이언트의 요청을 받는다.
    <listener> 
    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    • 리스너 설정이 되면 /WEB-INF/spring/root-context.xml 파일을 읽어서 공통적으로 사용되는 최상위 Context를 생성
    <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
    • Controller Class 작성

      HomeController.java

      2. HandlerMapping 에게 요청을 보내 해당 로직을 처리할 Controller를 찾는다.

    @Controller
    public class HelloController {
    
        public HelloController() {
            System.out.println("hello controller 생성자 호출");
        }
    
        private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
    
    //	@RequestMapping(value="/", method = RequestMethod.GET)
        @GetMapping("/") 
        public ModelAndView index() {
            ModelAndView mav = new ModelAndView();
            mav.addObject("name", "안효인1");
            mav.setViewName("index");
            return mav;
        }
    }
    

    3. 클라이언트의 요청 처리 후 model(data)과 viewName을 전달

    • context 설정 파일에 Controller 등록 (servlet-context.xml)

      servlet-context.xml

    <context:component-scan base-package="com.ssafy.hello.controller" />
    • Controller와 response page 연결을 위한 ViewResolver 설정.
      4.View Resolver를 통해 view 화면을 찾아 DispatcherServlet에게 전달

      servlet-context.xml

    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<beans:property name="prefix" value="/WEB-INF/views/" />
    	<beans:property name="suffix" value=".jsp" />
    </beans:bean>

    DispatcherServlet은 client에게 응답 (default : forward)

    • JSP

      index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib
    prefix="c" uri="jakarta.tags.core" %>
    <c:set var="root" value="${pageContext.request.contextPath}"></c:set>
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Insert title here</title>
      </head>
      <body>
        <h3>Hello Spring MVC !!!</h3>
        <h1>안녕 ${name}</h1>
        <h3>파라미터 테스트</h3>
        <a href="${root}/parameter">파라미터</a>
      </body>
    </html>

Controller

  • @Controller@RequestMapping 선언

    • method 단위의 mapping 가능

  • Controller Class는 Client의 요청을 처리.

  • @Controller 선언

    • Class 타입에 적용
    • Spring 3.0 부터는 @Controller 사용을 권장
  • Controller Class를 <bean>에 등록

    servlet-context.xml

  • Controller Class 자동 스캔

    servlet-context.xml

    <context:component-scan base-package="com.ssafy.hello.controller" />
  • @RequestMapping 선언

    • @RequestMapping 선언
      • 요청 URL mapping 정보를 설정, 클래스타입과 메소드에 설정 가능.
      • 같은 URL 요청에 대하여 HTTP method(GET, POST)에 따라 서로 다른 메소드를 mapping할 수 있음
  • Controller method의 타입

  • @RequestParam annotation을 이용한 parameter mapping

  • HTML form과 Command Object

    • SpringMVC는 form에 입력한 data를 Javabean 객체를 이용해서 전송할 수 있음
  • @RequestBody parameter type

    • HTTP 요청 Body가 그대로 객체에 전달됨
    • AnnotationMethodHandlerAdapter에는 HttpMessageConverter 타입의 메시지 변환기가 기본으로 여러 개 등록되어 있음.
    • @RequestBody가 붙은 parameter가 있으면 해당 미디어 타입을 확인 후 처리 가능한 변환기가 자동으로 객체로 변환시켜줌 (ex : JSON)
    • 주로 @ResponseBody와 함께 사용됨 -> 비동기 처리

View

  • Controller에서는 처리 결과를 보여줄 View 이름이나 객체를 리턴하고 , DispatcherServlet은 View이름이나 View객체를 이용하여 view 생성

    • 명시적 지정

    • 자동 지정

    • ViewResolver : 논리적 view와 실제 JSP파일 mapping

      servlet-context.xml

      <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      				<beans:property name="prefix" value="/WEB-INF/views/" />
      				<beans:property name="suffix" value=".jsp" />
      			</beans:bean>
  • View 지정

    • View 이름 명시적 지정
      • ModelAndView와 String 리턴 타입
    • View 자동 지정
      • RequestToViewNameTranslator를 이용하여 URL로 부터 view 이름을 결정
      • 자동 지정 유형
        • return type이 Model이나 Map인 경우
        • return type이 void이면서 ServletResponse나 HttpServletResponse 타입으 ㅣparameter가 없는 경우
    • redirect view
      • View 이름에 redirect: 접두어를 붙이면, 지정한 페이지로 redirect됨
      • redirect:/article/list?pg=1
      • RedirectAttributes를 이용하여 파라미터 전달 가능
      • redirect:/article/list?pgno=1&key=&word=

Model 생성

  • View에 전당하는 데이터

    • @RequestMapping annotation 이 적용된 method의 Map, Model, ModelMap
    • @RequestMapping method가 return하는 ModelAndView
    • @ModelAttribute annotation이 적용된 method가 return한 객체
  • Model Interface 주요 method

  • Model 생성

    • ModelAndView를 통한 Model 설정
      • Controller에서 처리 결과를 보여줄 view와 view에 전달할 값(model)을 저장하는 용도로 사용
      • setViewName(String viewname);
      • addObject(String name, Object value);

요청 URL 매칭

Spring Web Application의 동작 원리

  1. 웹 어플리케이션이 싱행되면 Tomcat(WAS)에 의해 web.xml이 loading
  2. web.xml에 등록되어 있는 ContextLoaderListener가 생성. ContextLoaderListener class는 ServletContextListner interface를 구현하고 있으며, ApplicationContext를 생성하는 역할 수행
  3. 생성된 ContextLoaderListener는 root-context.xml을 loading
  4. root-context.xml에 등록되어 있는 Spring Container가 구동. 이 때 개발자가 작성한 Business Logic(Service)에 대한 부분과 Database Logic(Dao)객체들이 생성
  5. DispatcherServlet(Servlet)이 생성. DispatcherServlet은 FrontController의 역할을 수행. Client로 부터 요청 온 메세지를 분석하여 알맞은 PageController에게 전달하고 응답을 받아 요청에 따른 응답을 어떻게 할 지 결정. 실질적인 작업은 PageController에서 이루어진다. 이러한 클래스들을 HandlerMapping, ViewResolver Class라고 함.
  6. DispatcherServlet은 servlet-context.xml을 loading
  7. Client로부터 요청(request)가 들어옴
  8. 두번째 Spring Container가 구동되며 응답에 맞는 PageController들이 동작. 이 때 첫번째 Spring Container가 구동되면서 생성되면서 생성된 Dao, Service 클래스들과 협업하여 알맞은 작업을 처리.

1개의 댓글

comment-user-thumbnail
2024년 4월 19일

비싼 돈 내고 인강 들었는데 후회되네요...
이 글 보고 현타왔습니다.
잘 보고 갑니다.

답글 달기