ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 005. Spring MVC 의 개요
    SsY/Class 2023. 6. 29. 14:02
    728x90
    Spring MVC 의 개요
    ■■■ Spring MVC ■■■
    
    1. 웹 개발을 위한 MVC 패턴이 적용된 Spring Framework
       Spring 에서는 DispatcherServlet 클래스가 컨트롤러 역할을 수행하게 된다.
    //-- 클라이언트 방문시 직원(view) 직접 만나지 않고
    //-- 큰 빌딩의 인포데스크가 관리(dispatcher-servlet) - 해당 회사에 팀 담당자(servlet)에 연락 
    //--           ---------------- 이게 스프링(프론트 컨트롤러)       ---------(사용자 정의 컨트롤러)
    2. Spring MVC 의 주요 구성요소
       - DispatcherServlet          //-- 스프링(프론트 컨트롤러) , 지정되어있는 이름
       - HandlerMapping
       - Controller                 : 사용자 정의 Controller. 액션 처리. 우리가 작성.
       - ModelAndView
       - ViewResolver
       - view                       : 결과 출력. 우리가 작성.
       - web.xml                    : DispatcherServlet 객체 등록. 우리가 작성.
         //-- *.action 이라는 주소요청이 온다면
         //-- (원래는) 해당 서블릿으로 보내~
         //-- → (대신에) 모두 DispatcherServlet 으로 보내 라고 작업하게 됨
       - dispatcher-servlet.xml     : Controller 객체 등록. 우리가 작성. 
                                    //-- 프론트 컨트롤러를 제어할 수 있는 작업지시서 작성 하는 곳
                                    //-- 지정되어있는 이름
         //-- web.xml 에서 넘어오면
         //-- hi.action 이면 해당 사용자 정의 컨트롤러로 가라
         //-- bye.action 이면 해당 사용자 정의 컨트롤러로 가라 
         //-- 이러한 작업들을 기재하게 된다.
         
    3. Spring MVC 실행 흐름
       - 사용자 요청 → DispatcherServlet
       - DispatcherServlet → HandlerMapping 에 주소 분석 요청 //-- ex) hi.action 인지 ...  찾아서 업무 분배 → 특정 컨트롤러에
       - DispatcherServlet → 특정 Controller 에 객체 호출 및 결과 수신.
                             결과는 ModelAndView 객체.
         ※ ModelAndView 객체
            : View 객체 정보와 결과 값이 들어있는 객체
       - DispatcherServlet → ViewResolver 에 View 객체 분석 요청.
       - DispatcherServlet → 특정 View 객체에 Model 객체를 넘겨주고 결과 출력.
    
    4. Spring MVC 에서 우리가 해야할 일
       - Controller //-- 사용자 정의 컨트롤러
         액션 처리를 담당하는 Controller 클래스 작성
         Annotation 을 사용하거나, Controller 인터페이스를 구현하여 작성
       - View
         결과 출력용 JSP 페이지 작성
       - web.xml
         서블릿 주소와 DispatcherServlet 객체 등록
       - dispatcher-servlet.xml
         우리가 작성한 Controller 객체 등록
         URL 매핑 주소 등록
    
    ※ Spring 이 스트럿츠를 비롯하여 다양한 웹 프레임워크와 비교적 연동이 잘 되는 편이기는 하지만
       서로 다른 두 프레임워크를 연동하기 위해서는 설정의 중복 등 개발과정에서 불편함이 존재할 수 밖에 없다.
       따라서, Spring 이 자체적으로 제공하는 MVC 프레임워크를 사용하게 되면
       Spring 이 제공하는 AOP, 트랜잭션 처리, IoC/DI 등의 기능을 그대로 사용하면서 
       MVC 패턴에 기반하여 웹 어플리케이션을 개발할 수 있다.
       또한, 다른 프레임워크와 Spring 을 연동하기 위해서 설정을 중복해서 적용해야 한다든지...
       하는 개발과정에서 나타나는 불편을 해소할 수 있게 된다.

    mvc01
    ■■■ Spring MVC 프로젝트 실습01 ■■■
    ○ Perspective
       : JavaEE
    
    ○ 다이나믹 웹 프로젝트 생성
       : mvc01
       (STS - 스프링 / 스프링 레거시 / 스프링 부트 / 스프링 MVC ...)
    
    ○ 톰캣 서버 등록 및 포트(port)설정
       : port 8080 → 8090 → 3306 / URIEncoding="UTF-8"
    
    ○ 기타 환경 설정
       : 폰트, 줄번호, 편집 포맷, 인코딩방식, 템플릿 등...
    
    ○ Spring MVC 환경 설정을 위한 기본적인 라이브러리 등록
       : WebContent > WEB-INF > lib 경로에 등록
       - 경로1 → C:\s-f-3.0.2-with-docs\dist
         ·파일1  → org.springframework.aop-3.0.2.RELEASE.jar
         ·파일2  → org.springframework.asm-3.0.2.RELEASE.jar
         ·파일3  → org.springframework.beans-3.0.2.RELEASE.jar
         ·파일4  → org.springframework.context-3.0.2.RELEASE.jar
         ·파일5  → org.springframework.core-3.0.2.RELEASE.jar
         ·파일6  → org.springframework.expression-3.0.2.RELEASE.jar
         ·파일7  → org.springframework.jdbc-3.0.2.RELEASE.jar
         ·파일8  → org.springframework.transaction-3.0.2.RELEASE.jar
         ·파일9  → org.springframework.web.servlet-3.0.2.RELEASE.jar
         ·파일10 → org.springframework.web-3.0.2.RELEASE.jar
       - 경로2 → C:\s-f-3.0.2-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1
         ·파일11 → com.springsource.org.apache.commons.logging-1.1.1.jar
       - 경로3 → C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
                  (오라클 설치 경로)
         ·파일12 → ojdbc6.jar
       - 경로4 → C:\Downloads\13_JSTL\jakarta-taglibs-standard-1.1.2\lib
         ·파일13 → jstl.jar
         ·파일14 → standard.jar
    
    ○ 물리적 파일 구성
       - HelloController.java
       - Hello.jsp
       - dispatcher-servlet.xml
       - web.xml
       - hello.action
    
    ※ 『dispatcher-servlet.xml』 파일을 WebContent > WEB-INF 경로에 생성한다
        그리고 이 파일의 기본 설정 내용(템플릿)을 구성하기 위해
        스프링 DOC 의 내용을 참고해서 작성할 수 있도록 한다.
        ·경로       : C:\s-f-3.0.2-with-docs\docs\spring-framework-reference\pdf
        ·파일       : spring-framework-reference.pdf
        ·내용(위치) : 문서 구조성 425 페이지 (실제 내용 상 450 페이지)
        ·해당 위치로 이동하면 XML 파일에 대한 샘플 코드가 있다.
          이 내용을 복사하여 dispatcher-servelet.xml 파일의 기본 템플릿으로 작성한다.
    
    <내용>
    ======================================================================================
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:component-scan base-package="org.springframework.samples.petclinic.web"/>
    // ...
    </beans>
    =======================================================================================
    
    ○ 사용자 최초 요청 주소 
    http://localhost:3306/mvc01/hello.action

    다이나믹 웹 프로젝트 생성 → 서버 → server.xml → preference import → Spring MVC 환경 설정을 위한 라이브러리 등록 → dispatcher-servlet.xml 생성 → 템플릿 내용 넣기 → 파일 구성

    ※ mvc01 프로젝트의 실행 및 처리 과정 정리
       ① 외부요청
          http://localhost:3306/mvc01/hello.action
          → web.xml 관여
             (→ Front Controller 등록 → DispatcherServlet 등록)
       ② DispatcherServlet 요청 접수
          → web.xml → DispatcherServlet 등록
             web.xml → URL 패턴 등록        
          → dispatcher-servlet.xml 관여
             (→ 사용자 요청 분석 → 특정 컨트롤러 지정)
       ③ 해당 컨트롤러의 특정 메소드 호출 (액션 처리, ModelAndView 객체 반환)
          → 사용자의 요청에 적합한 서비스 액션 처리
          → 결과 데이터가 들어있는 모델 객체 준비
          → View 정보(JSP 페이지 정보) 반환
             (→ 여기서는 객체가 아닌 경로 포함된 View 페이지의 이름)
       ④ View 페이지에서 최종 웹 페이지를 작성
          → JSP 페이지 내에서 EL 이나 JSTL 등의 표기 사용 가능
       ⑤ 응답 완료

    • dispatcher-servlet.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans
    						http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    						http://www.springframework.org/schema/context
    						http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    	<context:component-scan base-package="org.springframework.samples.petclinic.web" />
    
    	<!-- ※ 사용자 정의 Controller 객체 등록 및 URL 매핑 주소 등록 -->
    	<!--    - 『name=""』 속성에 매핑 주소를 등록한다. -->
    	<!--       이 과정에서 Front Controller 가 갖고있는 확장자의 형태로 구성한다. -->
    	<!--    - 『class=""』 속성은 Controller 객체의 클래스 경로 및 이름을 등록한다. -->
    	<bean name="/hello.action" class="com.test.mvc.HelloController"></bean>
    
    </beans>

    • HelloController.java
    /*=================================
       HelloController.java
       - 사용자 정의 컨트롤러 클래스
    ================================= */
    package com.test.mvc;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    // ※ Spring MVC 『Controller』 인터페이스를 구현하는 방법을 통해
    //    사용자 정의 컨트롤러 클래스를 구성한다.
    
    public class HelloController implements Controller
    {
    	
    	@Override
    	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
    	{
    		// 액션 코드
    		 ModelAndView mav = new ModelAndView();
    		 
    		 String message = "Hello, SpringMVC World!";
    		 
    		 mav.addObject("message", message);
    		 mav.setViewName("/WEB-INF/view/Hello.jsp");
    		 
    		 return mav;
    	}
    	
    }

    • Hello.jsp
    <%@ page contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%
    	request.setCharacterEncoding("UTF-8");
    	String cp = request.getContextPath();
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Hello.jsp</title>
    <link rel="stylesheet" type="text/css" href="css/main.css">
    </head>
    <body>
    
    <div>
    	<h1>${message }</h1>
    </div>
    
    </body>
    </html>

    • web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    	id="WebApp_ID" version="3.1">
    	<display-name>mvc01</display-name>
    	<welcome-file-list>
    		<welcome-file>index.html</welcome-file>
    		<welcome-file>index.htm</welcome-file>
    		<welcome-file>index.jsp</welcome-file>
    		<welcome-file>default.html</welcome-file>
    		<welcome-file>default.htm</welcome-file>
    		<welcome-file>default.jsp</welcome-file>
    	</welcome-file-list>
    
    	<!-- ※ Spring MVC Framework 등록 -->
    	<!--    → Front Controller 등록 -->
    	<!--       → DispatcherServlet 등록 -->
    
    	<servlet>
    		<servlet-name>dispatcher</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>dispatcher</servlet-name>
    		<url-pattern>*.action</url-pattern>
    	</servlet-mapping>
    
    </web-app>

    • hello.action
      - 빈 파일 : 최초 요청 주소
      - 요청시에 웹컨테이너를 맞이
      → web.xml 이 .action 이면 DispatcherServlet(객체는 xml 이 아니다!!) 으로 찾아가게 함 
           (스프링컨테이너가 경로를 따라가서 dispatcherservlet의 인스턴스구문을 생성해서 퍼올려놓는것)
      → dispatcher-servlet (객체를 만나기 위해 이용할 뿐)에 들어가면 hello.action 이면 해당 컨트롤러 찾아가~
      → HelloController 가면 액션 코드 대로 행동해~
          (request, response 객체를 받아와서 액션)
          (ModelAndView 는 유연한 구성으로, 붙여서 구성할 수도 별개로 구성할 수도 있다.)(ex) 문 손잡이)
      → Hello.jsp 는 HelloController 에서 보내준 메세지를 받아 구성된다.
    728x90
Designed by planet-si