Spring

[Spring] MVC 1ํŽธ (7) - MVC ํ”„๋ ˆ์ž„์›Œํฌ ๋งŒ๋“ค๊ธฐ v1, v2, v3

Sue 2022. 3. 29. 23:32

๐Ÿ“Œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ

โœ… ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ๋„์ž… ์ „

  • ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ๋„์ž… ์ „์—๋Š” ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊ณตํ†ต ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ–ˆ๋‹ค.

 

โœ… ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ๋„์ž… ํ›„

  • ๋ชจ๋“  ์š”์ฒญ ๋ฉ”์„ธ์ง€๋Š” ๊ณตํ†ต ๋กœ์ง์ด ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋“ค์–ด์˜จ๋‹ค.
  • ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์š”์ฒญ์— ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„ ํ˜ธ์ถœํ•ด์ค€๋‹ค.
  • ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์š”์ฒญ ๋ฉ”์„ธ์ง€๋ฅผ ๋งคํ•‘ ์‹œ์ผœ์ฃผ๋ฉด, ๋‚˜๋จธ์ง€ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

์Šคํ”„๋ง ์›น MVC์˜ ํ•ต์‹ฌ๋„ FrontController

→ ์Šคํ”„๋ง ์›น MVC์˜ DispatcherServlet์ด FrontController ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Œ!

 

 

๐Ÿ“Œ MVC ํ”„๋ ˆ์ž„์›Œํฌ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

โœ… v1 - ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ๋„์ž…

HTTP ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์š”์ฒญ์˜ URL์„ ๋ฐ”ํƒ•์œผ๋กœ ๋งคํ•‘ ์ •๋ณด์—์„œ ์š”์ฒญ URL๊ณผ ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„ ํ˜ธ์ถœํ•œ๋‹ค. ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” dispatcher.forward()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ทฐ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

ControllerV1 ์ธํ„ฐํŽ˜์ด์Šค
public interface ControllerV1 {

    void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
  • ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด ์ธํ„ฐํŽ˜์ด์Šค์˜ process() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋กœ์ง์˜ ์ผ๊ด€์„ฑ์„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

 

FrontControllerV1
@WebServlet(name = "frontControllerServletV1", urlPatterns = "/front-controller/v1/*") // v1์˜ ์–ด๋–ค url์ด ๋“ค์–ด์™€๋„ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ์„œ๋ธ”๋ฆฟ์ด ๋ฌด์กฐ๊ฑด ๋จผ์ € ํ˜ธ์ถœ
public class FrontControllerServletV1 extends HttpServlet {

    private Map<String, ControllerV1> controllerMap = new HashMap<>();

    // ์„œ๋ธ”๋ฆฟ์ด ์ƒ์„ฑ๋  ๋•Œ url์˜ ๋งคํ•‘ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ (Map์˜ ํ˜•ํƒœ: key=url, value=๊ฐ ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„ ๊ฐ์ฒด)
    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();// ์š”์ฒญ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” URI๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

        ControllerV1 controller = controllerMap.get(requestURI); // ๋‹คํ˜•์„ฑ ํ™œ์šฉ (์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ€์ ธ์˜ด)
        if(controller == null) { // ๋“ค์–ด์˜จ URI๊ฐ€ ์—†์„ ๋•Œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
             response.setStatus(HttpServletResponse.SC_NOT_FOUND);
             return;
        }

	// ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
        controller.process(request, response);
    }
}
  • urlPatterns๋ฅผ "/front-controller/v1/*"๋กœ ์„ค์ •ํ•˜๋ฉด /front-controller/v1๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํ•˜์œ„ ์š”์ฒญ์€ ์ด ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋“ค์–ด์˜จ๋‹ค.
  • controllerMap์—๋Š” ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ url ๋งคํ•‘ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด๋Š” ์„œ๋ธ”๋ฆฟ์ด ์ƒ์„ฑ๋  ๋•Œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋‹ค.
  • request.getRequestURI()๋กœ ์š”์ฒญ์œผ๋กœ ๋“ค์–ด์˜จ URI๋ฅผ key๋กœ ์‚ฌ์šฉํ•ด controllerMap์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. (๋‹คํ˜•์„ฑ)
  • ๋งŒ์•ฝ ์ปจํŠธ๋กค๋Ÿฌ ์ค‘ ์š”์ฒญ URI์™€ ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์—†์œผ๋ฉด NOT_FOUND ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ์œผ๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์— ๊ณตํ†ต์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” process() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

→ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋„์ž…ํ–ˆ๊ณ , Controller์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•ด์„œ ๋” ํ™•์žฅ์„ฑ ์žˆ๊ณ  ์ผ๊ด€์ ์œผ๋กœ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค!

 

โœ… v2 - View ๋ถ„๋ฆฌ

String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);

๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ทฐ๋กœ ์ด๋™ํ•˜๋Š” ๋ถ€๋ถ„์— ์ค‘๋ณต์ด ์žˆ๋‹ค.

 

๊ธฐ์กด์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง์ ‘ JSP๋ฅผ forward ํ•ด์ฃผ์—ˆ์ง€๋งŒ, ์ด์ œ Controller๋Š” MyView ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ FrontController์—๊ฒŒ ๋„˜๊ฒจ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด FrontController์—์„œ ๋ทฐ๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง์„ ์‹คํ–‰ํ•œ๋‹ค.

 

MyView
public class MyView {

    private String viewPath;

    public MyView(String viewPath) {
        this.viewPath = viewPath;
    }

    // ์„œ๋ธ”๋ฆฟ์—์„œ jsp๋กœ ์ด๋™ํ•ด์„œ ๋ Œ๋”๋ง ๋˜๋„๋ก ๋™์ž‘
    public void render(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);
    }
}

MyView ํด๋ž˜์Šค์—๋Š” ๋ทฐ์˜ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜์™€ JSP๋ฅผ forwardํ•ด์ฃผ๋Š” render() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

 

ControllerV2 ์ธํ„ฐํŽ˜์ด์Šค
public interface ControllerV2 {

    MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}

์ด์ œ ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  MyView ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ ๊ฐ ๋ทฐ์˜ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

 

FrontControllerV2
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„ v1๊ณผ ๋™์ผ

    MyView myView = controller.process(request, response);
    myView.render(request, response);
}
  • Map์—์„œ ๊ฐ€์ ธ์˜จ ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋กœ MyView ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š”๋‹ค. view.render()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ์— ๋งž๋Š” forward ๋กœ์ง์ด ์ˆ˜ํ–‰๋œ๋‹ค.

 

→ ์ด์ œ ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ง์ ‘ JSP๋ฅผ forward ํ•˜์ง€ ์•Š๊ณ , ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ์— ์ค‘๋ณต์œผ๋กœ ๋“ค์–ด๊ฐ”๋˜ forward ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

 

โœ… v3 - ๋ชจ๋ธ ์ถ”๊ฐ€

  • ์„œ๋ธ”๋ฆฟ ์ข…์†์„ฑ ์ œ๊ฑฐ : ์ปจํŠธ๋กค๋Ÿฌ ์ž…์žฅ์—์„œ request์™€ response ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋ฅผ ์ž๋ฐ”์˜ Map์œผ๋กœ ๋Œ€์‹  ๋„˜๊ธฐ๋„๋ก ํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋ธ”๋ฆฟ ๊ธฐ์ˆ ์„ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.
  • ๋ทฐ ์ด๋ฆ„ ์ค‘๋ณต ์ œ๊ฑฐ : ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ํŒŒ์ผ์˜ ํ™•์žฅ์ž ๋ถ€๋ถ„์„ ์ž‘์„ฑํ•˜๋Š” ๋ถ€๋ถ„์ด ์ค‘๋ณต๋œ๋‹ค. ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋…ผ๋ฆฌ ์ด๋ฆ„๋งŒ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๊ณ , ๋ฌผ๋ฆฌ ์œ„์น˜์˜ ์ด๋ฆ„์€ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜์ž. (์œ ์ง€๋ณด์ˆ˜ ํŽธ๋ฆฌ)

์ง€๊ธˆ๊นŒ์ง€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์„œ๋ธ”๋ฆฟ์— ์ข…์†์ ์ธ HttpServletRequest๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , Model๋„ request.setAttribute()๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๋ทฐ์— ์ „๋‹ฌํ–ˆ๋‹ค. ์ด๋ฒˆ ๋ฒ„์ „์—์„œ๋Š” ์„œ๋ธ”๋ฆฟ์˜ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด Model์„ ์ง์ ‘ ๋งŒ๋“ค๊ณ , ๋ทฐ์˜ ๋…ผ๋ฆฌ ์ด๋ฆ„์„ ๋ฌผ๋ฆฌ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฐ์ฒด๋„ ์ƒ์„ฑํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

 

ModelView
public class ModelView {

    private String viewName;
    private Map<String, Object> model = new HashMap<>(); // key=์ด๋ฆ„, value=๊ฐ์ฒด

    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 ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

ControllerV3
public interface ControllerV3 {

    ModelView process(Map<String, String> paramMap);
}
  • ์ด์ œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋ธ”๋ฆฟ ๊ธฐ์ˆ ์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. > ๊ตฌํ˜„ ๋งค์šฐ ๋‹จ์ˆœ, ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋„ ์‰ฌ์›Œ์ง
  • HttpServletRequest๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ paramMap์— ๋‹ด์•„์ค€๋‹ค.
  • ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋กœ์ง ์ˆ˜ํ–‰ ํ›„ ModelView๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

ํšŒ์› ์ €์žฅ ์ปจํŠธ๋กค๋Ÿฌ
public class MemberSaveControllerV3 implements ControllerV3 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    public ModelView process(Map<String, String> paramMap) {

        // ๊ธฐ์กด ๋ฐฉ์‹์ด์—ˆ๋˜ getParameter() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์€ front controller์—์„œ ์ฒ˜๋ฆฌํ•ด์คŒ
        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;
    }
}
  • ์ด์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” paramMap์—์„œ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๊บผ๋‚ด์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ModelView ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋…ผ๋ฆฌ ์ด๋ฆ„์„ ์ž…๋ ฅํ•œ๋‹ค.
  • ModelView ๊ฐ์ฒด์˜ model์— ๋ทฐ๋ฅผ ๋ Œ๋”๋ง ํ•  ๋•Œ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋‹ด๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

FrontControllerV3
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // ์ƒ๋žต

    Map<String, String> paramMap = createParamMap(request);
    // request, response ๋Œ€์‹  paraMap์„ ๋„˜๊ฒจ์ค˜์•ผ ํ•จ
    ModelView mv = controller.process(paramMap);

    String viewName = mv.getViewName();

    MyView view = viewResolver(viewName);// ๋…ผ๋ฆฌ ์ด๋ฆ„์„ ๋ฌผ๋ฆฌ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ”์คŒ
    view.render(mv.getModel(), request, response);

} // service

private MyView viewResolver(String viewName) {
    return new MyView("/WEB-INF/views/" + viewName + ".jsp");
}

private 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;
}
  • HttpServletRequest์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋ฅผ ๊บผ๋‚ด์„œ paramMap์— ๋„ฃ์–ด๋‘”๋‹ค.
  • ์ด๋•Œ ์ƒ์„ฑ๋œ paramMap์€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ „๋‹ฌ๋œ๋‹ค.
  • viewResolver ๋ฉ”์„œ๋“œ๋Š” ๋…ผ๋ฆฌ ์ด๋ฆ„์„ ๋ฐ›์•„ ๋ฌผ๋ฆฌ ๋ทฐ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์‹ค์ œ ๋ฌผ๋ฆฌ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” MyView ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • render()๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋ทฐ ๋ Œ๋”๋งํ•  ๋•Œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธด ๋ชจ๋ธ Map๋„ ๋„˜๊ฒจ์ค˜์•ผ ํ•œ๋‹ค.

 

MyView
public class 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);
    }

    // model์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ request์˜ attribute๋กœ ์„ค์ • -> JSP ์‚ฌ์šฉ ์‹œ ํ•„์š”
    private void modelToRequestAttribute(Map<String, Object> model, HttpServletRequest request) {
        model.forEach((key, value) -> request.setAttribute(key,value));
    }
}
  • MyView์—์„œ๋Š” ๋„˜์–ด์˜จ ๋ชจ๋ธ Map์„ ๊ฐ€์ง€๊ณ  ๊ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด request.setAttribute๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 


๊ฐ•์˜ ๋งํฌ

 

์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ  - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ์›น ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC์˜ ํ•ต์‹ฌ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., -

www.inflearn.com