본문 바로가기
Java Web Programming/6. Spring | MyBatis

[Spring/MyBatis] Spring MVC Pattern 적용해보기

by 파프리카_ 2020. 11. 4.
728x90
반응형

[ Spring MVC Web 적용을 위한 WAS Tomcat  및 환경 설정 ]

WAS 환경 설정하는 방법 !

 

[WAS] WAS 환경 설정 및 Apache Tomcat 아파치 톰캣 설치

이클립스 설정 : WAS 환경설정 WAS (Web Application Server) 1. 새로운 workspace 만들기 -> switch workspace ( "새로운 워크스페이스 환경" )  File > Switch workspace > other > 'Add an existing or create..

creamilk88.tistory.com

  1. Dynamic web project 생성
  2. 프로젝트 오른쪽 마우스 클릭 > Java EE Tools > Generate Deployment Discriptor Stub 클릭하여 
    > web.xml 생성 
  3. 프로젝트 오른쪽 마우스 클릭 > configure > conver to maven project

/pom.xml

<dependencies>
  <!-- Spring-Web MVC Framework -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.14.RELEASE</version>
  </dependency>
</dependencies>

* 상단에 빨간색 경고가 뜰 경우 C: > 사용자 > 본인 선택 > .m > repository 폴더 삭제

 + 메이븐 업데이트 : alt + F5

 

원래 최초 서비스를 요청하면 파란 줄로, 두번 째부터는 보라 줄로 진행되는 것이다.

그러나 그렇게되면 맨 처음 서비스를 요청하는 사람의 로딩시간이 길어지는 불편함이 발생할 수 있기 때문에,

<load-on-startup>을 통해 어플리케이션이 최초에 실행될 때, 객체생성, init()의 과정이 진행되도록 하여,

이후 어떤 request가 와도 service(보라색 줄)부터 실행되도록 한다.

 

/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" version="3.1">
  <display-name>SpringMVC1</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- servlet 설정 -->
  <servlet>
  	<!-- servlet-name을 기반으로 spring 파일을 찾는다. -->
  	<servlet-name>dispatcher</servlet-name>
 	<!-- Libary 제공 -->
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- load-on-startup 
  		 : Serlvet LifeCycle에 의거해서, 
  		   어플리케이션 최초 실행 시 해당 servlet을 객체 생성, init()까지 실행되도록 설정
  		   만약 이 태그를 기입해주지 않으면, 클라이언트 최초 요청 시점에 서블릿이 초기화된다. -->
  	<load-on-startup>1</load-on-startup>
  </servlet>
  
  <!-- servlet-mapping 설정 -->
  <servlet-mapping>
  	  <!-- DispatcherSerlvet은 자신의 설정 파일(springMVC 설정)을 
  	  	   [serlvet-name]-serlvet.xml로 찾아서 로딩한다. -->
	  <servlet-name>dispatcher</servlet-name>
	  <!-- 클라리언트 요청 url이 .action으로 마치는 요청은
	  	   모두 DispatcherSerlvet이 처리한다. -->
	  <url-pattern>*.action</url-pattern>
  </servlet-mapping>
  
</web-app>

[ Spring MVC pattern ]

  1. DispatcherServlet : FrontController역할 - Spring configure 설정을 통해 dispatcher-servlet.xml으로 설정한다.
  2. HandlerMapping : 클라이언트의 요청을 처리할 실제 컨트롤러를 연결하는 객체
    (담당 Controller를 연결 - RequestMappingHandlerMapping은 연결해주는 방법 중 하나)
  3. Controller : 실제 요청을 처리하는 컨트롤러 로직을 담당
     * HttpServletRequest와 HttpServletResponse, HttpSession, Cookie를 이용해
        클라이언트의 요청을 분석하고 적절한 응답을 한다. 
  4. ModelAndView : view의 url과 attribute를 전달한다. (view-name, attribute-name, attribute-value) 
  5. ViewResolver : 적잘한 view를 찾아 응답하도록 하는 역할 (InternalResourceViewResolver를 사용한다)
  6. View :JSP(화면) or JSON(Ajax - 데이터)

ex) 제일 처음 web.xml이 동작된다. 이 때, load-on-startup에 의해 서블릿 객체가 생성되고 초기화된다.

그때, 본인의 servlet-name을 찾아, dispatcher-serlvet.xml을 생성한다.

dispatcher-serlvet.xml에서는 HandlerMapping, ViewResolver와 그 외  bean을  DI하여 생성한다. 

 

=> 메모리에 다 로딩시켜둔다.jsp에서 request를 하면, controller에 들어가고, ModelAndView로 반환된다.

ModelAndView는 이동할 jsp(view)의 path와 보낼 정보를 담을 수 있다. 

 

반환된 path는 dispatcher-serlvet의 viewResolver에 따라, /views/[path]/.jsp로 이동한다.


Spring 환경설정

/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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- HandlerMapping 
		: 클라이언트의 요청을 처리할 실제 컨트롤러를 연결하는 객체 
		* BeanNameUrlHandlerMapping 
		: controller에서 view name을 ok로 할당해서 반환하면,
		  /views/ok.jsp로 응답하게 하는 설정이다.
		-->
	<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
	
	<!-- ViewResolver
		 : 컨트롤러가 클라이언트에게 응답할 view에 대한 방식을 담당하는 객체 -->
	<bean id="ViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/views/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	
	<bean id="/hello.action" class="org.kosta.controller.HelloController"/>
	
	<bean id="mockDAO" class="org.kosta.model.MockDAO"/>
	<bean id="/find.action" class="org.kosta.controller.FIndMemberController">
		<constructor-arg ref="mockDAO"/>
	</bean>

</beans>

/org.kosta.model

 

(가상의 DAO 생성)

/MockDAO.java

package org.kosta.model;

public class MockDAO {
	public String findMemberById(String id) {
		return id+" 아이디에 대한 회원정보 : 아이유";
	}
}

/org.kosta.controller

 

/HelloController.java

package org.kosta.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class HelloController extends AbstractController{

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
			HttpServletResponse response)
			throws Exception {
		
		ModelAndView mv =  new ModelAndView();
		
		//ViewResolver 설정에 의해 views/hello_reslut.jsp로 응답한다.
		mv.setViewName("hello_result");
		//request 영역에 setAttribute() 하는 것과 동일
		//addObject(name, value)
		mv.addObject("info", "DAO 연동 결과");

		return mv;
	}
	
}

 

/FindMemberController.java

package org.kosta.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kosta.model.MockDAO;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class FIndMemberController extends AbstractController{
	
	private MockDAO mockDAO;
	
	//DI방식으로 주입받는다
		public FIndMemberController(MockDAO mockDAO) {
		super();
		this.mockDAO = mockDAO;
	}
	
	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		//view에서 id 객체 받기
		String id = request.getParameter("id");
		
		//model과 연동하여 결과 받기
		String memberInfo = mockDAO.findMemberById(id);
		
		//view에 연동 결과 공유 - dispatcher-servlet.xml에 전송
		// new ModelAndView(viewName, name, value);
		return new ModelAndView("find_result", "memberInfo", memberInfo);
	}



}

[ 결과 ]

> index.jsp 화면

 

> 'Hello Controller Test' 링크 클릭하면,

 

> id 입력하고 검색하면,

728x90
반응형