본문 바로가기
Dev/Spring

스프링 MVC

by vellahw 2022. 10. 17.

 

 

스프링 MVC 프레임워크는 스프링을 기반으로 하고 있기 때문에 스프링이 제공하는 트랜잭션 처리나 DI 및 AOP 등을 손쉽게 사용할 수 있다는 장점을 갖는다. 또한 Struts와 같은 프레임워크와 스프링 프레임워크를 연동하기 위해 추가적인 설정을 하지 않아도 된다는 장점을 갖고 있다.

 

 

🎈 스프링 MVC의 주요 구성 요소 및 처리 흐름

다른 MVC 기반의 프레임워크와 마찬가지로 스프링 MVC도 컨트롤러를 사용하여 클라이언트의 요청을 처리하게 된다.

스프링에서 DispatcherServlet이 MVC에서 C(Controller) 부분을 처리하는데, DispacherServlet을 비롯한 MVC의 주요 구성 요소는 다음과 같다.

구성 요소 설 명
DispacherServlet 클라이언트의 요청을 전달 받음.
컨트롤러에게 클라이언트의 요청을 전달하고, 컨트롤러가 리턴한 결과 값을 View에 전달하여 알맞은 응답을 생성하도록 함.
HandlerMapping 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할 지를 결정
Controller 클라이언트의 요청을 처리한 뒤 그 결과를 DispatcherServlet에 전송
ModelAndView 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담음
ViewResolver 컨트롤러의 처리 결과를 생성할 뷰를 결정
View 컨트롤러의 처리 결과 화면을 생성. JSP 파일 등을 뷰로 사용함.

 

스프링 MVC의 클라이언트 요청 처리 과정

  1. 클라이언트의 요청이 DispacherServlet에 전달된다.
  2. DispatcherServlet은 HandlerMapping을 사용하여 클라이언트의 요청을 처리할 컨트롤러 객체를 구한다.
  3. DispatcherServlet은 컨트롤러 객체를 이용해서 클라이언트의 요청을 처리한다.
  4. 컨트롤러는 클라이언트의 요청 처리 결과 정보를 담은 ModelAndView 객체를 리턴한다.
  5. DispatcherServlet은 ViewResolver로부터 응답 결과를 생성할 뷰 객체를 구한다.
  6. 뷰는 클라이언트에 전송할 응답을 생성한다.

이 과정에서 개발자가 직접해야 개발해야 할 부분은 클라이언트의 요청을 처리할 컨트롤러와 클라이언트에 응답 결과 화면을 전송할 JSP 등의 뷰 코드이다.

나머지 DispatcherServlet이나 HandlerMapping, ViewResolver 등은 스프링이 기본적으로 제공하는 구현 Class를 사용하게 된다.   

 

스프링 MVC를 이용하여 웹 어플리케이션을 개발하는 과정을 단순하게 말하자면 다음과 같다.

  1. 클라이언트의 요청을 받을 DispatcherServlet을 web.xml 파일에 설정
  2. 클라이언트의 요청을 처리할 컨트롤러를 작성
  3. ViewResolver를 설정
  4. JSP를 이용하여 뷰 영역의 코드를 작성

 

 


 

 

🎇 스프링 MVC 간단 예제

스프링 사용에 필요한 jar 파일 구성

 

1. DispatcherServlet 설정 및 SPRING 컨텍스트 설정

DispatherServlet은 클라이언트의 요청을 전달받는 Servlet으로서, 컨트롤러와 뷰와 같은 SPRING MVC의 구성 요소를 이용하여 클라이언트에게 서비스를 제공하게 된다.

WEB-INF/web.xml 파일에 다음과 같이 Servlet과 Servlet Mapping정보를 추가하여 DispacherServlet을 설정한다.

 

 <servlet>
  	<servlet-name>dispatcher</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>dispatcher</servlet-name> //[Servlet이름]
	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
  • *.do로 들어오는 클라이언트의 요청을 DispatherServlet이 처리하도록 설정함
  • DispatherServlet는 WEB-INF 디렉터리에 위치한 [Servlet이름]-servlet.xml 파일을 SPRING 설정 파일로 사용한다.
  • 위 코드의 경우 'dispatcher-servlet.xml' 파일을 설정 파일로 사용

 

 

2. 컨트롤러 구현 및 설정 추가

컨트롤러를 구현하려면 먼저 @Controller Annotation을 Class에 적용한다. 그리고, @RequestMapping Annotation을 이용해서 클라이언트의 요청을 처리할 메서드를 지정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package controller;
 
import java.util.Calendar;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
@Controller //컨트롤러 어노테이션-해당 클래스가 스프링 MVC의 컨트롤러를 구현한 클래스라는 것을 지정
public class HelloController {
    @RequestMapping("/hello.do"//처리할 경로 지정 및 요청 경로를 처리할 메소드를 설정
    public ModelAndView hello() { //요청 경로를 처리하는 hello() 메소드 
        ModelAndView mav = new ModelAndView(); //컨트롤러의 처리 결과를 보여줄 뷰와 
                              //뷰에서 출력할 모델을 지정
        mav.setViewName("hello"); //뷰 이름  /WEB-INF/view/hello.jsp
        mav.addObject("greeting", getGreeting()); //모델에 "greeting"이라는 이름으로
                            // String 타입의 값을 추가
        return mav;
    }
    
    private String getGreeting() { //getGreeting() 메소드
        int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
        //현재 시간에 따라 다른 결과를 보여줌
        if(hour >= 6 && hour <= 10) {
            return "좋은 아침입니다.";
        } else if (hour >= 12 && hour <= 15) {
            return "점심 식사는 하셨나요?";
        } else if (hour >= 18 && hour <= 22) {
            return "좋은 밤 되세요.";
    } 
        return "안녕하세요";
    }
}
cs
  • ModelAndView는 컨트롤러의 처리 결과를 보여줄 뷰와 뷰에서 출력할 모델을 지정할 때 사용된다.
  • 스프링 MVC는 ModelAndView 뿐만 아니라 String이나 ModelMap, 또는 Map과 같은 타입을 이용해서 뷰 이름과 모델 정보를 설정할 수 있도록 하고 있다.

 

 

3. 설정 파일에 컨트롤러를 빈으로 등록 및 ViewResolver 설정 추가

DispatcherServlet은 스프링 컨테이너에서 컨트롤러 객체를 검색하기 때문에 SPRING 설정 파일에 컨트롤러를 빈으로 등록해 주어야 한다.

컨트롤러 클래스는 직접 또는 간접적으로 ModelAndView 객체를 생성하게 된다. 앞서 작성한 HelloController 클래스는 ModelAndView 객체를 생성해서 리턴하였다.

ModelAndView.setViewName() 메서드를 이용해서 컨트롤러의 처리 결과를 보여줄 뷰 이름을 'hello'로 지정하였는데, DispacherServlet은 이 뷰 이름과 메칭되는 뷰 구현체를 찾기 위해 ViewResolver를 사용한다.

스프링 MVC는 JSP 등의 뷰 구현 기술과의 연동을 지원하는데, JSP를 뷰 기술로 사용할 경우 다음과 같이 InternalResourceViewResolver 구현체를 빈으로 등록해 주면 된다.

 

▼ WEB-INF/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-3.0.xsd">

	<bean id="helloController" class="controller.HelloController" />
    		//클래스 id 지정(=객체 생성) 	//패키지명.클래스

	<bean id="viewResolver"	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/view/" />
		<property name="suffix" value=".jsp" />
	</bean>
</beans>
  • prefix 프로퍼티와 suffix 프로퍼티의 값으로 각각 "/WEB-INF/view/"와 ".jsp"를 설정하였는데, 이는 이 ViewResolver가 "/WEB-INF/vew/뷰이름.jsp"를 뷰 JSP로 사용한다는 것을 의미한다. 즉, 앞의 HelloController는 뷰 이름으로 "hello"를 리턴하므로, 실제로 사용되는 뷰 파일은 "/WEB-INF/view/hello.jsp" 파일이 된다. 

 

 

4. 뷰 코드 구현

WEB-INF 디렉터리 안에 jsp 파일을 작성한다.

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>인사</title>
</head>
<body>
인사말: <strong>${greeting}</strong>
</body>
</html>

위 코드에서 ${greeting} 코드를 이용하고 있는데, 이때 "greeting"이라는 이름은 앞서 HelloController에서 추가한 모델의 이름과 동일한 것을 확인할 수 있다.

모델과 뷰 코드의 연결

 

 

5. 실행

이클립스에서 웹 프로젝트 자체를 실행하여 브라우저에 URL을 입력해서 실행 결과를 확인한다.

 

/hello.do 요청 처리 과정

 

 

 

댓글