스프링
Spring Web MVC
코딩 화이팅
2023. 4. 13. 16:06
- Servlet API를 기반으로 구축된 웹프레임워크
- 정식 명칭은 Spring Web MVC이지만, Spring MVC로 주로 알려져 있다.
- Spring Framework가 제공하는 DI, AOP뿐 아니라, WEB 개발을 위한 기능을 제공
- DispatcherServlet(FrontController)를 중심으로 디자인 되었으며, View Resolver, Handler Mapping, Controller와 같은 객체와 함께 요청을 처리하도록 구성되어 있다.
- 다른 프레임워크와 마찬가지로 front controller pattern으로 구성됨
- 중심이 되는 DispatcherServlet(front controller)은 요청처리를 위한 기능을 제공
Spring MVC 구성요소
- DispatcherServlet : 클라이언트 요청처리(요청 및 처리 결과 전달)
- HandlerMapping : 요청을 어떤 Controller가 처리할 지 결정
- Controller : 요청에 따라 수행할 메서드를 선언하고, 요청처리를 위한 로직 수행(비즈니스 로직 호출)
- ModerAndView : 요청처리를 하기 위해서 필요한 혹은 그 결과를 저장하기 위한 객체
- ViewResolver : Controller에 선언된 view 이름을 기반으로 결과를 반환할 View를 결정
- View : 응답화면 생성
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/servlet-context.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/root-context.xml</param-value>
</context-param>
listener
- 웹 어플리케이션의 생명주기동안 Spring의 ApplicationContext를 관리하는 역할.
- 웹 어플리케이션 시작 시, 리스너는 설정 파일에서 지정한 'contextConfigLocation' 경로에 있는 XML 파일을 읽어들여서 ApplicationContext를 초기화하고, 웹 애플리케이션 종료시에는 이를 종료시킨다.
- 이렇게 하면서 웹 어플리케이션의 생명주기와 ApplicationContext의 생명주기가 동일하게 관리된다.
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Filter
- 웹 어플리케이션에서 요청과 응답의 문자 인코딩을 처리하는 역할
- 모든 요청에 대해 실행되며, 필터 설정에서 지정한 인코딩(UTF-8)을 사용하여 요청과 응답의 문자 인코딩을 설정한다.
- 웹 어플리케이션에서 문자 인ㄴ코딩 문제를 방지하고 깨진 문자를 제대로 처리할 수 있다.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<?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">
<context:component-scan base-package="com.ssafy.mvc.controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
@RequestMapping("home")
public ModelAndView homeHandle() {
ModelAndView mav = new ModelAndView();
System.out.println("home 요청이 왔다.");
// mav.addObject("키", "벨류")
mav.addObject("msg", "Welcome to Spring World");
//view 이름을 지정을 해주자.
//포워딩을 한것과 동일하다~~
mav.setViewName("home");
return mav;
}
=========================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
<h2>환영합니다. 처음으로 오셨네요</h2>
${msg }
</body>
</html>
//
home 요청이 왔다.
처음에는 에러가 나지만 주소창 뒤에 home을 써주면
package com.ssafy.mvc.model.service;
import org.springframework.stereotype.Service;
@Service
public class MyService {
public void doSometing() {
System.out.println("어떤 작업을 했습니다.");
//DAO 불러다가 처리하는 블라블라작업이 있다.
}
}
===============================================================
<?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">
<context:component-scan base-package="com.ssafy.mvc.model.service"></context:component-scan>
</beans>
===============================================================
@RequestMapping("home")
public ModelAndView homeHandle() {
ModelAndView mav = new ModelAndView();
System.out.println("home 요청이 왔다.");
// mav.addObject("키", "벨류")
mav.addObject("msg", "Welcome to Spring World");
myService.doSometing();
//view 이름을 지정을 해주자.
//포워딩을 한것과 동일하다~~
mav.setViewName("home");
return mav;
}
===============================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
<h2>환영합니다. 처음으로 오셨네요</h2>
${msg }
</body>
</html>
//
home 요청이 왔다.
어떤 작업을 했습니다.
주석처럼 써도 되고 그렇게 안 써도 된다.
@RequestMapping("home")
// @RequestMapping(value = "home", method = RequestMethod.GET)
public ModelAndView homeHandle() {
ModelAndView mav = new ModelAndView();
System.out.println("home 요청이 왔다.");
// mav.addObject("키", "벨류")
mav.addObject("msg", "Welcome to Spring World");
myService.doSometing();
//view 이름을 지정을 해주자.
//포워딩을 한것과 동일하다~~
mav.setViewName("home");
return mav;
}
Controller Handler Method argument emamples
<?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">
<context:component-scan base-package="com.ssafy.mvc.controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
============================================================
// 반환타입이 문자열이다. (문자열 -> viewname이 된다.)
@GetMapping("test1")
public String test1() {
// /WEB-INF/view/test1.jsp
return "test1";
}
============================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>테스트</title>
</head>
<body>
<h2>TEST1입니다.</h2>
</body>
</html>
<?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">
<context:component-scan base-package="com.ssafy.mvc.controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
===============================================================
//반환타입이 문자열일때 가져가고 싶은 값이 있다면..
//바구니를 준비해라~~~
@GetMapping("test2")
public String test2(Model model) {
model.addAttribute("msg", "바구니에 데이터를 넣어서 보냈다.");
return "test2";
}
===============================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>테스트</title>
</head>
<body>
<h2>TEST2입니다.</h2>
${msg }
</body>
</html>
나머지 코드는 위와 동일
//파리미터로 여러개의 값을 받고 싶다.
@GetMapping("test3")
public String test3(Model model, String id, String pw) {
model.addAttribute("id", id);
model.addAttribute("pw", pw);
return "test3";
}
=============================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>테스트</title>
</head>
<body>
<h2>TEST3입니다.</h2>
${id } / ${pw }
</body>
</html>
나머지 코드는 위와 동일
//만약 내가 쓴 파라미터 이름과 넘겨온 name의 이름이 다르다면....
// @RequestParam(value = "myid")String id -> 처리가 가능하다.
// 이렇게 쓴다면 ?myid=ssafy라고 쳐도 문제 없이 처리된다.
// @RequestParam(value = "myid",required = false)String id //required 이러한 속성을 사용하면 필수 결정 가넝
// 기본으로는 NULL 값이 들어가
//기초자료형에 null 들어가는 말 되나? 기본값으로 설정을 할수도 있다.
// @RequestParam(defaultValue = "1")
//파리미터로 여러개의 값을 받고 싶다.
@GetMapping("test3")
public String test3(Model model, String id, String pw, @RequestParam(defaultValue = "1")int age) {
model.addAttribute("id", id);
model.addAttribute("pw", pw);
System.out.println(age);
return "test3";
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>테스트</title>
</head>
<body>
<h2>TEST3입니다.</h2>
${id } / ${pw }
</body>
</html>
나머지 코드는 위와 동일
package com.ssafy.mvc.model.dto;
public class User {
private String id;
private String pw;
private int age;
public User() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", pw=" + pw + ", age=" + age + "]";
}
}
==============================================================
//적절한 DTO를 준비해놓으면 알아서 퐉 들어간다잉
@PostMapping("test4")
public String test4(Model model, User user) {
System.out.println(user);
return "test4";
}
==============================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
<h2>환영합니다. 처음으로 오셨네요</h2>
${msg }
<form action="test4" method="POST">
아디 : <input type="text" name="id">
비번 : <input type="text" name="pw">
나이 : <input type="number" name="age">
<input type="submit">
</form>
</body>
</html>
//
home 요청이 왔다.
어떤 작업을 했습니다.
User [id=안녕, pw=1234, age=26]