๐ป
์คํ๋ง ํ๋ ์์ํฌ - [Spring] ํฐ์บฃ ์๋ฒ ์ธํ / MVC ํ๋ก์ ํธ (1) ๋ณธ๋ฌธ
์คํ๋ง ํ๋ ์์ํฌ - [Spring] ํฐ์บฃ ์๋ฒ ์ธํ / MVC ํ๋ก์ ํธ (1)
๋ํจ๋ 2020. 7. 28. 10:32ํฐ์บฃ ์๋ฒ ์ธํ
apache-tomcat-9.0.35 ๋ค์ด๋ก๋
https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.35/bin/
Index of /dist/tomcat/tomcat-9/v9.0.35/bin
archive.apache.org
Window > Preference > Server ๊ฒ์ > Runtime Environments
์๋ ์๋๊ฑฐ ์ง์์ฃผ๊ณ Add.. Apache Tomcat v9.0 ์ ํํ๊ณ Apply and Close
์๋์ Server ์ฐฝ์์ ์ธํ ์ ๋ง์ ํด์ค๋ค.
ํฌํธ๋ฒํธ 8181๋ก ์ค์ ํ๊ฒ์ ์ค๋ผํด์๋ฒ๊ฐ 8181์ด๋ฏ๋ก ๊ฒน์น์ง ์๊ฒ ํ๊ธฐ ์ํจ์ด๋ค.
New project > Dynamic Web Project๋ฅผ ์ ํํด์ ์ ํ๋ก์ ํธ ์์ฑํ๋ค.
Spring Lib ์ถ๊ฐ
ํด๋นํ๋ก์ ํธ ํด๋์ WebContent > WEB-INF > lib ์ SpringLib ๋ณต์ฌํด์ ๋ฃ๋๋ค.
WEB-INF์ Spring Bean Configuration File ์์ฑํ๋ค.
Java Resources > Libraries > Web App Libraries > org.springframework.web.servlet-3.1.4.RELEASE.jar > org.springframework.web.servlet.handler > SimpleUrlHandlerMapping.class ์ ํํด์ ๊ฒฝ๋ก๋ณต์ฌ(Copy Qualified Name)
DispatcherDispatcherServlet๊ฐ ๋ถ๋ ค์ง๋ฉด์ SpringController-servlet.xmlํ์ผ๋ก ๊ฐ๋ค.
(FrontController๊ฐ DipspatcherServlet)
Controller๋ Service๋ฅผ Service๋ Dao๋ฅผ ๋ถ๋ฌ์ค์ผํ๋ค.
Controller๋ Service์ , Service๋ Dao์ ์์ฑ์์ Setter ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์ผํ๋ค.
Controller -> Service -> Dao -> Mybatis
DB์ฐ๋์ ์ํ .jarํ์ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์ ์ถ๊ฐ
ํ๊ธ ์ธ์ฝ๋ฉ์ ์ํ filter ์์ฑ
๋ฉ์ธํ์ด์ง
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="root" value="${pageContext.request.contextPath}"/>
<a href="${root}/member/test.do"> Spring MVC Start!!! </a>
</body>
</html>
web.xml
--> FrontController๊ฐ DispatcherServlet์ผ๋ก ๋์ฒด
(๋งคํ์์ , ํ์ด์ง ์ด๋ ์์ ,
์๋ฒ๊ฐ ์ผ์ง๋ฉด *.do๊ฐ ๋ค์ด์ค๊ณ DispatcherServlet์ ์ฐพ์
servlet-name์ ์๋ฌด๊ฑฐ๋ ํด๋ ๋์ง๋ง, beansํ์ผ๊ณผ ์ด๋ฆ์ด ๊ฐ์์ผํจ
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>04_SpringMVC</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>SpringController</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringController</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
spring Bean ConfigurationFile , bean๊ณผ aop๋ฅผ ์ ํํด ์์ฑํด์ค๋ค.
SpringController-servlet.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!-- HandlerMapping / UI์์ฒญ์ด ๋ค์ด์ค๋ฉด ํด๋น ํด๋์ค๋ฅผ ์ฐพ์๋ผ -->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/member/*.do">memberController</prop>
</props>
</property>
</bean>
</beans>
mapping -> contoller->service->dao ->mybatis
MemberController.java
package com.java.member.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import com.java.member.service.MemberService;
public class MemberController extends MultiActionController{ //Command
private MemberService memberService;
public MemberController() {}
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
public String testing(HttpServletRequest request, HttpServletResponse response) {
//์๋น์ค - DAO & DTO - ์๋น์ค
return "";
}
}
MemberServiceImp.java
package com.java.member.service;
import com.java.member.dao.MemberDao;
public class MemberServiceImp implements MemberService {
private MemberDao memberDao;
public MemberServiceImp() {}
public MemberServiceImp(MemberDao memberDao) {
this.memberDao = memberDao;
}
public void setMemberDao(MemberDao memberDao) {
this.memberDao = memberDao;
}
}
MemberDaoImp.java
package com.java.member.dao;
public class MemberDaoImp implements MemberDao {
//My bais SqlSessionTemplate
}
WEB-INF > SpringController-servlet.xml
membercontroller, service , 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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!-- HandlerMapping / UI์์ฒญ์ด ๋ค์ด์ค๋ฉด ํด๋น ํด๋์ค๋ฅผ ์ฐพ์๋ผ -->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/member/*.do">memberController</prop>
</props>
</property>
</bean>
<bean id="propertiesMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/member/test.do">testing</prop>
</props>
</property>
</bean>
<!-- MemberController -->
<bean id="memberController" class="com.java.member.controller.MemberController">
<constructor-arg ref="memberServiceImp"/>
<property name="methodNameResolver" ref="propertiesMethodNameResolver"/>
</bean>
<!-- MemberService -->
<bean id="memberServiceImp" class="com.java.member.service.MemberServiceImp">
<constructor-arg ref="memberDaoImp"/>
</bean>
<!-- MemberDAO -->
<bean id="memberDaoImp" class="com.java.member.dao.MemberDaoImp"></bean>
<!-- MyBatis -->
</beans>
MemberController.java
testing ์ถ๊ฐ
package com.java.member.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import com.java.aop.HAspect;
import com.java.member.dto.MemberDto;
import com.java.member.service.MemberService;
public class MemberController extends MultiActionController{ //Command
private MemberService memberService;
public MemberController() { }
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
public ModelAndView testing(HttpServletRequest req, HttpServletResponse res) {
System.out.println("OK");
//Service -> DAO & DTO -> Service
//View
/*
* InternalResourceView view = new InternalResourceView("WEB-INF/member/test.jsp");
* ModelAndView mav = new ModelAndView();
* mav.addObject("msg", "hi");
* mav.setView(view);
*/
ModelAndView mav = new ModelAndView("member/test");
mav.addObject("msg", "hi");
return mav;
}
public ModelAndView memberRegister(HttpServletRequest req, HttpServletResponse res) {
return new ModelAndView("member/register");
}
public ModelAndView memberRegisterOk(HttpServletRequest req, HttpServletResponse res, MemberDto memberDto) {
//dto์ ์ด๋ฆ๊ณผ ๋ทฐ์ form์ ์๋ณ์ name๊ฐ์ด ๊ฐ์์ผํ๋ค. dto์ resultMap์ ์ด๋ฆ์ด ๊ฐ์์ผ๋๋ค.
HAspect.logger.info(HAspect.logMsg + memberDto.toString());
ModelAndView mav = new ModelAndView();
mav.addObject("memberDto", memberDto);
memberService.memberRegisterOk(mav);
return mav;
}
public ModelAndView memberIdCheck(HttpServletRequest req, HttpServletResponse res) {
ModelAndView mav = new ModelAndView();
mav.addObject("request", req);
memberService.memberIdCheck(mav);
return mav;
}
}
WEB-INF > SpringController-servlet.xml
InternalResourceViewResolver ์ถ๊ฐ
<!-- MVC RequestDispatcher / forward -->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
ํ ์คํ ํ์ด์ง ์ถ๊ฐ
WebContent > WEB-INF > member > test.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>
<h3>${msg}</h3>
</body>
</html>
[์ ๋ฆฌ] *** MVC - FrontController : Spring MVC ***
FrontController: DispatcherServlet
1-1) DispatcherServlet๋ FrontController ์ญํ ์ ํ์ง๋ง, ์น ์์ฒญ URL๊ณผ Command ๋งตํํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ง ์๋ค.
1-2) DispatcherServlet์ HandlerMapping์ ์ฐธ์กฐํ๊ณ ์ฒ๋ฆฌ๋ฅผ ์ปจํธ๋กค๋ฌ์๊ฒ ๋งก๊ธด๋ค.
FrontController-Map : HandlerMapping interface
2-1) BeanNameUrlHandlerMapping
2-2) SimpleUrlHandlerMapping : ์์ฒญ URL์ ์ผ๊ด์ฒ๋ฆฌํ๋ค.
2-3) ClassNameHandlerMapping
FrontController-Command Pattern : ๊ฐ๊ฐ์ Controller์ ํด๋น๋๋ ํด๋์ค(์ธํฐํ์ด์ค)๋ฅผ ์์๋ฐ์ ๊ตฌํํ๋ค.
3-1) Controller
3-2) AbstractController
3-3) AbstractControllerController
3-4) SimpleFormController
3-5) MultiActionController : ํด๋น URL์์ ํจ์๋ฅผ ์ฐพ๋๋ค.
FrontController-String viewPage : View interface
4-1) InternalResourceView : ์์ ์์๋ ModelAndView ์ฌ์ฉ.
4-2) JstlView
4-3) VelocityView
4-4) MappingJacksonJsonView
FrontController-forward(request, response) : ViewResolver interface
5-1) InternalResourceViewResolver
5-2) ResourceBundleViewResolver
5-3) VelocityViewResolver