-
Servlet을 통한 MVC 모델 구현 개인정리자바 초보개발/JSP-Servlet 2024. 1. 4. 17:46
지난번에 MVC모델을 자바와 JDBC만 가지고 구현했을 때와 다르게, Servlet과 Jsp, 그리고 여러 라이브러리를 추가해서 사용하고, 프록시 객체를 추가하는 등 복잡한 처리과정이 추가되서, 한번 개인적으로 정리하는 시간을 가지려고 한다.

MVC모델/servlet 우선 가장 눈에띄게 바뀐 것은 FrontController 역할을 하는 DispatcherServlet이 추가된 것이다.
DispatcherServlet은 주로 Init 메서드와 service , get 혹은 post메서드가 있는 곳이다.
Init 메서드는 서버가 실행될 때 한번 실행되는 곳이기 때문에, 메모리에 올려두고 계속 사용할 객체들을 생성,조립하는 과정을 담당한다.
service 등의 메서드는 내가 주소창에 입력하는 주소를 입력받아서, 해당 주소에 따라 어떤 컨트롤러를 실행할 것인지 판단한다. 이 메서드를 통해 DispatcherServlet은 주소를 입력받을 때 가장 먼저 반응하는 프론트 컨트롤러 역할을 수행한다.
uri를 분석하여 해당하는 모듈의 컨트롤러를 실행한다. 그리고 마지막으로 도달해야할 jsp 파일 주소를 처리한다.
컨트롤러에서는 요청에 따라 필요한 Service 객체를 실행하고, 그 뒤에 어떤 jsp경로로 가야할지 구분해준다.
컨트롤러에서 service객체를 실행할 때, Execute 객체를 거쳐서 service를 실행하게 되는데, 아직까진 이러한 단계가 그저 직관성이 떨어지게 하는 불편한 단계로만 느껴진다.
하지만 여러 기능들이 점점 추가되고, 보안의 중요성이 올라갈수록 이런 단계가 필요하다고 한다.
public class Execute {
public static Object service(Service service, Object obj) throws Exception{
//
System.out.println
("+=======================================================================+");
// Class 라는 클래스 - getSimpleName() - 클래스 이름만 가져온다.
// Class 라는 클래스 - getName() - 클래스 이름과 패키지를 가져온다.
System.out.println("+ 실행되는 객체(Service) - " + service.getClass().getSimpleName());
System.out.println("+ 넘어가는 데이터 : " + obj);
long start = System.nanoTime();
Object result = service.service(obj);
long end = System.nanoTime();
System.out.println("+ 실행 결과 데이터 : " + result);
System.out.println("+ 실행 소요 시간(ns) : " + (end-start));
System.out.println
("+=======================================================================+");
return result;
}
}
자바와 JDBC만 가지고 했을때는 long result = new BoardUpdateService(보내줄 값들) 과 같이 직관성이 어느정도 있는 방식으로 결과를 저장했는데,
이제는 Object result = Execute.service (Init.serviceMap.get(uri), 넘어가는 데이터 ) 와 같이 보내야 한다.
서비스를 직접 실행했었는데, 서비스를 실행해주는 객체를 거쳐 서비스를 실행하게 된 것이다.
*서버를 구동시킬 때는 여러명의 사용자가 요청할 때마다 객체를 생성하면 부하가 늘 수 있기 때문에, serviceMap과 controllerMap등 Map 자료구조를 만들어서, 그 안에 저장된 하나의 객체를 사용자에게 순차적으로 이용하게 만들었다.
정말 중간중간 Execute 메서드에 들어가는 service는 대체 무엇이고, Object는 대체 뭐가들어가는지 알 수가 없어서 많이 답답했는데, 이클립스의 디버그 모드를 실행하면 해당 객체들에 어떤 값이 들어가 있는지 볼 수 있다.
-- response.sendRedirect()와 request.getRequestDispatcher()의 차이.
실습중에 이 두개의 차이가 무엇인지 많이 궁금했다. 결과적으로 둘다 다른 jsp 파일로 이동시키는 메서드이지만, sendRedirect는 클라이언트에게 새로운 url로 이동을 요청하고, 이에 따라 request 객체가 새로 생성되고 기존 request 객체는 버려진다.
getRequestDispatcher()의 경우 클라이언트에게 새로운 요청 없이, 서버 내에서 이동시켜 request 객체가 유지된다고 한다. 포워딩이라고 하는 것 같다.
'자바 초보개발 > JSP-Servlet' 카테고리의 다른 글
다른 jsp파일을 현재 jsp파일 페이지에 불러오기 - include (0) 2024.01.17 [오류] For input String : "null" 와 Missing end tag for "c : out" (0) 2024.01.08 JSP/Servlet에서의 파일 업로드 (0) 2023.12.26 쿠키와 세션 (0) 2023.12.22 JSP/Servlet 이클립스 기본설정,정보 (0) 2023.12.13