프로그래밍

Spring MVC 공부(3)

RainIron 2022. 5. 18. 23:46
반응형

※ 동작방식

  • DispatcherServlet

- Servlet/JSP에서 사용자 요청이 발생하면 정보를 해석하고, 개발자가 만든 코드를 동작시키는 첫 번째 서블릿

- Spring MVC는 DispatcherServlet을 확대하여 Spring이 가진 기능을 사용하도록 클래스 재정의함


  • SpringMVC 프로젝트 환경 조성

1. Dynamic Web Project 생성

 

2. Maven Project로 변경

[프로젝트 오른쪽 버튼 클릭] - [Configure] - [Convert to Maven Project]

 

3. Building 후, 라이브러리 설정(pom.xml)

 

cf) Building -> ctrl+shift+enter

cf) Line 정리 단축키 -> ctrl+shift+f

cf) 자동완성 -> ctrl+space bar

 

<!-- 라이브러리 버전 관리 -->
<properties>

</properties>
<!-- 라이브러리 셋팅 -->
<dependencies>

</dependencies>

cf) properties: 버전 관리 / dependencies: 라이브러리 세팅

 

<dependencies> 안에 라이브러리를 찾아서 넣어주자

 

1) servlet-api

https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api

 

Maven Repository: javax.servlet » javax.servlet-api

Professional Java Data: RDBMS, JDBC, SQLJ, OODBMS, JNDI, LDAP, Servlets, JSP, WAP, XML, EJBs, CMP2.0, JDO, Transactions, Performance, Scalability, Object and Data Modeling (2001)by Carl Calvert Bettis, Michael Bogovich, Sean Rhody, Mark Wilcox, Kelly Lin P

mvnrepository.com

버전에 맞게 찾은 후, 삽입!

그리고 프로젝트 버전에 맞게 하기 위해 아래와 같이 수정한다.

<!-- 라이브러리 버전 관리 -->
<properties>
	<!-- dependency의 버전을 참조할 수 있게 설정 -->
    <javax.servlet-version>4.0.1</javax.servlet-version>
    
</properties>

<!-- 라이브러리 셋팅 -->
<dependencies>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>${javax.servlet-version}</version>
        <scope>provided</scope>
    </dependency>

</dependencies>

2) jsp-api

3) jstl

4) spring web mvc

3개의 라이브러리도 같은 방식으로 하면 되는데, jstl의 경우 dependency에서 오류가 발생하므로

javax.servlet으로 groupID를 변경해주자

 

위의 라이브러리 포함된 코드

<!-- 라이브러리 버전 관리 -->
<properties>
    <javax.servlet-version>4.0.1</javax.servlet-version>
    <javax.servlet.jsp-version>2.3.3</javax.servlet.jsp-version>
    <javax.servlet.jsp.jstl-version>1.2</javax.servlet.jsp.jstl-version>
    <org.springframework-version>5.3.20</org.springframework-version>
</properties>
<!-- 라이브러리 셋팅 -->
<dependencies>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>${javax.servlet-version}</version>
        <scope>provided</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>${javax.servlet.jsp-version}</version>
        <scope>provided</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>${javax.servlet.jsp.jstl-version}</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>

</dependencies>

제대로 된 건지 확인하려면, 왼쪽 Maven Dependencies 리스트 확인하면 된다.

4. web.xml 수정 / servlet-context.xml 생성

- web.xml: DispatcherServlet 클래스를 Spring에서 제공하는 클래스로 설정

<!-- 현재 웹 애플리케이션에서 받아들이는 모든 요청에 대해 appServlet이라는 이름으로
	     정의되어있는 서블릿을 사용한다. -->
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

- ApplicationContext 설정: Spring MVC로 만든 웹 애플리케이션에 대한 설정

<!-- 요청 정보를 분석해서 컨트롤러를 선택하는 서블릿을 지정한다. -->
<!-- ApplicationContext 설정: Spring MVC로 만든 웹 애플리케이션에 대한 설정 -->
<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>

- RootContext 파일 설정: Spring MVC 프로젝트 수행 시 사용할 Bean들을 정의

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

<!-- 리스터 설정(사용자 요청을 발생하면 사용자 정보를 이용해 Bean을 로딩) -->
<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 형식이 아래와 같을 때 filter를 거치게 한다. -->
    <url-pattern>/*</url-pattern>
</filter-mapping>

[root-context.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.xsd">
</beans>

[servlet-context.xml]

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:beans="http://www.springframework.org/schema/beans"
		xmlns:context="http://www.springframework.org/schema/context"
		xsi:schemaLocation="http://www.springframework.org/schema/mvc
							http://www.springframework.org/schema/mvc/spring-mvc.xsd
							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.xsd
							">
	<!-- 스캔한 패키지 내부의 클래스 중 Controller Annotation을 가지고 있는 클래스들을
			Controller로 로딩하도록 한다. -->
	<annotation-driven/>
	
	<!-- 스캔한 bean들이 모여있는 패키지를 지정한다. -->
	<context:component-scan base-package="kr.co.controller"/>
</beans:beans>

5. Controller 설정

package kr.co.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {

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

url 패턴에 따라 콘솔창에 출력되는 내용을 확인할 수 있다.

 


6. jsp 설정

- index.jsp

<%@ 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>
	<h1>Hello Spring MVC</h1>
</body>
</html>

위의 Controller에서 home() 메서드의 리턴값을 jsp 파일을 가리키게 만든다.

@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home() {
		System.out.println("home");
		return "/WEB-INF/views/index.jsp";
	}

실행하면 뜬다!!!

리턴값으로 나오는 문자열의 prefix와 suffix를 xml로 설정해줄 수 있다.

servlet-context.xml에 추가!

<!-- Controller의 메서드에서 반환하는 문자열 앞 뒤에 붙일 경로 정보를 세팅한다. -->
<beans:bean class ="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/"/>
    <beans:property name="suffix" value=".jsp"/>
</beans:bean>

7. 정적 경로 설정

[servlet-context.xml] 추가

<!-- 정적파일(이미지, 소리, 동영상, js, css 등) 경로 세팅 -->
<resources mapping="/*" location="/resources/"/>

폴더 위치 생성 후, 이미지 복사하여 지정

파일 위치는 다음과 같다
이미지 출력까지 성공


* Java로 세팅

- web.xml -> AbstractAnnotationConfigDispatcherServletInitalizer 상속 or WebApplicationInitializer 인터페이스 구현

- root-context.xml -> 상속 없음

- servlet-context.xml -> WebMvcConfigurer 인터페이스 구현

반응형

'프로그래밍' 카테고리의 다른 글

Spring MVC 공부(5)  (0) 2022.05.28
Spring MVC 공부(4)  (0) 2022.05.28
Spring MVC 공부(2)  (0) 2022.05.05
Spring MVC 공부(1)  (0) 2022.05.01
SW 업그레이드에 따른 변경점  (0) 2022.04.04