[Spring] SpringMVC 기능들

###XML로 세팅하기

Dispatcher서블릿이 가진 변수에 이 값을 집어넣겠다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee                       
						http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">

	<!-- 현재 웹 애플리케이션에서 받아들이는 모든 요청에 대해 appServlet이라는 이름으로 정의되어 있는 서블릿을 사용하겠다. -->
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	<!-- 요청 정보를 분석해서 컨트롤러를 선택하는 서블릿을 지정한다. -->
	<servlet>
        <servlet-name>appServlet</servlet-name>
        <!-- Spring MVC에서 제공하고 있는 기본 서블릿을 지정한다. -->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- Spring MVC 설정을 위한 xml 파일을 지정한다. -->
        <init-param>
        	<param-name>contextConfigLocation</param-name>
        	<param-value>/WEB-INF/config/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Bean을 정의할 xml 파일을 지정한다. -->
    <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>/WEB-INF/config/root-context.xml</param-value>
      <!-- 이 파일을 읽어들였다-->
    </context-param>

    <!-- 리스너설정 -->
    <listener>
    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 파라미터 인코딩 필터 설정 -->
    <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>
    	<init-param>
    		<param-name>forceEncoding</param-name>
    		<param-value>true</param-value>
    	</init-param>
    </filter>

    <filter-mapping>
    	<filter-name>encodingFilter</filter-name>
    	<url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>



URL MAPPING

20210610_231942

이게 context-path다.

Servlet/JSP URL 주소
  • 사용자가 서버에 접속해서 서비스를 받기 위해 입력하는 주소를 URL이라고 부릅니다.
  • URL 주소는 여러 의미를 가지고 있는 값들로 구성됩니다.
  • 프로토콜://도메인주소(IP):포트번호/경로1/경로2/경로3/
URL 주소
  • 프로토콜 : 서버와 클라이언트간의 통신을 위한 약속입니다. (생략 시 http)

  • 도메인 주소(IP 주소) : IP 주소는 같은 네트워크 망에서 컴퓨터를 구분하기 위해 제공되는 숫자로 구성된 고유 주소입니다. 인터넷 망에 연결된 컴퓨터는 전 세계에서 유일한 주소를 할당 받고 공유기 등에 연결된 컴퓨터는 공유기안에서 유일한 주소를 할당 받습니다. 그러나 숫자는 사람이 외우기 어려워 도메인 주소라는걸 만들어 제공합니다. 도메인 주소는 IP주소로 변환되어 컴퓨터를 찾을 수 있도록 합니다.

  • 포트번호 : 1부터 65535번까지로 구성된 숫자입니다. 컴퓨터내에서 프로그램을 구분하기 위해 사용합니다. (생략시 80)

  • 경로1/경로2/경로3… : 여기서 부터는 서버 혹은 개발 방식이나 분야에 따라 다르게 해석됩니다. Servlet/JSP 에서는 첫번째 경로는 Context Path라고 부릅니다. 하나의 서버에서 각 웹 애플리케이션을 구분하기 위해 지정되는 이름이며 폴더의 이름이 Context Path가 됩니다. 그 이후 경로는 하위 경로가 됩니다.

  • Spring MVC에서는 Context Path 다음에 나오는 주소는 실제 물리적인 경로와 다르게 지정할 수 있습니다.

@Controller
public class Test1Controller {
	@RequestMapping(value = "/test1", method = RequestMethod.GET)
	public String test1() {
	return "test1";
	}
}

  • 하위경로
@Controller
public class Sub1Controller {
	@RequestMapping(value = "/sub1/test3", method = RequestMethod.GET)
	public String test3() {
		return "sub1/test3";
	}
	@RequestMapping(value = "/sub1/test4", method = RequestMethod.GET)
	public String test4() {
		return "sub1/test4";
	}
}


RequestMapping 어노테이션으로 요청 주소 처리가 가능합니다.


요청 방식 지정하기

  • Spring MVC 는 요청 주소별로 메서드를 정의할 수도 있지만 같은 요청 주소에서 요청 방식에 따라 메서드를 정의할 수도 있습니다.
  • GET, POST, PUT, DELELTE, PATCH 에 대해 처리할 수 있습니다.

@RequestMapping

  • RequestMapping 어노테이션은 요청 주소 셋팅 뿐만 아니라 요청 방식도 설정할 수 있습니다.

@RequestMapping(value = "/test1", method = RequestMethod.GET)
public String test1() {
	return "test1";
}

요청 어노테이션

RequestMapping 대신 요청별로 제공되는 어노테이션을 사용할 수도 있습니다.

RequestMapping은 요청 방식들을 동시에 설정할 수 있습니다.

@RequestMapping(value = "/test7", method = {RequestMethod.GET, RequestMethod.POST})
public String test7() {
	return "test7";
}


파라미터 추출하기

  • 클라이언트 요청 발생 시 전달하는 파라미터 데이터를 손쉽게 주입 받을 수 있도록 다양한 방식을 제공하고 있습니다.
  • Spring MVC는 Servlet/JSP 처럼 요청 방식에 따라 파라미터 추출하는 방식이 달라지지는 않습니다.

HttpServletRequest 사용하기

  • Spring MVC 는 필요한 객체나 데이터는 주입을 받아 사용하게 됩니다.
  • Servlet / JSP에서 파라미터 데이터를 추출할 때 HttpServletRequest 객체를 통하게 되는데 Spring MVC에서 이 객체를 주입 받아 사용할 수 있습니다.
  • 파라미터 추출 뿐만 아니라 HttpServletRequest 객체가 필요할 경우 사용하면 됩니다
@GetMapping("/test1")
public String test1(HttpServletRequest request) {

String data1 = request.getParameter("data1");
String data2 = request.getParameter("data2");
String [] data3 = request.getParameterValues("data3");

… 생략
}

WebRequest 사용하기

  • WebRequest는 HttpServletRequest 클래스를 확장한 클래스입니다.

PathVariable

  • 데이터가 요청 주소에 있을 경우 값을 주입 받을 수 있는 어노테이션입니다.
  • Restful API 서버 프로그래밍시 많이 사용하는 방식입니다.
  • 요청주소/값1/값2/값3

@RequestParam

  • 파라미터 데이터를 직접 주입 받을 수 있습니다. 지정된 변수의 이름과 파라미터의 이름이 같을 경우 값을 주입 받습니다.
  • 가능한 경우 형 변환도 처리해줍니다.
  • value : 파라미터의 이름과 변수의 이름이 다를 경우 파라미터 이름을 지정합니다.
  • required : false를 설정하면 지정된 이름의 파라미터가 없을 경우 null이 주입됩니다.

Map으로 주입받기

  • 클라이언트가 전달 하는 모든 파라미터 데이터를 한번에 Map으로 받을 수 있습니다.
  • 단 동일 명으로 전달되는 2개 이상의 파라미터는 하나만 담기게 됩니다.
  • 동일 명으로 전달되는 파라미터가 2개 이상이라면 List로 주입 받아야 합니다.
public String test1(@RequestParam Map<String, String> map,
		  @RequestParam List<String> data3) {

}


@ModelAttribute

  • ModelAttribute 어노테이션을 사용하면 파라미터를 객체로 주입받을 수 있습니다.
  • 전달되는 파라미터의 이름과 동일한 프로퍼티에 자동으로 주입됩니다.
  • 이 어노테이션은 생략이 가능합니다.
  • 이러한 객체를 커맨드 객체(Command Object)라고 부릅니다.

ViewResolver

20210611_093655

  • 컨트롤러에서 전달 받은 View의 이름을 토대로 jsp를 찾아 선택하고 jsp 데이터를 분석해 응답결과를 만들어 전달하는 요소 입니다.
  • 본 과정에서는 ViewResolver가 사용할 View의 이름을 지정하는 방법과 jsp 를 통해 응답 결과를 만들 때 필요한 데이터를 전달하는 방법에 대해 살펴봅니다.

HttpServletRequest

  • Spring MVC는 jsp 를 처리할 때 HttpServletRequest 객체를 jsp 쪽으로 전달합니다.
  • ViewResolver는 이를 이용해 JSP 작업시 데이터를 사용할 수 있습니다.

커맨드 객체

  • 클라이언트가 전달해 주는 파라미터 데이터를 주입 받기 위해 사용하는 객체
@PostMapping("/test1")
public String test1(@ModelAttribute DataBean bean) {
	return "test1";
}

Request를 통해 전달

  • 커맨드 객체는 HttpServletRequest 객체에 자동으로 담기고 jsp로 전달됩니다. 이 때, HttpServletRequest 객체에 저장되는 이름은 클래스의 이름으로 결정됩니다.
  • 커맨드 객체는 HttpServletRequest 객체에 자동으로 담기고 jsp로 전달됩니다. 이 때, HttpServletRequest 객체에 저장되는 이름은 클래스의 이름으로 결정됩니다.

Form 태그

  • Spring에서는 형태로 되어있는 커스텀 태그를 제공하고 있습니다.
  • Form 커스텀 태그를 활용하면 Model 객체에 들어있는 값을 form 요소에 주입 시킬 수 있습니다.
  • 회원 정보 수정 등 정보 수정페이지를 구성할 때 요긴하게 사용할 수 있습니다.

커스템 태그 URI 설정

<%@taglib prefix='form' uri="http://www.springframework.org/tags/form" %>
  • <form:> 커스텀 태그를 이용하면 Model 객체와 유기적으로 동작할 수 있습니다.

태그

  • 태그를 생성합니다.
  • modelAttribute : form 태그 내의 입력 요소들에 적용될 value 값을 가진 객체 이름. 이 속성의 값이 id 속성으로 설정됩니다. 생략 시 command라는 문자열이 id로 설정됩니다.
  • action : 요청할 주소를 설정합니다. 생략 시 현재 페이지가 설정됩니다.
  • method : 요청 방식을 설정합니다. 생략 시 post로 설정됩니다.

태그

  • Submit 버튼을 생성합니다.
  • disabled : true를 셋팅해주면 버튼을 누를 수 없도록 비활성화 됩니다.

태그

  • Hidden 타입의 input 태그를 생성합니다.
  • path : 설정한 문자열은 id와 name 속성으로 지정되며 model의 값을 추출해 value 속성에 주입합니다.

태그

  • text 타입의 input 태그를 생성합니다.
  • path : 설정한 문자열은 id와 name 속성으로 지정되며 model의 값을 추출해 value 속성에 주입합니다.

태그

  • password 타입의 input 태그를 생성합니다.
  • path : 설정한 문자열은 id와 name 속성으로 지정되며 - model의 값을 추출해 value 속성에 주입합니다. showPassword : 셋팅될 값의 이름을 지정하더라도 값이 셋팅되지 않는데 이 속성에 true를 넣어주면 값이 셋팅됩니다.

select, checkbox, radio

  • Spring에서 제공하는 form custom tag를 이용하면 select, checkbox, radio button 등을 유동적으로 생성하여 사용할 수 있습니다.

  • select 태그를 생성합니다. path : 설정한 문자열은 id와 name 속성으로 지정되며 model의 값을 추출해 값과 동일한 value 속성의 option 태그를 선택합니다.

,

  • : select 태그의 option 태그 하나를 생성합니다.
: select 태그의 option들을 생성합니다. items : option 태그들을 생성할 때 필요한 데이터가 담긴 list나 배열 #### , - : checkbox 하나를 생성합니다. - : checkbox 들을 생성합니다. - items : checkbox들을 생성하기 위해 필요한 정보가 담겨있는 list나 배열 #### , - : radiobutton 하나를 생성합니다. - : radiobutton 들을 생성합니다. - items : radiobutton들을 생성하기 위해 필요한 정보가 담겨있는 list나 배열 ----------- ### 코드의 흐름 - 웹 애플리케이션은 브라우저가 서버에 요청을 하면 요청 정보를 분석하고 응답 결과를 생성하여 브라우저로 전달하는 과정을 거칩니다. - 여기에서 서버의 동작은 어떤 분야를 가지고 개발을 하느냐에 따라 달라지게 됩니다. - Spring MVC는 요청이 발생되면 요청 주소를 분석하여 그와 매핑되어 있는 메서드를 호출하고 메서드가 반환하는 정보를 토대로 응답결과를 생성하여 클라이언트에게 전달합니다. ### 메서드의 리턴 - Controller를 통해 요청 주소와 매핑되어 있는 메서드는 반드시 무언가를 반환해야 합니다. 우리는 지금까지 문자열, Model, ModelAndView 를 반환해 보았습니다. - 이들은 모두 브라우저에게 전달할 응답결과를 생성하기 위한 JSP를 지정하는 부분입니다. - 이 밖에도 다양한 정보를 반환할 수 있으며 이를 토대로 동작을 제어할 수 있습니다. ### Redirect - Redirect는 서버가 클라이언트에게 요청할 주소를 응답결과로 전달하는 것을 의미합니다. - 클라이언트는 응답결과로 받은 요청주소를 직접 요청하게 됩니다. - 브라우저가 요청하는 것이므로 주소창의 주소는 변경됩니다. - Redirect는 새로운 요청이 발생하는 것이므로 HttpServletRequest 객체는 소멸 후 새롭게 생성되며 HttpSession 객체는 그대로 유지됩니다. ### forward - 코드의 흐름을 서버상에서만 이동하는 것을 의미합니다. - 브라우저는 다른 곳으로 흐름이 이동되었다는 것을 알 수 없기 때문에 주소창의 주소는 변경되지 않습니다. - HttpServletRequest, HttpSession 모두 유지됩니다. ##### Redirect : 클라이언트에게 새로운 페이지 요청을 응답결과로 전달합니다. ##### Forward : 서버상에서 코드의 흐름이 이동됩니다. ----- ### Request - 브라우저에 의해 새로운 요청이 발생하면 브라우저는 서버에 요청에 관련된 정보를 전송하게 됩니다. - 이를 받은 서버는 브라우저가 보낸 요청 정보들을 보관하기 위해 HttpServletRequest 객체를 생성해 요청 정보들을 담아 두게 됩니다. - 요청 정보가 담겨 있는 HttpServletRequest 객체는 응답결과가 브라우저로 전송될 때까지 유지되며 사용이 가능합니다 ### RequestScope - 새로운 요청이 발생해 응답결과가 브라우저로 전달 될 때 까지 요청 정보가 담겨 있는 Request 객체를 사용할 수 있습니다. - 이러한 사용 범위를 RequestScope라고 부릅니다. - HttpServletRequest 객체에는 서버 개발자가 필요에 의해 데이터나 객체를 저장할 수 있고 RequestScope 내에서 사용이 가능합니다. ##### Request 영역에 데이터를 저장하게 되면 RequestScope 내에서 사용이 가능합니다 ---- ### 빈 주입 - @Autowired 를 활용하여 Bean을 자동으로 주입 받을 수 있었습니다. - 스프링 코어에서 prototype과 singleton이 있었습니다. - Spring MVC에서는 추가로 request, session, application을 제공하고 있습니다. ---- ### Request scope - Bean을 정의할 때 request scope로 정의하면 요청이 발생할 때 마다 Bean 객체가 생성되어 자동으로 주입됩니다. - 주입된 Bean은 요청 발생시 주입만 이루어지는 것이므로 request 영역에 저장되지는 않습니다. - Xml로 bean을 설정하고 byName으로 주입 받았을 경우에만 request 영역에 자동 저장됩니다. - Java 방식은 @RequestScope 를 사용합니다. - XML 방식은 bean을 정의할 때 scope=“request”로 설정합니다. Bean을 정의할 때 scope를 request로 설정하면 요청이 발생할 때 마다 새로운 bean이 주입됩니다. ------ ### Session - 브라우저가 최초로 서버에 요청을 하게 되면 브라우저당 하나씩 메모리 공간을 서버에서 할당하게 됩니다. - 이 메모리 영역은 브라우저당 하나씩 지정되며 요청이 새롭게 발생하더라도 같은 메모리 공간을 사용하게 됩니다. 이러한 공간을 session 이라고 부릅니다. - 이 영역은 브라우저를 종료할 때 까지 서버에서 사용할 수 있습니다. - 브라우저가 최초의 요청을 발생 시키고 브라우저를 닫을 때 까지를 SessionScope라고 부릅니다. - SessionScope 에서는 session 영역에 저장되어 있는 데이터나 객체를 자유롭게 사용할 수 있습니다. --------- ### Session scope - Bean을 정의할 때 session scope로 정의하면 브라우저가 서버에 최초의 요청을 보낼 때 Bean 객체가 주입됩니다. - 주입된 Bean은 주입만 이루어지는 것이므로 session 영역에 저장되지는 않습니다. - Java 방식은 @SessionScope 를 사용합니다. - XML 방식은 bean을 정의할 때 scope=“session”으로 설정합니다. ##### Bean을 정의할 때 scope를 session으로 설정하면 최초의 요청이 발생할 때 새로운 bean이 주입됩니다. ----- ### Application Scope - 서버가 가동될 때부터 서버가 종료되는 시점까지의 범위를 Application Scope라고 부릅니다. - Application Scope 동안 사용할 수 있는 메모리 영역이 만들어지며 ServletContext라는 클래스 타입의 객체로 관리됩니다. - ServletContext에 저장된 데이터나 객체는 서버가 종료되기 전까지 서버는 웹브라우저에 관계없이 동일한 메모리 공간을 사용하게 됩니다. ### ServletContext - HttpServletRequest 객체로 부터 추출이 가능합니다. - Controller에서 주입 받을 수 있습니다. ##### ServletContext 객체에 데이터나 객체를 담으면 서버가 종료될 때 까지 사용할 수 있습니다. ----- ### Application scope Bean을 정의할 때 application scope로 정의하면 서버가 가동될 때 자동으로 주입됩니다. 주입된 Bean은 주입만 이루어지는 것이므로 application 영역에 저장되지는 않습니다. 서버가 가동될 때 자동 주입 되는 것이므로 @Lazy를 설정하지 않아도 됩니다 Java 방식은 @ApplicationScope 를 사용합니다. XML 방식은 bean을 정의할 때 scope=“application”으로 설정합니다. ------- ### Cookie - 사용자 웹 브라우저에 저장되는 데이터입니다. - 요청이 발생했을 때 웹 브라우저는 쿠키에 저장된 정보를 서버에 전달하게 됩니다. - 만약 응답 결과로 쿠키 정보가 전달되면 웹 브라우저가 쿠키에 저장하게 됩니다. - 쿠키는 사용자 브라우저에 저장되는 것이므로 브라우저가 전달 해 줄 때만 쿠키 정보를 사용할 수 있습니다. #### Cookie 저장 - 서버측 코드로 쿠키에 데이터를 저장할 수 있는 방법은 없습니다. 브라우저로 보낼 응답 결과에 저장할 쿠키 정보를 담아 보내면 브라우저에 의해 쿠키가 저장됩니다. Spring MVC에서 쿠키 저장은 Servlet/JSP에서 사용하는 방법으로 처리합니다. ----- ### Properties - 애플리케이션을 개발할 때 프로그램 실행 중 절대 변하지 않는 값들이 있을 수 있습니다. - Spring MVC에서는 이러한 값들을 properties 파일에 작성하고 이를 가져다 사용할 수 있도록 제공되고 있습니다. ### @PropertySource, @PropertySources - 사용할 properties 파일을 지정합니다. - 하나 혹은 다수의 파일을 지정할 수 있습니다. ``` @PropertySources({ @PropertySource("/WEB-INF/properties/data1.properties"), @PropertySource("/WEB-INF/properties/data2.properties") }) ``` #### @Value - properties 파일에 작성한 값을 주입 받을 수 있습니다. ``` @Value("${aaa.a1}") private int a1; @Value("${aaa.a2}") private String a2; ``` #### Propery Editor - Properties 파일에 한글을 작성하면 유니코드 형식의 문자열로 변경됩니다. - 이는 Property Editor 설치로 해결할 수 있습니다. - http://propedit.sourceforge.jp/eclipse/updates ------------ ### Properties - 이전 시간에 살펴본 Properties를 활용하면 다양한 값들을 미리 정의 해놓고 이를 가져다 사용할 수 있었습니다. - Properties에 작성한 값을 JSP에서 사용하고자 한다면 몇 가지 설정이 필요합니다. ### Message - Properties 파일을 Message로 등록하면 이 데이터는 JSP에서도 사용할 수 있습니다. - Properties 파일을 Message로 등록하면 다국어 처리가 가능해집니다. #### MessageSource - MessageSource 객체를 이용해 properties 파일을 등록해주면 Message로 등록할 수 있습니다. - 여기에서는 일정 시간마다 한번씩 갱신되는 ReloadableResourceBundleMessageSource를 사용합니다. #### Java에서 사용하기 - Message로 등록된 데이터를 Java 코드에서 사용하고자 한다면 MessageSource를 주입 받아 사용하면 됩니다. - 이 때, Locale을 지정하면 다국어 처리가 가능합니다. ##### Properties 파일을 Message로 등록하게 되면 JSP에서도 사용할 수 있으며 다국어 처리도 가능해 집니다. ---------




© 2021.03. by yacho

Powered by github