/* ์ด ๊ธ์ ๊น์ํ๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ๋ ค๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์ฌ๋ฆฌ๋ ๊ธ์ด๋ฏ๋ก ์ค๊ฐ ์ค๊ฐ ์ฝ๋๋ ์๋ต๋์์ต๋๋ค. */
1. V3์ ๊ตฌ์กฐ
- ์๋ธ๋ฆฟ ์ข ์์ฑ ์ ๊ฑฐ
: ์์ฒญ ํ๋ผ๋ฏธํฐ ์ ๋ณด๋ ์๋ฐ์ Map์ผ๋ก ๋์ ๋๊ธฐ๋๋ก ํ๋ฉด ์ง๊ธ ๊ตฌ์กฐ์์ ์ปจํธ๋กค๋ฌ๊ฐ ์๋ธ๋ฆฟ ๊ธฐ์ ์ ๋ชฐ๋ผ๋ ๋์ํ ์ ์๋ค.
: ๊ทธ๋ฆฌ๊ณ request ๊ฐ์ฒด๋ฅผ Model๋ก ์ฌ์ฉํ๋ ๋์ ์ ๋ณ๋์ Model ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ฉด ๋๋ค.
- ๋ทฐ ์ด๋ฆ ์ค๋ณต ์ ๊ฑฐ
: ์ปจํธ๋กค๋ฌ์์ ์ง์ ํ๋ ๋ทฐ ์ด๋ฆ์ ์ค๋ณต์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
: ์ปจํธ๋กค๋ฌ๋ ๋ทฐ์ ๋ ผ๋ฆฌ์ด๋ฆ์ ๋ฐํํ๊ณ , ์ค์ ๋ฌผ๋ฆฌ ์์น์ ์ด๋ฆ์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌํ๋๋ก ํ์.
/WEB-INF/views/new-form.jsp → new-form
/WEB-INF/views/save-result.jsp → save-result
/WEB-INF/views/members.jsp → members
2. ๊ตฌํ
- ์ง๊ธ๊น์ง ์ปจํธ๋กค๋ฌ์์ ์๋ธ๋ฆฟ์ ์ข ์์ ์ธ HttpServletRequest๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ Model๋ request.setAttribute() ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๋ทฐ์ ์ ๋ฌํ๋ค.
- ์๋ธ๋ฆฟ์ ์ข ์์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํด Model์ ์ง์ ๋ง๋ค๊ณ ์ถ๊ฐ๋ก View ์ด๋ฆ๊น์ง ์ ๋ฌํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ณด์.
ModelView
public class ModelView {
private String viewName;
private Map<String, Object> model = new HashMap<>();
public ModelView(String viewName) {
this.viewName = viewName;
}
public String getViewName() {
return viewName;
}
public void setViewName(String viewName) {
this.viewName = viewName;
}
public Map<String, Object> getModel() {
return model;
}
public void setModel(Map<String, Object> model) {
this.model = model;
}
}
- ๋ทฐ์ ์ด๋ฆ๊ณผ ๋ทฐ๋ฅผ ๋ ๋๋งํ ๋ ํ์ํ model ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- model์ ๋จ์ํ map์ผ๋ก ๋์ด ์์ผ๋ฏ๋ก ์ปจํธ๋กค๋ฌ์์ ๋ทฐ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ key, value ํํ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
ControllerV3
public interface ControllerV3 {
ModelView process(Map<String, String> paramMap);
}
- V3์ปจํธ๋กค๋ฌ๋ ์๋ธ๋ฆฟ ๊ธฐ์ ์ ์ ํ ์ฌ์ฉํ์ง ์๋๋ค(๋ฐ๋ผ์ ๊ตฌํ์ด ๋งค์ฐ ๋จ์ํด์ง๊ณ , ํ ์คํธ ์ฝ๋ ์์ฑ์ด ์ฌ์์ง๋ค)
- HttpServletRequest๊ฐ ์ ๊ณตํ๋ ํ๋ผ๋ฏธํฐ๋ ํ๋ก ํธ์์ pramMap์ ๋ด์ ํธ์ถํด์ฃผ๋ฉด ๋๋ค.
- ์๋ต ๊ฒฐ๊ณผ๋ก ๋ทฐ ์ด๋ฆ๊ณผ ๋ทฐ์ ์ ๋ฌํ Model ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ModelView ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด ๋๋ค.
MemberFormControllerV3 - ํ์ ๋ฑ๋ก ํผ
public class MemberFormControllerV3 implements ControllerV3 {
@Override
public ModelView process(Map<String, String> paramMap) {
return new ModelView("new-form");
}
}
- ModelView๋ฅผ ์์ฑํ ๋ 'new-form'์ด๋ผ๋ view์ ๋ ผ๋ฆฌ์ ์ด๋ฆ์ ์ง์ ํ๋ค.
- ์ค์ ๋ฌผ๋ฆฌ์ ์ด๋ฆ์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌํ๋ค.
MemberSaveControllerV3 - ํ์ ์ ์ฅ
public class MemberSaveControllerV3 implements ControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
public ModelView process(Map<String, String> paramMap) {
String username = paramMap.get("username");
int age = Integer.parseInt(paramMap.get("age"));
Member member = new Member(username, age);
memberRepository.save(member);
ModelView mv = new ModelView("save-result");
mv.getModel().put("member", member);
return mv;
}
}
- ํ๋ผ๋ฏธํฐ ์ ๋ณด๋ map์ ๋ด๊ฒจ์์ผ๋ฏ๋ก map์์ ํ์ํ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํํ๋ฉด ๋๋ค.
- ๋ชจ๋ธ์ ๋จ์ํ map์ด๋ฏ๋ก ๋ชจ๋ธ์ ๋ทฐ์์ ํ์ํ member ๊ฐ์ฒด๋ฅผ ๋ด๊ณ ๋ฐํํ๋ค.
MemberListControllerV3 - ํ์ ๋ชฉ๋ก
public class MemberListControllerV3 implements ControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
public ModelView process(Map<String, String> paramMap) {
List<Member> members = memberRepository.findAll();
ModelView mv = new ModelView("members");
mv.getModel().put("members", members);
return mv;
}
}
FrontControllerServletV3
@WebServlet(name = "frontControllerServletV3", urlPatterns = "/front-controller/v3/*")
public class FrontControllerServletV3 extends HttpServlet {
private Map<String, ControllerV3> controllerMap = new HashMap<>();
public FrontControllerServletV3() {
controllerMap.put("/front-controller/v3/members/new-form", new MemberFormControllerV3());
controllerMap.put("/front-controller/v3/members/save", new MemberSaveControllerV3());
controllerMap.put("/front-controller/v3/members", new MemberListControllerV3());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String requestURI = request.getRequestURI();
ControllerV3 controller = controllerMap.get(requestURI);
if(controller == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
//paramMap
Map<String, String> paramMap = createParamMap(request);
ModelView mv = controller.process(paramMap);
String viewName = mv.getViewName();
MyView view = viewResolver(viewName);
view.render(mv.getModel(), request, response);
}
private static MyView viewResolver(String viewName) {
return new MyView("/WEB-INF/views/" + viewName + ".jsp");
}
private static Map<String, String> createParamMap(HttpServletRequest request) {
Map<String, String> paramMap = new HashMap<>();
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName)));
return paramMap;
}
}
MyView(์ถ๊ฐ)
public void render(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
modelToRequestAttribute(model, request);
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request,response);
}
private static void modelToRequestAttribute(Map<String, Object> model, HttpServletRequest request) {
model.forEach((key, value) -> request.setAttribute(key, value));
}
- createParamMap ๋ฉ์๋๋ HttpServletRequest์์ ํ๋ผ๋ฏธํฐ ์ ๋ณด๋ฅผ ๊บผ๋ด์ Map์ผ๋ก ๋ณํํ๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น Map(paramMap)์ ์ปจํธ๋กค๋ฌ์ ์ ๋ฌํ๋ฉด์ ํธ์ถํ๋ค.
- viewResolver ๋ฉ์๋๋ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํํ ๋ ผ๋ฆฌ ๋ทฐ ์ด๋ฆ์ ์ค์ ๋ฌผ๋ฆฌ ๋ทฐ ๊ฒฝ๋ก๋ก ๋ณ๊ฒฝํ๋ค.
- view.render(mv.getModel(), request, response)
: ๋ทฐ ๊ฐ์ฒด๋ฅผ ํตํด HTML ํ๋ฉด์ ๋ ๋๋ง ํ๋ค
: ๋ทฐ ๊ฐ์ฒด์ render()๋ ๋ชจ๋ธ ์ ๋ณด๋ ํจ๊ป ๋ฐ๋๋ค
: JSP ๋ request.getAttribute()๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ๋๋ฌธ์, ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ๋ด์๋๋ค.
: JSP๋ก ํฌ์๋ํด์ JSP๋ฅผ ๋ ๋๋งํ๋ค.
๋ค์ V4๋ฒ์ ์์๋ V3๋ฅผ ์กฐ๊ธ ๋ณ๊ฒฝํด์ ๊ฐ๋ฐ์๋ค์ด ํธ๋ฆฌํ๊ฒ ๊ฐ๋ฐํ ์ ์๋ ๋ฒ์ ์ ๊ฐ๋ฐํด๋ณด์.