공부방

Spring Web MVC 본문

스프링

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]

 

'스프링' 카테고리의 다른 글

MyBatis  (0) 2023.04.19
File Upload&File Download  (0) 2023.04.18
Interceptor  (0) 2023.04.17
Spring AOP  (0) 2023.04.12
스프링 기초  (0) 2023.04.11