JSP 모델 1

merci·2023년 1월 25일
post-thumbnail

JSP 모델 1

모델 1은 클라이언트의 요청을 jsp 가 처리
각각의 jsp파일은 서블릿으로 구동됨

  • 여러 jsp 생성
  • a.jsp 내용
<body>
<h1>a file</h1>
<%
	System.out.println("ip를 검사 합니다.");
	System.out.println("문자를 인코딩 합니다.");
	System.out.println("블랙리스트 사용자를 필터링 합니다.");
	System.out.println("데이터베이스를 연결 합니다.");
%>
</body>
  • b,c,d 에 같은 내용을 넣으려고 하면 불편 - 유지보수 최악

🔥 단점 - jsp 로 관리하면 공통적인 처리를 할 수 없다.





리팩토링 해보자 ( 메소드 이용 )

  • 클래스 생성
public class MyProcess {
	public static void init() {
		System.out.println("ip를 검사 합니다.");
		System.out.println("문자를 인코딩 합니다.");
		System.out.println("블랙리스트 사용자를 필터링 합니다.");
		System.out.println("데이터베이스를 연결 합니다.");
	}
}
  • jsp 파일
<body>
<h1>a file</h1>
<%
	MyProcess.init(); 
%>
</body>
  • 처음보다 조금 낫지만 b,c,d 에도 MyProcess.init(); 작성해야하는 불편함이 존재

  • MyProcess.init(); 를 비즈니스 로직이라고 간주하면 로직을 관리하기 힘들다
    ( 모두 수정해야함 )

  • 자연스럽게 기능을 분리시켜야 유지보수가 편하다는걸 알게 된다




기능 분리 ( 책임 분리 )

앞단에서 공통적인 처리를 해주자

  • FrontController.java 생성
@WebServlet("*.do")
public class FrontController extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, 
    		HttpServletResponse resp) throws ServletException, IOException {
		MyProcess.init(); // 여기에 공통적인 처리를 할 수 있다. ( FrontController 의 장점 )
//		System.out.println(req.getRequestURI()); // *.do 요청 - 콘솔에 ' /*.do '
		String path = req.getRequestURI();
		
		if ( path.equals("/a.do") ) {
			resp.sendRedirect("a.jsp"); // webapp 폴더를 root 폴더로 이용 - a.jsp 
		}else if( path.equals("/b.do") ) {
			resp.sendRedirect("b.jsp");
		}else if( path.equals("/c.do") ) {
			resp.sendRedirect("c.jsp");
		}else if( path.equals("/d.do") ) {
			resp.sendRedirect("d.jsp");
		}else {
			resp.sendRedirect("home.jsp");
		}
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
    			throws ServletException, IOException {
		
	}
}

🔥 단점 ! !

  • http://localhost:8080/a.jsp 로 요청하면 공통처리 X

  • 컨트롤러에서 뷰로 데이터 전달을 할수 없다.

  • 뷰에 다이렉트 접근이 가능

  • 설계의 중요성 ! - http://localhost:8080/a.jsp 같은 요청을 원천적으로 막아야 한다.

지금처럼
여러 jsp 를 하나의 서블릿( 프론트 컨트롤러 )이 연결시켜줄때
이 서블릿의 책임이 너무 많아진다 - 라우터, 공통처리, DB 연결 등
책임을 분리시켜야 할 필요가 있다




리다이렉트 / 포워드 구현

FrontController.java 의
else { resp.sendRedirect("home.jsp"); } 부분을 약간 수정

  • 리다이렉트
else {
	// 이 코드만 있으면 요청객체가 새롭게 생성
	req.setAttribute("name", "홍길동");     
	resp.sendRedirect("home.jsp");
}
<body>
	<%
	String name = (String)request.getAttribute("name");
	%>
	<h1>나의 이름은 : <%= name %></h1>  
</body>

  • 포워드
else {
	 req.setAttribute("name", "홍길동"); 
 	 req.getRequestDispatcher("home.jsp").forward(req, resp);
}

profile
작은것부터

0개의 댓글