web application ๊ฐ๋ฐ ์ Servlet์ด ์ฌ์ฉ๋จ
Controller : ์์ฒญ ํด๋ผ์ด์ธํธ์ URL ์ ๋ณด๋ฅผ ๋ถ์ํ์ฌ URL์ ํด๋นํ๋ ๋ก์ง์ ์ํํ๊ณ , ์ ์ ํ JSPํ์ด์ง๋ก ํ๋ฉด(View)์ ์ ์ดํ๋ ๊ตฌ์กฐ
์ปจํธ๋กค๋ฌ(Controller) : ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์์ฒญ์ ๋ฐ์ URL ์ฃผ์๋ฅผ ๋ถ์ํ์ฌ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค(Model)์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํ ์ฒ๋ฆฌ ํ JSP ๋ฌธ์(View)๋ก ์ค๋ ๋๋ฅผ ์ด๋ํ์ฌ ์๋ต๋๋๋ก ํ๋ก๊ทธ๋จ์ ํ๋ฆ ์ ์ดํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์๋ธ๋ฆฟ
์ปจํธ๋กค๋ฌ ์ญํ์ ์ ๊ณตํ๊ธฐ ์ํ ํด๋์ค
- ํด๋ผ์ด์ธํธ์ ์์ฒญ URL ์ฃผ์๋ฅผ ๋ถ์ํ์ฌ ์๊ตฌ์ฌํญ์ ๋ฐํ๋ฐ์ ์ ์ฅ
- request.getRequestURI() : url ์ฃผ์ ๋ฐํ (/string/list.itwill)
- request.getContextPath() : ์ปจํ ์คํธ ๊ฒฝ๋ก (์ต์์๊ฒฝ๋ก /string )
- requestURI.substring(contextPath.length()) : ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ํ ์์ฒญ๊ฐ (list.itwill)
- ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ์ ์ด์ฉํ์ฌ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค(Model)์ ๊ฐ์ฒด๋ฅผ ์ ๊ณต๋ฐ์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ํ ์ถ๋ ฅ(View)๊ด๋ จ ์ ๋ณด๋ฅผ ๋ฐํ๋ฐ์ ์ ์ฅ
- HandlerMapping ํด๋์ค๋ก ๊ฐ์ฒด ์์ฑ
- ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ๊ณผ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์ํธ๋ฆฌ๋ก ์ ์ฅ๋ Map ๊ฐ์ฒด ์ฌ์ฉ ๊ฐ๋ฅ
- HandlerMapping ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ฐ์ ์ ์ฅ
- ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ JSP ๋ฌธ์์ ์ด๋ฆ(ViewName)์ ๋ฐํ๋ฐ์ ์ ์ฅ
- JSP ๋ฌธ์๋ก ํฌ์๋ ์ด๋ํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์ฒ๋ฆฌ๊ฒฐ๊ณผ๊ฐ ์๋ต๋๋๋ก ์ฒ๋ฆฌ
- ์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋์ ๋ฐํ๊ฐ(ViewName)์ ์ด์ฉํ์ฌ JSP ๋ฌธ์์ ๊ฒฝ๋ก๋ฅผ ์์ฑํ์ฌ ํฌ์๋ ์ด๋
- ViewResolver ํด๋์ค๋ก ๊ฐ์ฒด ์์ฑ
package xyz.itwill09.mvc;
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ ํธ์ถ๋๋ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ์ ์ธ
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.ํด๋ผ์ด์ธํธ์ ์์ฒญ URL ์ฃผ์๋ฅผ ๋ถ์ํ์ฌ ์๊ตฌ์ฌํญ์ ๋ฐํ๋ฐ์ ์ ์ฅ
String requestURI=request.getRequestURI();
String contextPath=request.getContextPath();
String command=requestURI.substring(contextPath.length());
//2.ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ์ ์ด์ฉํ์ฌ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค(Model)์ ๊ฐ์ฒด๋ฅผ ์ ๊ณต๋ฐ์ ๊ฐ์ฒด์
//๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ์์
/*
//์ธํฐํ์ด์ค๋ฅผ ์ฐธ์กฐ๋ณ์๋ก ์ ์ธํ๋ฉด ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ๋ชจ๋ ์์ํด๋์ค์ ๊ฐ์ฒด ์ ์ฅ ๊ฐ๋ฅ
Controller controller=null;
//ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ์ ๋น๊ตํ์ฌ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค๋ฅผ ๊ฐ์ฒด๋ก ์์ฑ
if(command.equals("/list.itwill")) {
controller=new ListController();
} else if(command.equals("/view.itwill")) {
controller=new ViewController();
}
*/
//HandlerMapping ํด๋์ค๋ก ๊ฐ์ฒด ์์ฑ
// => ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ๊ณผ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์ํธ๋ฆฌ๋ก ์ ์ฅ๋ Map ๊ฐ์ฒด ์ฌ์ฉ ๊ฐ๋ฅ
HandlerMapping handlerMapping=new HandlerMapping();
//HandlerMapping ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ
//์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ฐ์ ์ ์ฅ
Controller controller=handlerMapping.getController(command);
//์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ JSP ๋ฌธ์์
//์ด๋ฆ(ViewName)์ ๋ฐํ๋ฐ์ ์ ์ฅ
String viewName=controller.handleRequest(request, response);
//3.JSP ๋ฌธ์๋ก ํฌ์๋ ์ด๋ํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์ฒ๋ฆฌ๊ฒฐ๊ณผ๊ฐ ์๋ต๋๋๋ก ์ฒ๋ฆฌ
// => ์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋์ ๋ฐํ๊ฐ(ViewName)์ ์ด์ฉํ์ฌ JSP ๋ฌธ์์ ๊ฒฝ๋ก๋ฅผ ์์ฑํ์ฌ ํฌ์๋ ์ด๋
//ViewResolver ํด๋์ค๋ก ๊ฐ์ฒด ์์ฑ
ViewResolver viewResolver=new ViewResolver();
String view=viewResolver.getView(viewName);//์๋ตํ JSP ๋ฌธ์์ ๊ฒฝ๋ก ์์ฑ
request.getRequestDispatcher(view).forward(request, response);//jsp๋ฌธ์๋ก ํฌ์๋ ์ด๋
}
}
package xyz.itwill09.mvc;
import lombok.AllArgsConstructor;
import lombok.Data;
@AllArgsConstructor//๋งค๊ฐ๋ณ์๊ฐ ์ ์ธ๋ ์์ฑ์๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ์ด๋
ธํ
์ด์
(๋ชจ๋ ํ๋์ ๋ํ ์์กด์ฑ ์ฃผ์
)
@Data
public class Member {
private String id;
private String name;
private String address;
}
ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ๊ณผ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ Map ๊ฐ์ฒด์ ์ํธ๋ฆฌ(Entry)๋ก ์ ์ฅํ์ฌ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ํด๋์ค
Map ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ํ๋
์์ฑ์๋ฅผ ์ด์ฉํ ํ๋ ์ด๊ธฐํ (Map ๊ฐ์ฒดํ์ฌ ์ํธ๋ฆฌ ์ถ๊ฐ)
ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ(MapKey)์ ๋ํ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๊ฐ์ฒด(MapValue)๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
import java.util.HashMap;
import java.util.Map;
public class HandlerMapping {
//Map ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ํ๋
// => ์ํธ๋ฆฌ์ ์ ๋ค๋ฆญ์ผ๋ก ๋งตํค๋ ์๊ตฌ์ฌํญ์ ์ ์ฅํ๊ธฐ ์ํ String ํด๋์ค๋ก ์ค์ ํ๊ณ
//๋งต๊ฐ์ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ Controller ์ธํฐํ์ด์ค๋ก ์ค์
private Map<String, Controller> mappings;
//์์ฑ์๋ฅผ ์ด์ฉํ ํ๋ ์ด๊ธฐํ - Map ๊ฐ์ฒดํ์ฌ ์ํธ๋ฆฌ ์ถ๊ฐ
public HandlerMapping() {
mappings=new HashMap<String, Controller>();
mappings.put("/list.itwill", new ListController());
mappings.put("/view.itwill", new ViewController());
}
//ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ(MapKey)์ ๋ํ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๊ฐ์ฒด(MapValue)๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
public Controller getController(String command) {
return mappings.get(command);
}
}
๋ชจ๋ธ ์ญํ์ ์ ๊ณตํ๋ ํด๋์ค๊ฐ ๋ฐ๋์ ์์ ๋ฐ์์ผ ๋๋ ์ธํฐํ์ด์ค
๋ชจ๋ ๋ชจ๋ธ ํด๋์ค์์ ๋ฐ๋์ ์์ฑํ ์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋๋ฅผ ์ถ์๋ฉ์๋๋ก ์ ์ธ
package xyz.itwill09.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Controller {
//๋ชจ๋ ๋ชจ๋ธ ํด๋์ค์์ ๋ฐ๋์ ์์ฑํ ์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋๋ฅผ ์ถ์๋ฉ์๋๋ก ์ ์ธ
String handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
๋ชจ๋ธ(Model) : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํด๋์ค
์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋ : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ช ๋ น์ ์์ฑํ ๋ฉ์๋
package xyz.itwill09.mvc;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//๋ชจ๋ธ ์ญํ์ ์ ๊ณตํ๊ธฐ ์ํ ํด๋์ค - ์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋๊ฐ ์ ์ธ๋ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์์ฑ
// => ํ๋์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ํด ํ๋์ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ ์ฒ๋ฆฌ - Command Pattern
// => ํด๋ผ์ด์ธํธ๊ฐ [/list.itwill]์ URL ์ฃผ์๋ก ์์ฒญํ ๊ฒฝ์ฐ ์ปจํธ๋กค๋ฌ์ ์ํด ๋์๋ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค
public class ListController implements Controller {
//์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋ : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ช
๋ น์ ์์ฑํ ๋ฉ์๋
// => ์ค๋ ๋๊ฐ ์ด๋๋์ด ์๋ต๋ JSP ๋ฌธ์์ ์ด๋ฆ(ViewName)์ ๋ฐํ
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//์์ฒญ ์ฒ๋ฆฌ ๋ช
๋ น - ๋ฐ์ดํ ์ฒ๋ฆฌ : Service ํด๋์ค์ ๋ฉ์๋ ํธ์ถ
List<Member> memberList=new ArrayList<Member>();
memberList.add(new Member("abc", "ํ๊ธธ๋", "์์ธ์ ๊ฐ๋จ๊ตฌ"));
memberList.add(new Member("opq", "์๊บฝ์ ", "์ธ์ฒ์ ์๋ฏธ๊ตฌ"));
memberList.add(new Member("xyz", "์ ์ฐ์น", "์์์ ํ๋ฌ๊ตฌ"));
//์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ JSP ๋ฌธ์์ ์ ๊ณตํ๊ธฐ ์ํด request ์์ฑ๊ฐ์ผ๋ก ์ ์ฅ
request.setAttribute("memberList", memberList);
//์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณต๋ฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ JSP ๋ฌธ์์ ์ด๋ฆ(ViewName) ๋ฐํ
return "member_list";
}
}
๋ชจ๋ธ ์ญํ์ ์ ๊ณตํ๊ธฐ ์ํ ํด๋์ค
package xyz.itwill09.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//๋ชจ๋ธ ์ญํ์ ์ ๊ณตํ๊ธฐ ์ํ ํด๋์ค
// => ํด๋ผ์ด์ธํธ๊ฐ [/view.itwill]์ URL ์ฃผ์๋ก ์์ฒญํ ๊ฒฝ์ฐ ์ปจํธ๋กค๋ฌ์ ์ํด ๋์๋ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค
public class ViewController implements Controller {
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Member member=new Member("abc", "ํ๊ธธ๋", "์์ธ์ ๊ฐ๋จ๊ตฌ");
request.setAttribute("member", member);
return "member_view";
}
}
์๋ต ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ํด๋์ค
JSP ๋ฌธ์์ ์ด๋ฆ(ViewName)์ ์ ๋ฌ๋ฐ์ JSP ๋ฌธ์์ ๊ฒฝ๋ก๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๋ ๋ฉ์๋
package xyz.itwill09.mvc;
public class ViewResolver {
//JSP ๋ฌธ์์ ์ด๋ฆ(ViewName)์ ์ ๋ฌ๋ฐ์ JSP ๋ฌธ์์ ๊ฒฝ๋ก๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๋ ๋ฉ์๋
public String getView(String viewName) {
return "/WEB-INF/mvc/"+viewName+".jsp";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%-- ํ์๋ชฉ๋ก์ ์ ๊ณต๋ฐ์ ์ถ๋ ฅํ๋ JSP ๋ฌธ์ --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
</head>
<body>
<h1>ํ์๋ชฉ๋ก</h1>
<hr>
<c:forEach var="member" items="${memberList }">
<p>์์ด๋ = ${member.id }, ์ด๋ฆ = ${member.name }, ์ฃผ์ = ${member.address }</p>
</c:forEach>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- ํ์์ ๋ณด๋ฅผ ์ ๊ณต๋ฐ์ ์ถ๋ ฅํ๋ JSP ๋ฌธ์ --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
</head>
<body>
<h1>ํ์์ ๋ณด</h1>
<hr>
<p>์์ด๋ = ${member.id }, ์ด๋ฆ = ${member.name }, ์ฃผ์ = ${member.address }</p>
</body>
</html>
- context-param : ๋ชจ๋ ์นํ๋ก๊ทธ๋จ ์คํ์ ํ์ํ ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- contextConfigLocation ์ด๋ฆ์ผ๋ก ์คํ๋ง ์ปจํ ์ด๋(WebApplocationContext ๊ฐ์ฒด)์๊ฒ Spring Bean Configuration File์ ๊ฒฝ๋ก๋ฅผ ์ ๊ณต
- ๋ชจ๋ ์นํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ์ ์๋ Spring Bean๋ฅผ ๋ฑ๋กํ๊ธฐ ์ํ Spring Bean Configuration File
- ๋ชจ๋ Front Controller ์ญํ ์ ํ๋ ์นํ๋ก๊ทธ๋จ์๊ฒ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด Spring Bean์ผ๋ก ๋ฑ๋ก
- listener : WAS ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ Listener ํด๋์ค๋ฅผ ์ ๊ณต๋ฐ์ ๊ฐ์ฒด๋ก ์์ฑํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- Listener ํด๋์ค : ServletContextListener ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์์ํด๋์ค
- contextInitialized ๋ฉ์๋ : Listener ๊ฐ์ฒด ์์ฑ ํ ์๋ ํธ์ถ๋๋ ๋ฉ์๋ (์ด๊ธฐํ ์์ )
- contextDestroyed ๋ฉ์๋ : Listener ๊ฐ์ฒด ์๋ฉธ ์ ์๋ ํธ์ถ๋๋ ๋ฉ์๋ (๋ง๋ฌด๋ฆฌ ์์ )
- servlet : ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์๋ธ๋ฆฟ(์นํ๋ก๊ทธ๋จ)์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- servlet-name : ์๋ธ๋ฆฟ์ ๊ตฌ๋ถํ๊ธฐ ์ํ ์๋ณ์๋ฅผ ์ค์ ํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- servlet-class : ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ํด ๊ฐ์ฒด๋ก ์์ฑ๋์ด ์คํ๋ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์ค์ ํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- DispatcherServlet ํด๋์ค : ์ปจํธ๋กค๋ฌ(Controller) ์ญํ ์ ์ ๊ณตํ๋ ํด๋์ค (Front Controller)
- Spring Framework์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ ๊ณต๋๋ DispatcherServlet ํด๋์ค ์ฌ์ฉ (Front Controller)
- init-param : ์๋ธ๋ฆฟ ํด๋์ค์๊ฒ ์คํ์ ํ์ํ ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- contextConfigLocation ์ด๋ฆ์ผ๋ก ์คํ๋ง ์ปจํ ์ด๋(WebApplicationContext ๊ฐ์ฒด)์๊ฒ Spring Bean Configuration File์ ๊ฒฝ๋ก๋ฅผ ์ ๊ณต
- ํ์ฌ ์ค์ ๋ Front Controller ์ญํ ์ ๊ฐ์ฒด์๊ฒ๋ง ์ ๊ณตํ Spring Bean์ ๋ฑ๋กํ๊ธฐ ์ํ Spring Bean Configuration File
- Spring Bean Configuration File์ ์ํฐ(Enter) ๋๋ [,] ๋ฐ [;]์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ฌ๋ฌ๊ฐ ์ ๊ณต ๊ฐ๋ฅ
- load-on-startup : WAS ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ฒด๋ก ์์ฑํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ธ๋ฆฟ(Front Controller)๋ฅผ ์์ฒญํ์ง ์์๋ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์์ฑ
- ์๋ฆฌ๋จผํธ ๋ด์ฉ์ผ๋ก ์ค์ ๋ ์ ์๊ฐ์ด ์์์๋ก ๋จผ์ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ก ์์ฑ
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="https://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<!-- context-param : ๋ชจ๋ ์นํ๋ก๊ทธ๋จ ์คํ์ ํ์ํ ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<!-- => contextConfigLocation ์ด๋ฆ์ผ๋ก ์คํ๋ง ์ปจํ
์ด๋(WebApplocationContext ๊ฐ์ฒด)์๊ฒ
Spring Bean Configuration File์ ๊ฒฝ๋ก๋ฅผ ์ ๊ณต -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- ๋ชจ๋ ์นํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ์ ์๋ Spring Bean๋ฅผ ๋ฑ๋กํ๊ธฐ ์ํ Spring Bean Configuration File -->
<!-- => ๋ชจ๋ Front Controller ์ญํ์ ํ๋ ์นํ๋ก๊ทธ๋จ์๊ฒ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด Spring Bean์ผ๋ก ๋ฑ๋ก -->
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<!-- listener : WAS ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ Listener ํด๋์ค๋ฅผ ์ ๊ณต๋ฐ์ ๊ฐ์ฒด๋ก ์์ฑํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<!-- Listener ํด๋์ค : ServletContextListener ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์์ํด๋์ค -->
<!-- => contextInitialized ๋ฉ์๋ : Listener ๊ฐ์ฒด ์์ฑ ํ ์๋ ํธ์ถ๋๋ ๋ฉ์๋ - ์ด๊ธฐํ ์์
-->
<!-- => contextDestroyed ๋ฉ์๋ : Listener ๊ฐ์ฒด ์๋ฉธ ์ ์๋ ํธ์ถ๋๋ ๋ฉ์๋ - ๋ง๋ฌด๋ฆฌ ์์
-->
<listener>
<!-- listener-class : ServletContextListener ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์์ํด๋์ค๋ฅผ ์ค์ ํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<!-- => WAS ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ ContextLoaderListener ํด๋์ค๋ฅผ ๊ฐ์ฒด๋ก ์์ฑํ๊ณ
contextInitialized ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ด๊ธฐํ ์์
-->
<!-- ContextLoaderListener ํด๋์ค์ contextInitialized ๋ฉ์๋์์ ์คํ๋ง ์ปจํ
์ด๋(Spring Container)๋ฅผ
์์ฑํ๊ณ Spring Bean Configuration File์ ์ ๊ณต๋ฐ์ Spring Bean์ผ๋ก ๋ฑ๋ก๋ ํด๋์ค๋ฅผ ๊ฐ์ฒด๋ก ์์ฑ -->
<!-- Listener ๊ฐ์ฒด์ ๋ฉ์๋์ ์ํด ์์ฑ๋ ์คํ๋ง ์ปจํ
์ด๋(WebApplicationContext ๊ฐ์ฒด)๋
๋ชจ๋ ์น์์(์๋ธ๋ฆฟ ๋ฐ ํํฐ)์๊ฒ ๊ณต์ ๋์ด ์ฌ์ฉ ๊ฐ๋ฅ - Spring Bean ์ ๊ณต -->
<!-- => WebApplicationContext ๊ฐ์ฒด๋ ๊ธฐ๋ณธ์ ์ผ๋ก src/main/webapp ํด๋์ Spring Bean
Configuration File ํ์ผ๋ง ์ ๊ณต๋ฐ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ -->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- servlet : ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์๋ธ๋ฆฟ(์นํ๋ก๊ทธ๋จ)์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<servlet>
<!-- servlet-name : ์๋ธ๋ฆฟ์ ๊ตฌ๋ถํ๊ธฐ ์ํ ์๋ณ์๋ฅผ ์ค์ ํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<servlet-name>mvc</servlet-name>
<!-- servlet-class : ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ํด ๊ฐ์ฒด๋ก ์์ฑ๋์ด ์คํ๋ ์๋ธ๋ฆฟ ํด๋์ค์
์ค์ ํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<!-- DispatcherServlet ํด๋์ค : ์ปจํธ๋กค๋ฌ(Controller) ์ญํ์ ์ ๊ณตํ๋ ํด๋์ค - Front Controller -->
<servlet-class>xyz.itwill09.mvc.DispatcherServlet</servlet-class>
</servlet>
<!-- servlet-mapping : ์๋ธ๋ฆฟ์ ์คํํ๊ธฐ ์ํ URL ์ฃผ์์ ํจํด์ ๋ฑ๋กํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<servlet-mapping>
<!-- servlet-name : ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ํด ์คํ๋ ์๋ธ๋ฆฟ์ ์๋ณ์๋ฅผ ์ค์ ํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<servlet-name>mvc</servlet-name>
<!-- url-pattern : ์๋ธ๋ฆฟ์ ์คํํ๊ธฐ ์ํ URL ์ฃผ์์ ํจํด์ ์ค์ ํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<!-- => Front Controller ์ญํ์ ์ ๊ณตํ๋ ์๋ธ๋ฆฟ์ ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌ๋๋๋ก ์ค์ -->
<url-pattern>*.itwill</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>springMvc</servlet-name>
<!-- Spring Framework์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ ๊ณต๋๋ DispatcherServlet ํด๋์ค ์ฌ์ฉ - Front Controller -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- init-param : ์๋ธ๋ฆฟ ํด๋์ค์๊ฒ ์คํ์ ํ์ํ ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<!-- => contextConfigLocation ์ด๋ฆ์ผ๋ก ์คํ๋ง ์ปจํ
์ด๋(WebApplicationContext ๊ฐ์ฒด)์๊ฒ
Spring Bean Configuration File์ ๊ฒฝ๋ก๋ฅผ ์ ๊ณต -->
<!-- => ํ์ฌ ์ค์ ๋ Front Controller ์ญํ์ ๊ฐ์ฒด์๊ฒ๋ง ์ ๊ณตํ Spring Bean์ ๋ฑ๋กํ๊ธฐ
์ํ Spring Bean Configuration File -->
<!-- => Spring Bean Configuration File์ ์ํฐ(Enter) ๋๋ [,] ๋ฐ [;]์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ฌ๋ฌ๊ฐ ์ ๊ณต ๊ฐ๋ฅ -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/springMvc/mvc-context1.xml
/WEB-INF/spring/springMvc/mvc-context2.xml
</param-value>
</init-param>
<!-- load-on-startup : WAS ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ฒด๋ก ์์ฑํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ -->
<!-- => ํด๋ผ์ด์ธํธ๊ฐ ์๋ธ๋ฆฟ(Front Controller)๋ฅผ ์์ฒญํ์ง ์์๋ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์์ฑ -->
<!-- => ์๋ฆฌ๋จผํธ ๋ด์ฉ์ผ๋ก ์ค์ ๋ ์ ์๊ฐ์ ์์์๋ก ๋จผ์ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ก ์์ฑ -->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
root-context.xml : ๋ชจ๋ Front Controller ์ญํ ์ ๊ฐ์ฒด์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋ ํด๋์ค๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํ Spring Bean Configuration File
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- root-context.xml : ๋ชจ๋ Front Controller ์ญํ์ ๊ฐ์ฒด์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋ ํด๋์ค๋ฅผ
Spring Bean์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํ Spring Bean Configuration File -->
<!-- => DAO ํด๋์ค ์์ฑ์ ํ์ํ ํด๋์ค๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋ก -->
<!-- => DataSource, SqlSessionFactory, SqlSession, TransactionManager ๋ฑ -->
</beans>
SpringMVC Framework : DispatcherServlet์ ์์์ผ๋ก ์ ์๋ HandlerMapping์ ์ํด ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๊ณ , ViewResolver์ ์ํด View๋ฅผ ์ฐพ์ ํ๋ฉด์ ๋ณด์ฌ์ค
SpringMVC์ ์ฃผ์ ๊ตฌ์ฑ ์์
package xyz.itwill09.spring;
import lombok.AllArgsConstructor;
import lombok.Data;
@AllArgsConstructor
@Data
public class Product {
private int num;
private String name;
}
Spring Framework ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ SimpleUrlHandlerMapping ํด๋์ค๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋ก
<?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">
<!-- Spring Framework ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Controller ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์์ํด๋์ค๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋ก -->
<bean class="xyz.itwill09.spring.ListController" id="listController"/>
<bean class="xyz.itwill09.spring.ViewController" id="viewController"/>
<!-- Spring Framework ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ SimpleUrlHandlerMapping ํด๋์ค๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋ก -->
<!-- SimpleUrlHandlerMapping ๊ฐ์ฒด : ์ปจํธ๋กค๋ฌ(DispatcherServlet)์๊ฒ ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ์
์ ๋ฌ๋ฐ์ ์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ ๊ฐ์ฒด(Spring Bean)๋ฅผ ๋ฐํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ์ฒด -->
<!-- => mappings ํ๋์ Map ๊ฐ์ฒด๋ฅผ ์ ์ฅํ์ฌ ์ํธ๋ฆฌ(Entry) ์ถ๊ฐ -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<!-- ๋งตํค(MapKey)๋ ํด๋ผ์ด์ธํธ์ ์๊ตฌ์ฌํญ(String)๋ฅผ ์ ๋ฌํ๊ณ ๋งต๊ฐ(MapValue)์
์์ฒญ ์ฒ๋ฆฌ ํด๋์ค์ Spring Bean์ ๋ํ beanName(String)์ ์ ๋ฌํ์ฌ Map ๊ฐ์ฒด์
์ํธ๋ฆฌ๋ก ์ถ๊ฐ - map ์๋ฆฌ๋จผํธ ๋์ props ์๋ฆฌ๋จผํธ ์ฌ์ฉ ๊ฐ๋ฅ -->
<props>
<prop key="/list.do">listController</prop>
<prop key="/view.do">viewController</prop>
</props>
</property>
</bean>
</beans>
Model ์ญํ ์ ์ ๊ณตํ๊ธฐ ์ํ ํด๋์ค (์์ฒญ ์ฒ๋ฆฌ ํด๋์ค)
์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ModelAndView ๊ฐ์ฒด์ ์์ฑ๊ฐ์ผ๋ก ์ ์ฅ
modelAndView.addObject("productList", productList);
์๋ต์ ๋ํ ์ด๋ ๊ด๋ จ ์ ๋ณด(ViewName)์ ModelAndView ๊ฐ์ฒด ํ๋์ ์ ์ฅ
modelAndView.setViewName("product_list");
package xyz.itwill09.spring;
public class ListController implements Controller {
//์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋ - ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ํด ์ปจํธ๋กค๋ฌ์ ์๋ ํธ์ถ
// => ModelAndView ๊ฐ์ฒด์ ์๋ต ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ์ฅํ์ฌ ๋ฐํ
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//ModelAndView ๊ฐ์ฒด : ์ฒ๋ฆฌ๊ฒฐ๊ณผ ๋ฐ ์๋ต์ ๋ํ ์ด๋ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๊ฐ์ฒด
ModelAndView modelAndView=new ModelAndView();
//๋ฐ์ดํ ์ฒ๋ฆฌ
List<Product> productList=new ArrayList<Product>();
productList.add(new Product(1000, "์ปดํจํฐ"));
productList.add(new Product(2000, "๋
ธํธ๋ถ"));
productList.add(new Product(3000, "ํธ๋ํฐ"));
//์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ModelAndView ๊ฐ์ฒด์ ์์ฑ๊ฐ์ผ๋ก ์ ์ฅ
//ModelAndView.addObject(String attributeName, Object attributeValue)
// => ModelAndView ๊ฐ์ฒด์ ์ฒ๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ์์ฑ๊ฐ์ผ๋ก ์ ์ฅํ๋ ๋ฉ์๋ - Request Scope
// => request.setAttribute() ๋ฉ์๋์ ์ ์ฌํ ๊ธฐ๋ฅ ์ ๊ณต
modelAndView.addObject("productList", productList);
//์๋ต์ ๋ํ ์ด๋ ๊ด๋ จ ์ ๋ณด(ViewName)์ ModelAndView ๊ฐ์ฒด ํ๋์ ์ ์ฅ
//ModelAndView.setViewName(String viewName) : ๋ทฐ์ด๋ฆ(ViewName)์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋
// => ์ปจํธ๋กค๋ฌ์ ์ํด ๋ทฐ์ด๋ฆ(ViewName)์ JSP ๋ฌธ์๋ก ๋ณ๊ฒฝ๋์ด ํฌ์๋ ์ด๋ - ์๋ต
modelAndView.setViewName("product_list");
return modelAndView;
}
}
Model ์ญํ ์ ์ ๊ณตํ๊ธฐ ์ํ ํด๋์ค (์์ฒญ ์ฒ๋ฆฌ ํด๋์ค)
package xyz.itwill09.spring;
public class ViewController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("product",new Product(4000,"ํ๋ฆฐํธ"));
modelAndView.setViewName("product_view");
return modelAndView;
}
}
Spring Framework ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ InternalResourceViewResolver ํด๋์ค๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋ก
<?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">
<!-- Spring Framework ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ InternalResourceViewResolver ํด๋์ค๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋ก -->
<!-- InternalResourceViewResolver ๊ฐ์ฒด : ๋ทฐ์ด๋ฆ(ViewName)์ ์ ๋ฌ๋ฐ์ JSP ๋ฌธ์๋ก ๋ณํํ์ฌ
๋ฐํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ์ฒด -->
<!-- => prefix ํ๋์ suffix ํ๋์ JSP ๋ฌธ์๋ก ๋ณํํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ์ ์ฅ -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- prefix ํ๋ : ๋ทฐ์ด๋ฆ ์๋ถ๋ถ์ ์ถ๊ฐ๋ ๋ฌธ์์ด - ๋๋ ํ ๋ฆฌ -->
<property name="prefix" value="/WEB-INF/mvc/"/>
<!-- suffix ํ๋ : ๋ทฐ์ด๋ฆ ๋ท๋ถ๋ถ์ ์ถ๊ฐ๋ ๋ฌธ์์ด - ํ์ฅ์ -->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
<%@ 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>SPRING</title>
</head>
<body>
<h1>์ ํ๋ชฉ๋ก</h1>
<hr>
<c:forEach var="product" items="${productList }">
<p>์ ํ๋ฒํธ = ${product.num }, ์ ํ์ด๋ฆ = ${product.name }</p>
</c:forEach>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
</head>
<body>
<h1>์ ํ์ ๋ณด</h1>
<hr>
<p>์ ํ๋ฒํธ = ${product.num }, ์ ํ์ด๋ฆ = ${product.name }</p>
</body>
</html>