스프링 MVC
M model Java - 일을 하는 자바객체
V view JSP - 보여지는 부분은 jsp를 썼다.
C controller Servlet - 제어를 하는 부분은 서블릿을 썼다.
DispatcherServlet이 C -- 제어한다.
Client가 요청을 한다. *.do로 요청한다. 요청하면 무조건 DispatcherServlet가 받는다.
Client에서 바로 View로 가는 것을 막았다.
↓
webapp
----- 원래는 여기다 적었다면 이제는 외부에서 접근 못하도록 밑에 적음.
WEB-INF
---- 여기다가 적게되면서 외부에서 접근하는 것을 원천적으로 막아버리게 된다.
Contoller가 하는 역할 M - 일 처리하는 역할
요청이들어오면 DispatcherServlet이 받아서 Contoller로 던져준다.
http://~~~/Project명/회원가입.do
@Controller
class AAA {
@RequestMapping(value="로그인.do)
}
class BBB {
}
@Controller
class CCC {
@RequestMapping(value="회원가입.do)
}
@RequestMapping(value="회원가입.do) 여기서 똑같이 회원가입.do하면 안된다.
HandlerMapping이 @Controller를 다 뒤지므로 안된다 !!!
이런식으로 여러 클래스가 있는 경우
DispatcherServlet에서 넘어올 때 @Controller 붙어있는 클래스들만 찾는다.
그렇게 찾도록 유도하는게 HandlerMapping이다.
여기서는 BBB를 제외한 AAA와 CCC를 찾게된다.
DispatcherServlet이 Controller에 있는 애들 찾을 수 있도록해주는게 HandlerMapping이다.
/member/loginForm.do=member.service.LoginFormService --- command.properties가 했던 역할을 이제는 HandlerMapping가 해주므로 command.properties 파일이 필요가 없어지는 것이다.
http://~~~/Project명/회원가입.do 이렇게 들어오면 @Controller 붙어있는 것을 찾고 그 중에서 회원가입.do를 찾는다.
그렇게되면 class CCC로 넘어오게 된다.
원래는 /member/loginForm.do=member.service.LoginFormService 이런식으로 해서 찾게되면 자바파일로 가게된다.
그리서 ~~~Service 자바파일의 마지막에 return할 때는 jsp파일을 담아간다.
스프링에서는 ModelAndView에 담아서 간다.
ViewResolver는 우리가 원하는 처리결과를 생성할 뷰를 결정하여 View를 통해 화면을 뿌려주는 것이다.
우리가 해줘야하는 것은 Controller / View 부분이다.
DispatcherServlet HandlerMapping ---- 스프링이 자동제공 해준다.
나머지는 알아서 다 연결을 해준다.
스프링 MVC도 컨트롤러를 사용하여 클라이언트의 요청을 처리한다.
스프링에서 DispatcherServlet 이 MVC에서 C(Control) 부분을 처리한다.
개발자가 처리할 부분은 클라이언트의 요청을 처리할 컨트롤러와
응답화면을 전송할 JSP나 Velocity 템플릿 등 뷰 코드이다
DispatcherServlet, HandlerMapping, ViewResolver등은 스프링이
기본적으로 제공하는 구현 클래스를 사용한다.
스프링 MVC의 구성 요소
1. DispatcherServlet
클라이언트의 요청을 전달 받는다
컨트롤러에게 클라이언트의 요청을 전달하고
Controller가 리턴한 결과값을 View에 전달하여 응답을 생성하도록 한다.
2. HandlerMapping
클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정한다.
3. Controller
클라이언트의 요청을 처리한 뒤 결과를 DispatcherServlet에 알려준다
4. ModelAndView
컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.
5. ViewResolver
컨트롤러의 처리 결과를 생성할 뷰를 결정한다.
6. View
컨트롤러의 처리 결과 화면을 생성한다.
JSP나 Velocity 템플릿 파일등을 뷰로 사용한다.
[실습]
Project : Chapter06 (Dynamic Web Project) - pom.xml
(먼저 이걸로 연습해서 구조파악해야한다 !!)
서버 잘켜지는지 먼저 확인 후 프로젝트 만들기 !!
project명에서 우클릭 - Spring - Add Spring Project Nature
project명에서 우클릭 - Configure - Convert to Maven Project
project명에서 우클릭 - Maven - Update Project...
자바 버전 11로 맞추기 !! (17로 하면 Runtimes에 톰캣서버가 없다)
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Chapter06</groupId>
<artifactId>Chapter06</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
</plugin>
</plugins>
</build>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.37</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.37</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
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_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>Chapter06</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
- **DispatcherServlet**은 Spring MVC에서 가장 중요한 서블릿이다. 이 서블릿은 클라이언트 요청을 받아 해당 요청을 적절한 컨트롤러로 전달하고, 컨트롤러의 응답을 다시 클라이언트에게 전송하는 역할을 한다.
- Spring MVC는 이 DispatcherServlet을 통해 요청을 처리하고 응답을 생성한다. 즉, 모든 HTTP 요청이 이 서블릿을 통해 라우팅된다.
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
- <servlet-mapping>: DispatcherServlet에 대한 매핑을 설정하는 부분이다. 이 태그는 클라이언트로부터 어떤 URL 요청이 들어오면 어느 서블릿이 해당 요청을 처리할지 결정하는 역할을 한다.
- <servlet-name>: <servlet> 태그에서 정의한 서블릿 이름을 참조한다. 여기서는 **dispatcherServlet**이라는 이름을 참조하고 있다.
- <url-pattern>: 요청 URL 패턴을 정의다. 여기서는 ***.do**가 사용되고 있다.
- *.do 패턴은 모든 .do로 끝나는 URL 요청이 DispatcherServlet으로 전달된다는 의미이다.
- 예를들어 http://~~~/Project명/회원가입.do라는 요청이 들어오면, 이 요청은 DispatcherServlet에 의해 처리된다.
스프링 설정 파일을 만들어줘야한다. (WAC)
1. 웹과 관련이 있다. (db와 연동되지 않은 애들)
- /WEB-INT/서블릿이름-servlet.xml (default)
- /WEB-INT/dispatcherServlet-servlet.xml
2. 웹과 독립적이다.(웹과 관련이 없다.) (db와 연동된 애들을 말한다.)
- /WEB-INT/applicationContext.xml (default)
오늘은 일단 db와 연동되지 않은 웹과 관련있는 것부터 실습 !!
Chapter06
src/main/java
com.contoller
HelloController.java
DispatcherServlet에서 Controller로 넘어가려면 HandlerMapping에 Controller가 어디있는지를 말해줘야한다.
@Controller
public class HelloController {
}
내가 @Controller다 하고 !!
http://localhost:8080/Chapter06/hello.do
↓요청
DispatcherServlet.java
↓ HandlerMapping
HelloController.java
서블릿 주기함수에서
init()
doGet() / doPost()
destory()
위의 메서드는
내가 만든적이 없고 이미 만들어져있는거 오버라이드해서 썼지만
HelloController.java 여기서는 사용자가 메서드를 만들어서 쓴다.
**@Controller**는 이 클래스가 Spring MVC의 컨트롤러임을 나타낸다.
package com.contoller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping(value="hello.do", method = RequestMethod.GET)
@RequestMapping: 클라이언트가 어떤 URL을 요청할 때, 그 요청을 이 메서드가 처리하도록 매핑해주는 애노테이션이다. 즉, 특정 URL 패턴이 들어왔을 때 이 메서드를 실행시키라는 의미 !
- value="hello.do": hello.do라는 URL이 요청될 때 이 메서드가 실행된다. 예를 들어, http://localhost:8080/hello.do 요청이 들어오면 이 메서드가 호출된다.
- method=RequestMethod.GET: 이 메서드는 GET 방식으로 요청이 들어올 때만 실행됩니다. POST 요청 등 다른 방식으로 들어오면 이 메서드는 실행되지 않는다.
public ModelAndView hello() {
ModelAndView mav = new ModelAndView();
mav.addObject("result", "Hello Spring MVC!!");
mav.setViewName("hello");
return mav;
}
메서드 이름 hello(): 이 메서드는 우리가 작성한 메서드이다. 하지만 직접 호출하는 것이 아니라, 클라이언트가 hello.do URL을 요청할 때 Spring의 HandlerMapping이 이 메서드를 찾아서 자동으로 실행해준다.
ModelAndView 객체: 이 메서드는 **ModelAndView**를 반환다. ModelAndView는 모델 데이터와 뷰 정보를 함께 묶어서 전달하는 객체이다.
- 모델(Model): 클라이언트에게 전달할 데이터를 의미한다. 여기서 "result"라는 이름으로 "Hello Spring MVC!!"라는 값을 저장해 뷰에 전달하고 있다.
- 뷰(View): 클라이언트에게 보여줄 페이지(화면)를 의미한다. 여기서 "hello"라는 이름으로 지정된 JSP 파일을 가리킨다.
mav.addObject("result", "Hello Spring MVC!!"): 이 코드는 "result"라는 이름으로 모델 데이터를 추가하는 부분이다. 이 데이터를 JSP나 다른 뷰에서 클라이언트에게 보여줄 수 있다.
- 즉, **"Hello Spring MVC!!"**라는 문자열이 **result**라는 이름으로 뷰에 전달다.
mav.setViewName("hello"): 이 코드는 뷰의 이름을 설정한다. "hello"라는 뷰 이름을 지정했으므로, Spring은 이 이름을 가진 JSP 파일을 찾아서 클라이언트에게 응답다.
예전에는 데이터를 실어라 하면 request에 실었지만 이제는 ModelAndView에 실게되는 것이다.
package com.contoller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping(value="hello.do", method = RequestMethod.GET)
public ModelAndView hello() { //사용자가 만든 콜백메서드
ModelAndView mav = new ModelAndView();
mav.addObject("result", "Hello Spring MVC!!");
mav.setViewName("hello"); //JSP 파일이름 => /WEB-INF/hello.jsp / 화면에 보여줘야할 이름을 실어주면 된다.
return mav;
}
}
HelloController 빈으로 설정하러 가자
dispatcherServlet-servlet.xml
<bean id="helloController" class="com.contoller.HelloController"></bean>
jsp로 뿌려주려면 InternalResourceViewResolver 이 함수가 필요하다.
<property name="prefix" value="/WEB-INF/"></property>
-- 위치 알려주기 hello.jsp를 WEB-INF가서 찾는다.
<property name="suffix" value=".jsp"></property>
-- 확장명 적어줘야한다.
dispatcherServlet-servlet.xml
클라이언트 요청을 처리하는 컨트롤러와 뷰 리졸버(View Resolver) 등을 정의
사용자가 보내는 요청을 처리할 방법과 그 결과를 어느 JSP 파일에 보여줄지를 설정하는 곳
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<bean id="helloController" class="com.contoller.HelloController"></bean>
</beans>
- <bean> 설정의 역할: 컨트롤러 등록
<bean id="helloController" class="com.contoller.HelloController"></bean>
Spring 컨테이너에 컨트롤러 객체를 등록하는 설정이다.
- InternalResourceViewResolver 역할: JSP 파일 위치와 확장자 설정
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
InternalResourceViewResolver는 Spring에서 뷰(View)를 처리하는 리졸버(Resolver) 역할을 한다.
Controller에서 반환하는 뷰 이름(hello)을 실제 JSP 파일의 경로와 확장자를 붙여서 완성시켜주는 역할을 한다.
prefix와 suffix 속성: 이 두 속성은 뷰 파일의 경로와 확장자를 설정한다.
- prefix: JSP 파일이 저장된 디렉토리 경로를 지정한다. 여기서는 /WEB-INF/로 설정되어 있으므로, 모든 JSP 파일을 /WEB-INF/ 디렉토리 아래에서 찾게 된다.
- suffix: 뷰 파일의 확장자를 설정한다. 이 예시에서는 .jsp로 설정되어 있으므로, 뷰 이름이 hello라면 최종적으로 hello.jsp 파일을 찾게 된다.
뷰 리졸버의 작동 과정
- 컨트롤러에서 반환된 뷰 이름을 받는다. 예를 들어 hello() 메서드에서 mav.setViewName("hello")로 hello라는 이름을 반환한다.
- InternalResourceViewResolver가 이 뷰 이름에 **prefix**와 **suffix**를 더한다.
- prefix: /WEB-INF/
- 뷰 이름: hello
- suffix: .jsp
- 최종적으로 /WEB-INF/hello.jsp 경로로 변환된다.
- Spring은 이 JSP 파일을 찾아 렌더링하고, 결과를 클라이언트(웹 브라우저)에 응답으로 보다.
hello.jsp
mav.addObject("result", "Hello Spring MVC!!");
데이터를 result로 해서 실어줬다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>${result }</h3>
</body>
</html>
'Spring' 카테고리의 다른 글
DAY 65 - 스프링 프레임워크 - MVC (2024.10.08) (0) | 2024.10.08 |
---|---|
DAY 64 - 스프링 프레임워크 - myBatis (2024.10.07) (0) | 2024.10.07 |
DAY 63 - 스프링 프레임워크 - JDBC / HOMEWORK (2024.10.04) (2024.10.07) (1) | 2024.10.04 |
DAY 63 - 스프링 프레임워크 - AOP (2024.10.04) (0) | 2024.10.04 |
DAY 62 - 스프링 프레임워크 - 파일출력 (2024.10.02) (1) | 2024.10.02 |