패캠 JAVA 10일차
자바 웹프로그래밍 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);
}
}
}