[์ฐธ๊ณ ๊ฐ์] ๊น์ํ๋์ ์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ฅผ ๋์
ํ๋ฉด ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋๋ค.
์คํ๋ง ์น MVC์ DispatcherServlet์ด FrontControllerํจํด์ผ๋ก ๊ตฌํ๋์ด ์์.
package hello.servlet.web.frontcontroller.v1;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface ControllerV1 {
void process(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
์๋ธ๋ฆฟ๊ณผ ๋น์ทํ ๋ชจ์์ ์ปจํธ๋กค๋ฌ ์ธํฐํ์ด์ค๋ฅผ ๋์
ํ๋ค. ๊ฐ ์ปจํธ๋กค๋ฌ๋ค์ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ ์ด ์ธํฐํ์ด์ค๋ฅผ ํธ์ถํด์ ๊ตฌํ๊ณผ ๊ด๊ณ์์ด ๋ก์ง์ ์ผ๊ด์ฑ์ ๊ฐ์ ธ๊ฐ ์ ์๋ค.
ํ์ ๋ฑ๋ก ์ปจํธ๋กค๋ฌ, ํ์ ์ ์ฅ ์ปจํธ๋กค๋ฌ, ํ์ ๋ชฉ๋ก ์ปจํธ๋กค๋ฌ ๋ชจ๋ ๊ธฐ์กด ์๋ธ๋ฆฟ๊ณผ ๊ฑฐ์ ๊ฐ์ผ๋ฉฐ process๋ฅผ override ํ๋ ์ฐจ์ด๋ฐ์ ์๋ค
์ด์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ฅผ ์ดํด๋ณด๊ฒ ๋ค. ๐
@WebServlet(name = "frontControllerServletV1", urlPatterns = "/front-controller/v1/*")
public class FrontControllerServletV1 extends HttpServlet {
private Map<String, ControllerV1> controllerMap = new HashMap<>();
public FrontControllerServletV1() {
controllerMap.put("/front-controller/v1/members/new-form", new MemberFormControllerV1());
controllerMap.put("/front-controller/v1/members/save", new MemberSaveControllerV1());
controllerMap.put("/front-controller/v1/members", new MemberListControllerV1());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("FrontControllerServletV1.service");
String requestURI = request.getRequestURI();
ControllerV1 controller = controllerMap.get(requestURI);
if (controller == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
controller.process(request, response);
}
}
urlPatterns
urlPatterns = "/front-controller/v1/*"
: /front-controller/v1
๋ฅผ ํฌํจํ ํ์ ๋ชจ๋ ์์ฒญ์ ์ด ์๋ธ๋ฆฟ์์ ๋ฐ์๋ค์ธ๋ค.๋จผ์ requestURI๋ฅผ ์กฐํํด์ ์ค์ ํธ์ถํ ์ปจํธ๋กค๋ฌ๋ฅผ controllerMap์์ ์ฐพ๋๋ค. ๋ง์ฝ ์์ผ๋ฉด 404 ์ฝ๋ ๋ฐํ.
์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๊ณ controller.process(request, response);์ ํธ์ถํด์ ํด๋น ์ปจํธ๋กค๋ฌ๋ฅผ ์คํํ๋ค.
๋ชจ๋ ์ปจํธ๋กค๋ฌ์์ ๋ทฐ๋ก ์ด๋ํ๋ ๋ถ๋ถ์ ์ค๋ณต์ด ์๊ณ , ๊น๋ํ์ง ์๋ค.
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
๋ทฐ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๋ฒ์ ์์๋ ์ฌ์ฉํ๋ฏ๋ก. frontcontroller ๋ฐ๋ก ๋ฐ์ ๋์๋ค.
public class MyView {
private String viewPath;
public MyView(String viewPath) {
this.viewPath = viewPath;
}
public void render(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
public interface ControllerV2 {
MyView process(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
public class MemberFormControllerV2 implements ControllerV2 {
@Override
public MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
MyView myView = new MyView("/WEB-INF/views/new-form.jsp");
return myView;
}
}
๊ฐ ์ปจํธ๋กค๋ฌ๋ ๋ณต์กํ dispatcher.forward()๋ฅผ ์ง์ ์์ฑํด์ ํธ์ถํ์ง ์์๋ ๋๋ค. ๋จ์ํ MyView ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฑฐ๊ธฐ์ ๋ทฐ ์ด๋ฆ๋ง ๋ฃ๊ณ ๋ฐํํ๋ฉด ๋๋ค.
ํ์คํ ์ค๋ณต ์ ๊ฑฐ๊ฐ ๋์๋ค! ๐
public class MemberSaveControllerV2 implements ControllerV2 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
public MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
//Model์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ด
request.setAttribute("member", member);
return new MyView("/WEB-INF/views/save-result.jsp");
}
}
public class MemberListControllerV2 implements ControllerV2 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
public MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Member> members = memberRepository.findAll();
request.setAttribute("members", members);
return new MyView("/WEB-INF/views/members.jsp");
}
}
@WebServlet(name = "frontControllerServletV2", urlPatterns = "/front-controller/v2/*")
public class FrontControllerServletV2 extends HttpServlet {
private Map<String, ControllerV2> controllerMap = new HashMap<>();
public FrontControllerServletV2() {
controllerMap.put("/front-controller/v2/members/new-form", new MemberFormControllerV2());
controllerMap.put("/front-controller/v2/members/save", new MemberSaveControllerV2());
controllerMap.put("/front-controller/v2/members", new MemberListControllerV2());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String requestURI = request.getRequestURI();
ControllerV2 controller = controllerMap.get(requestURI);
if (controller == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
MyView view = controller.process(request, response);
view.render(request, response);
}
}
ControllerV2์ ๋ฐํ ํ์ ์ด MyView์ด๋ฏ๋ก ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ ์ปจํธ๋กค๋ฌ์ ํธ์ถ ๊ฒฐ๊ณผ๋ก MyView๋ฅผ ๋ฐํ ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ view.render()๋ฅผ ํธ์ถํ๋ฉด forward ๋ก์ง์ ์ํํด์ JSP๊ฐ ์คํ๋๋ค.
public void render(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ ๋์
์ผ๋ก MyView ๊ฐ์ฒด์ render()๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ ๋ชจ๋ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. ๊ฐ๊ฐ์ ์ปจํธ๋กค๋ฌ๋ MyView ๊ฐ์ฒด๋ฅผ ์์ฑ๋ง ํด์ ๋ฐํํ๋ฉด ๋๋ค.
๋ค์์ Model์ถ๊ฐ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค ~~~!