자바 웹프로그래밍 2기 강의 10일차 내용을 정리한 포스팅입니다.

각 전문가가 만나는 접점

  • 관심사 확대.. (ex. devops)

  • 한분야 깊게해보고 넓게 다른분야로 펼쳐 나가기

MVC, DI, AOP, IOC

  • MVC 패턴에서는 뷰에 해당하는 영역을 바로 접근하지 않도록 제한한다.

모델1

  • 모든 코드가 JSP에 들어가는 구조

  • 뷰딴에 로직이 들어가는 문제점이 발생 (유지보수가 힘들어진다.)

    • 유지보수 힘들어짐 / 테스팅(JUnit)이 어려워진다.

모델2 (MVC)

  • 사용자의 요청은 컨트롤러를 타고 들어와서

  • 컨트롤로가 비지니스 로직을 타고 와서 모델에담고

  • 뷰는 단순히 보여준다.

Spring도 결국에는 Servlet 기반이다. (HTTP -> Servlet -> MVC Framework -> Spring Framework -> Spring boot)

Servlet(얕게) + Servlet Filter(약간 깊게 : AOP, Interceptor와 연관) 정도는 공부하자

객체지향과 관점지향은 약간은 별개의 개념이다. 객체지향을 보완하기 위해서 AOP를 사용한다.

tomcat (servlet container)

  • default : / -> index.html, index.htm, index.jsp

  • localhost:8080/user -> webapp/user/index.html

RequestMapping


package core.web.request;

import next.controller.*;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by 강홍구 on 2016-12-22.
 */
public class RequestMapping {
    private Map<String, Controller> requestMap;

    public RequestMapping () {
        requestMap = new HashMap<>();
        this.initMap();
    }

    public void initMap () {
        requestMap.put("/", new HomeController());
        requestMap.put("/users/login", new LoginController());
        requestMap.put("/users/create", new CreateUserController());
        requestMap.put("/users", new ListUserController());
        requestMap.put("/users/profile", new ProfileController());
        requestMap.put("/users/logout", new LogoutController());
        requestMap.put("/users/update", new UpdateUserController());
        requestMap.put("/users/updateForm", new UpdateUserController());
        requestMap.put("/users/form", new ForwardController("/user/form.jsp"));
        requestMap.put("/users/loginForm", new ForwardController("/user/login.jsp"));

    }

    public Controller getController (String path) {
        return requestMap.get(path);
    }

}


DispatcherServlet 은 하나다


package core.web.servlet;

import core.web.request.RequestMapping;
import core.web.resolver.ViewResolver;
import next.controller.Controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by 강홍구 on 2016-12-22.
 */

@WebServlet(name = "dispatcher", urlPatterns = "/", loadOnStartup = 1)
public class DispatcherServlet extends HttpServlet{
    private RequestMapping requestMapping;
    Logger log = LoggerFactory.getLogger(DispatcherServlet.class);

    // 한번만 호출
    @Override
    public void init() throws ServletException {
        log.info("INIT");
        requestMapping = new RequestMapping();
    }

    // 매 요청에 실행
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("SERVICE");
        String uri = req.getRequestURI();

        Controller controller = requestMapping.getController(uri);;

        String path = controller.execute(req,resp);
        log.info("SERVICE PATH - {}", path);

        ViewResolver.resolve(req,resp, path);
    }

    @Override
    public void destroy() {
        log.info("DESTROY");
    }
}


ViewResolver


package core.web.resolver;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by 강홍구 on 2016-12-22.
 */
public class ViewResolver {
    private static final String PREFIX_URI_REDIRECT= "redirect";

    public static void resolve (HttpServletRequest req, HttpServletResponse resp, String path) throws ServletException, IOException {
        if (path.startsWith(PREFIX_URI_REDIRECT)) {
            resp.sendRedirect(path.split(":")[1]);
        } else {
            RequestDispatcher rd = req.getRequestDispatcher(path);
            rd.forward(req, resp);
        }
    }

}