tomcat 9.0.3, sts 4.9.0 ๋ค์ด๋ก๋
sts ์คํ ํ perspective Java EE๋ก ์ค์
Java EE๊ฐ ์์ ๋๋ Help > Install New Software > work with์ http://download.eclipse.org/releases/2020-12
> web,xml,java ee and OSGi Enterprise Develoment ์ค์น
Create a Maven project - Create a simple project ์ ํ
ํ๋ก์ ํธ๊ฐ ์ด๋ฆฌ๋ฉด pom.xml์ ๋นจ๊ฐ์ค์ด ๋จ๋๋ฐ, web.xml์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
src - main - webapp ์์ ํฐ์บฃ ๋๋ ํ ๋ฆฌ ์ ROOT - WEB-INF(์์ web.xml ํ์ผ ์์)๋ฅผ ๋ณต์ฌํด ์์ ๋ถ์ธ๋ค.
pom.xml์ Overview์์ Packaging์ war์ผ๋ก ๋ฐ๊พธ๊ณ Properties๋ฅผ ์ค์ ํ๋ค.
์ ์ฅํ๊ณ ๋ฉ์ด๋ธ ์ ๋ฐ์ดํธ๋ฅผ ํ๋ฉด ์์ค์ properties ํ๊ทธ๊ฐ ์ถ๊ฐ๋์ด ์์์ ํ์ธํ ์ ์๋ค.
pom.xml
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด Maven Repository ์ ์, tomcat-api 9.0.30๊ณผ spring-webmvc 5.2.9๋ฅผ pom.xml์ ์ถ๊ฐํ๋ค.
Maven Repository์ ์ ์ํ์ง ์๊ณ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๋ ์๋ค.
Show View์์ Maven - Maven Repositories ์ ํ, Global Repositories - central ์ฐํด๋ฆญ - Rebuild Indexํ๋ฉด ์๊ฒฉ์ ์๋ Repository๋ค์ ์ธ๋ฑ์ฑํด์ sts ์์์ ๊ฒ์ํด์ ์ธ ์ ์๋ค. ์๊ฒฉ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ๊ณผ์ ์ด๋ฉฐ, ์ธ๋ฑ์ฑ์ ํ ํ์๋ pom.xml์ Dependencies ํญ์์ Add๋ฅผ ๋๋ฌ ๊ฒ์ํด์ ์ถ๊ฐํ๋ฉด ๋๋ค. (์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ฏ๋ก ์ด ๊ณผ์ ์ ์คํตํ๋ค. ์ต์ ํ ์๊ฐ ์ด์ ์์)
Java Resources ์์ ๋ฉ์ด๋ธ ๋ํ๋์๋ฅผ ํผ์ณ๋ณด๋ฉด ์ง์ ์ถ๊ฐํ tomcat-api, spring-webmvc ์ธ์๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์ถ๊ฐ๋์์์ ํ์ธํ ์ ์๋ค. ๋ฉ์ด๋ธ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ฉด์ ํ์ํ๋ค๊ณ ํ๋จํ ์๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ์ด๋ค. (=>๋ฉ์ด๋ธ์ ์ฅ์ )
Dependency Hierarchy ํญ์์ ์๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ธํ ์ ์๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ ์ญํ ์ ํ ์๋ธ๋ฆฟ ํด๋์ค์ธ DispatcherServlet์ ์ฌ์ฉํ๊ธฐ ์ํด DispatcherServlet.class ์ฐํด๋ฆญ - Copy Qualified Name ๋๋ฅด๋ฉด ํจํค์ง๋ช ๊ณผ ํด๋์ค์ ์ด๋ฆ์ด ๋ณต์ฌ๋๋ค.
web.xml
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
web.xml์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค. servlet-class์๋ ๋ณต์ฌํ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ํจํค์ง์ ํด๋์ค ์ด๋ฆ์ ์จ์ฃผ๊ณ , ๋ชจ๋ ์์ฒญ์ ๋ค ๋ฐ๊ธฐ ์ํด url-pattern์ "/"์ผ๋ก ์ค์ ํ๋ค.
index.jsp(webapp ํด๋ ์)
<%@ 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>hi ${data }</h1>
</body>
</html>
${data} ๊ฐ์ ์๊ธฐ ๋๋ฌธ์ ์ฐฝ์๋ hi๋ง ๋ํ๋๋ค.
web.xml์ <url-pattern>์ "/*"์ผ๋ก ์์ ํ๊ณ ์คํํ๋ฉด 500 ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. WEB-INF ์์ dispatcher-servlet.xml ํ์ผ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
(์ฌ๊ธฐ์ dispatcher๋ web.xml์์ ์ค์ ํ ์๋ธ๋ฆฟ ๋ค์์ ์๋ฏธํ๋ฉฐ, -servlet์ ์์ฝ์ด์ด๋ค.)
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๋ชจ๋ ์์ฒญ์ ๋ฐ์ ํ WEB-INF ์์ *-servlet.xml์์ ๋งคํ๋ ์ ๋ณด์ ๋ฐ๋ผ ๋ฐฐ๋ถํ๋๋ฐ, ์ด ์ค์ ์ด ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋๋ ๊ฒ์ด๋ค.
url-pattern์ "/"์ผ๋ก ์ ์ํ๋ ๊ฒ์ ๋ํดํธ ์๋ธ๋ฆฟ์ ์๋ฏธํ๋ค. ๋ํดํธ ์๋ธ๋ฆฟ์ ์๋ธ๋ฆฟ ๋งคํ url์ ๊ฑธ๋ฆฌ์ง ์์ ๋ชจ๋ ์์ฒญ๋ค์ ์ฒ๋ฆฌํ๋ค. ์ฆ, ๋งคํ ์ ๋ณด๊ฐ ์๋ ๊ฒ์ ๊ทธ์ ๋ฐ๋ผ ๋ฐฐ๋ถํ ํ ๋งคํ์ด ๋์ง ์์ ๋จ์ ๊ฒ๋ค์ ๋ชจ๋ ์ฒ๋ฆฌํ๋ค๋ ๋ป์ด๋ค. ๊ทธ๋์ "/"์ผ๋ก ์ ์ํ์ ๋๋ ๋งคํ ์ ๋ณด๊ฐ ์์ด๋ ์๋ฌ๊ฐ ๋์ง ์๊ณ ์ ์์ ์ผ๋ก ์คํ๋ ๊ฒ์ด๋ค.
(์ฐธ๊ณ . multifrontgarden.tistory.com/145)
๋งคํ ์ค์ ์ ํ๊ธฐ ์ํด WEB-INF ์์ dispatcher-servlet.xml ํ์ผ์ ์์ฑํ๋ค. xml ํ์ผ์ ๋ด์ฉ์ ์์ฑํ๊ธฐ ์ํด https://docs.spring.io/spring-framework/docs/ ์ ์ ์ -> 5.2.x -> spring-framework-reference -> Core ํด๋ฆญ -> beans ํ๊ทธ ๋ณต์ฌํด์ ๋ถ์ธ๋ค.
dispatcher-servlet.xml
<!-- spring mvc์์๋ id์ url์ ์ ๋๋ค. -->
<!-- index๋ผ๋ ์์ฒญ์ด ์์ ๋ ์ปจํ
์ด๋์์ class๋ฅผ ๊บผ๋ธ๋ค. -->
<bean id="/index" class="com.newlecture.web.controller.IndexController">
</bean>
์ปจํธ๋กค๋ฌ ์ธํฐํ์ด์ค๋ฅผ ์์ํด์ ์ฌ์ฉํ ๋ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ handelRequest ๋ฉ์๋๊ฐ ์๋ค. IndexController์์ ์ถ๊ฐํด์ค๋ค.
IndexController.java
public class IndexController implements Controller{
//Controller๋ฅผ ์์ํ ๋ ๋ฐ๋์ ์์ด์ผ ํ๋ handleRequest
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("index controller");
ModelAndView mv = new ModelAndView();
mv.addObject("data", "Hello Spring MVC"); //view(index.jsp)์์ ์ถ๋ ฅํ data๋ฅผ ๋ด๋๋ค
mv.setViewName("index.jsp");
return mv;
}
}
ModelAndView๋ฅผ ์ฌ์ฉํ์ฌ data ๊ฐ์ฒด๋ฅผ addObjectํ๊ณ , ์คํํ jsp๋ฅผ setViewName์ ํตํด ๋ด๋๋ค. IndexController์์ ์คํํ๋ค.
ํ์ด์ง๋ฅผ ์ฐพ์ ์ ์๋ 404 ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ฃผ์์ฐฝ์ ๋ณด๋ฉด ๋งคํ๋ url ์ ๋ณด๊ฐ ์๋ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์์ฒญ๋๊ณ ์๋ค. http://localhost:8787/webprj/index ์ผ๋ก ์์ฒญ๋์ด์ผ ํ๋ค.
์ฃผ์์ฐฝ์ ๊ฒฝ๋ก๋ฅผ http://localhost:8787/webprj/index์ผ๋ก ๋ฐ๊ฟ๋ ๊ฐ์ ์๋ฌ๊ฐ ๋๋ค. ํ์ง๋ง System.out.println();์ผ๋ก ์ถ๋ ฅํ "index controller"๋ ์ฝ์์ฐฝ์ ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ค์ ๋งํด, /index๋ผ๋ ์์ฒญ์ด ๋ค์ด์์ ๋ IndexController๊น์ง ์ ์์ ์ผ๋ก ๋งคํ์ด ๋์๊ณ , handleRequest ๋ฉ์๋๊ฐ ์คํ๋์์ง๋ง ModelAndView์ผ๋ก ์ธํ ํ index.jsp๋ฅผ ์ฐพ์๊ฐ๋ ๊ฒ์์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค๋ ๋ป์ด๋ค. (=>ํฌ์๋๋ก ์์ฒญํ mv.setViewName("index.jsp");์์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.)
์๋ฌ๊ฐ ๋๋ ์ด์ ๋, web.xml์์ url-pattern์ด "/*"์ผ๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ์คํํ์ ๋ index๋ผ๋ ์์ฒญ์ ๋ฐ์ ๊ทธ ์์ฒญ์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐ์ dispatcher-servlet.xml์ ๋ช ์๋ bean์ ๋งคํ์ผ๋ก IndexController์ ์ ๋ฌํ์ฌ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๋ค. ํ์ง๋ง mv.setViewName์์ index.jsp๋ผ๋ ๊ฒฝ๋ก๋ฅผ ์์ฒญํ์๊ณ , ๊ทธ ๋ ๋ค์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ก ๊ฐ๊ฒ ๋๋๋ฐ index.jsp๋ผ๋ ์์ฒญ์ ๋งคํ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋๋ ๊ฒ์ด๋ค. ์๋ฌ๊ฐ ๋์ง ์๊ฒ ํ๋ ค๋ฉด dispatcher-servlet.xml์ <bean id="/index.jsp" .... > ์ค์ ์ ํด์ผํ๋ค๋ ๊ฑด๋ฐ, ๊ทธ๊ฒ๋ณด๋ค๋ web.xml์ url-pattern์ "/"์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ํธ์ด ์ข๋ค.
"/"์ผ๋ก ์ค์ ํ๋๋ผ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ฑฐ์ณ์ ์์ฒญ์ ๋ง๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์๋ณด์ง๋ง, ๋งคํ๋ ์ปจํธ๋กค๋ฌ๊ฐ ์์ ๊ฒฝ์ฐ์๋ ์ง์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ mv.setViewName("index.jsp");์ ์์ฒญ๋ ๋๋ก ์ฐพ์๊ฐ ์ ์๊ฒ ๋๋ค.
* View ํ์ด์ง๋ฅผ ์ํ ์์น
MVC 2 ๋์์ธ ํจํด์ ์ฌ์ฉํ๋ฉด์ ์ฝ๋ ์์ฑ, ์์ ์ ์ฉ์ดํจ์ ์ํด์ ์ปจํธ๋กค๋ฌ(IndexController)์ ๋ทฐ(index.jsp)๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ผ์ด๋์์ง๋ง ์คํ ์ ์ฐจ๋ฅผ ์๊ฐํด ๋ณด๋ฉด ๋์ ์ด์ด์ ธ์๋ ๊ด๊ณ์ด๋ค. ์ปจํธ๋กค๋ฌ๊ฐ ๋จผ์ ์คํ๋ ํ์ ๋ทฐ๋ฅผ ์์ฒญํ๊ฒ ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ทฐ๋ง ๋จ๋ ์ผ๋ก ํธ์ถํ๋ ์ํฉ์ด ์๊ธฐ๋ฉด ์ ๋๋ค๋ ๋ป์ด๋ค.
ํ์ฌ ์ํ์์๋ localhost:8080/webprj/index.jsp ์์ฒญ์ ํ์ ๋ index.jsp ํ์ด์ง๊ฐ ๋ณด์ด๊ฒ ๋๋ค. ์ด๋ฐ ํ์์ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ทฐ ํ์ด์ง๋ฅผ ์จ๊ฒจ๋๋ ๋ฐฉ์์ ์๊ฐํ๊ฒ ๋ ๊ฒ์ด๋ค. ์ฌ์ฉ์๊ฐ ๋ทฐ ํ์ด์ง๋ง ํธ์ถํ ์๋ ์๊ฒ ์จ๊ฒจ๋๋ ๊ณต๊ฐ์ด ๋ฐ๋ก WEB-INF์ด๋ค. WEB-INF๋ ์ฌ์ฉ์๊ฐ ์ง์ ์ ๊ทผํ ์ ์๋ ๊ณต๊ฐ์ด๋ค.
WEB-INF ์์ ๋ทฐ ํ์ด์ง๋ค์ ๋ชจ์๋์ view ํด๋๋ฅผ ์์ฑํ๊ณ ๊ทธ ์์ index.jsp๋ฅผ ์ฎ๊ฒจ๋๋๋ค.
url๋ก ์ง์ ์์ฒญํ์ ๋ 404 ์๋ฌ๊ฐ ๋ฌ๋ค๋ฉด ๋ง๊ฒ ์ค์ ๋ ๊ฒ์ด๋ค.
IndexController.java
public class IndexController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("index controller");
ModelAndView mv = new ModelAndView();
mv.addObject("data", "Hello Spring MVC"); //view์์ ์ถ๋ ฅํ data๋ฅผ ๋ด๋๋ค.
mv.setViewName("/WEB-INF/view/index.jsp"); //์์ ํ ๋ทฐ ํ์ด์ง์ ๊ฒฝ๋ก
return mv;
}
}
mv.setViewName์ ์์ ํ๊ณ ์ปจํธ๋กค๋ฌ๋ฅผ ์คํํ๋ฉด ์ ์์ ์ผ๋ก index.jsp ํ์ด์ง๊ฐ ๋ฌ๋ค.
(/ : ๋ฃจํธ๋ก๋ถํฐ ์ฐพ๋ ์ ๋๊ฒฝ๋ก, /๊ฐ ์์ผ๋ฉด ์๋๊ฒฝ๋ก. ์ ๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ ํธํ๋ค. ์ฌ๊ธฐ์ ๋ฃจํธ(์น ๋ฃจํธ)๋ webapp์ด๋ค.)
http://localhost:8080/webprj/index๊ณผ ๊ฐ์ url์์ webprj์ด ์๋ฏธํ๋ ๊ฒ์ ํ๋ก์ ํธ ๋ช ์ธ๋ฐ url์ ๊ตณ์ด ๋ค์ด๊ฐ ํ์๊ฐ ์๋ค. ํ๋ก์ ํธ ์ฐํด๋ฆญ > Web Project Settings > Context root๋ฅผ "/"์ผ๋ก ์ง์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ Servers ํญ์์ ํฐ์บฃ ๋ฐ์ ์๋ ์น ๋ชจ๋์ ์ง์ด๋ค.
์คํํ ๋๋ง๋ค ๋งค๋ฒ ์ฃผ์๋ฅผ ์ ๋ ฅํ๊ธฐ ๊ท์ฐฎ์ผ๋ WEB-INF ์์ index๋ผ๋ ํ์ผ์ ๋ง๋ ๋ค. WEB-INF ๋ฐ๋ก ์๋์ ์์ผ๋ฏ๋ก ์ด ํ์ผ๋ /index๋ผ๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง์ง๋ง, ์ปจํธ๋กค๋ฌ๊ฐ ์คํ ์ฐ์ ์์๊ฐ ๋ ๋์ผ๋ฏ๋ก /index ์์ฒญํ๋ฉด IndexController๋ก ๊ฐ๋ค. ์ดํด๋ฆฝ์ค ์์์ ์คํ์ ํธํ๊ฒ ํ๊ธฐ ์ํด ๊ฐ์ด๋ก ๋ง๋ ๊ฒ์ด๋ค.
* ViewResolver
์์ ๋ทฐ๋ฅผ ์์ฒญํ ๋๋
ModelAndView mv = new ModelAndView();
mv.setViewName("/WEB-INF/view/index.jsp");
์ด๋ฐ ์์ผ๋ก ModelAndView ๊ฐ์ฒด๋ฅผ ๋ง๋ ํ ๋ทฐ ๋ค์์ set ํด์ฃผ์์ง๋ง ๋งค๊ฐ๋ณ์ ์์ฑ์๋ฅผ ์ด์ฉํ ์๋ ์๋ค.
ModelAndView mv = new ModelAndView("/WEB-INF/view/index.jsp");
์ฌ๊ธฐ์ ๋ฐ๋ณต๋๋ '/WEB-INF/view'์ '.jsp'๋ ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ํตํด ์ฒ๋ฆฌํด ์ฃผ๋ฉด ๋ณด๋ค ๊ฐํธํ๊ฒ ์ธ ์ ์๋ค.
dispatcher-servlet.xml
<!-- View Resolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
์ฌ์ฉ๋ฒ์ ๊ฐ๋จํ๋ค. dispatcher-servlet.xml์ ํด๋น ์ฝ๋๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.
๋ด๋ ์ฒ ์คํ๋ง ํ๋ ์์ํฌ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๊ฒ์๊ธ์ ๋๋ค.
'๐ปStudy > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ์ดํฐ ์๋น์ค ํด๋์ค ์ถ๊ฐ / ์๋น์ค ๊ฒฐํฉ๋ ฅ ๋ฎ์ถ๊ธฐ / DB ์ฐ๊ฒฐ์ ๋ณด ๋ถ๋ฆฌ / Spring ์ค์ ๋ถ๋ฆฌ (0) | 2021.02.26 |
---|---|
์ ์ ํ์ผ ๋งคํ / Tiles์ TilesResolver (0) | 2021.02.26 |
Spring MVC (0) | 2021.02.14 |
Spring์ผ๋ก AOP ๊ตฌํ (Around Advice) (0) | 2021.02.13 |
์์ ์๋ฐ๋ก AOP ๊ตฌํํด๋ณด๊ธฐ (0) | 2021.02.13 |