본문 바로가기

Spring/Model1 _2(MVC)

0929 JSP - (MVC) 모델2, MVC 패턴

728x90
반응형

Contents

    모델1 설계방식

     

    Model1 설계방식은 JSP와 JavaBean만 사용하여 웹을 개발하는 구조이다.

    JavaBean은 Model의 기능을 수행하며 자바 객체를 의미한다. 따라서 JavaBean은 데이터베이스 연동에 사용되는 자바 객체들이다.

    Model1 설계방식에서는 JSP 파일이 Controller와 View 기능을 모두 처리하는 중요한 역할을 수행한다. Controller는 JSP 파일에 작성된 사용자의 요청관련 처리와 관련된 자바코드를 의미한다.

    또한, JSP 파일의 View 기능은 사용자에게 화면을 제공하기 위해 HTML, CSS와 같이 마크업 언어를 사용한다.

    결과적으로 JSP파일에 자바 코드와 마크업 언어 코드들이 뒤섞여 역할 구분이 모호하고, 유지보수에 어려움이 있을 수밖에 없다.

     

    모델1 설계 방식의 장단점

    -장점

    • 개발속도가 빠르다.
    • 개발자의 기술적인 숙련도가 낮아도 배우기 쉬워 빠르게 적용할 수 있다.

    -단점

    • JSP 파일에서 프리젠테이션 로직과 비즈니스 로직이 혼재되어 복잡하다.
    • 로직의 혼재로 인해 개발자와 디자이너의 작업 분리에 어려움이 있다.
    • JSP 코드의 복잡도로 인해 유지보수가 어렵다.

     

    최근 어플리케이션이 복잡해지고 사용자의 요구가 증가하면서 새로운 개발방식이 필요하게 되었고, 모델1 설계방식의 단점을 보완하기 위해 만들어진 설계방식이 모델2, MVC 설계방식이다.


    모델2 설계방식 (MVC)

     

    Model2 설계방식은 어플리케이션의 역할을 Model - View - Controller 로 분리한 설계방식이다.

     

    Model은 비즈니스 로직을 담당하며 JavaBean으로 구현한다. Business Service의 경우 비즈니스 로직의 workflow를 관리하고, DAO(Data Access Object)는 데이터베이스와 연동하는 비즈니스 로직을 처리한다. DTO(Data Transfer Object) 또는 VO(Value Object)는 계층간 데이터 교환을 위한 JavaBeans를 말한다.

    View는 클라이언트에게 응답을 처리하며, JSP로 구현한다.

    Controller는 클라이언트의 요청을 받아 Model과 View 사이에서 일의 흐름을 조정하는 역할을 수행한다. 클라이언트의 요청을 받아 클라이언트가 보낸 데이터를 읽고 검사하며, Model에게 비즈니스 로직을 요청한다. Model의 처리 결과에 맞는 View에게 응답을 요청한다. Controller는 서블릿으로 구현한다.

     

    모델2 설계 방식의 장단점

    -장점

    • 비즈니스 로직과 프리젠테이션 로직의 분리로 인해 어플리케이션이 명료해지며 유지보수와 확장이 용이하다.
    • 개발자와 디자이너의 작업 분리가 용이하다.

    -단점

    • 개발 초기에 아키텍처 디자인을 위한 시간의 소요로 개발 기간이 늘어난다.
    • MVC구조에 대한 개발자들의 이해가 필요하다.

     

    출처: https://chaengstory.tistory.com/111?category=967467

     

     


    MVC 

    Model (객체) + View (출력) + Controll(처리)

     

     (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다.

    소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다.

     

     

    model2 방식으로 개발 (디자인 영역과 비지니스로직의 분리) 

     

     

     

    MVC  패턴

    Model       View    Controller 
    비지니스 로직처리 (디비 사용)
    .java파일 (P lang 0 ld J ava O bject) 
    화면 UI (디비 사용 x)
    .jsp
    model, view 사이의 연결
    .java (Servlet)  

     

     

     

    사용자 요청 → web.xml  →  C  ↔   M  ↔   MySql/Oracle
      (배포서술자)    
        V    

      

     

     

    사용자 요청 → web.xml  →  FC  ↔  M [ C / M (DAO) ]  ↔   MySql/Oracle
      (배포서술자)    
        V    

      
     


       
    관심사의 분리

    하나의 목표를 위해서 일을 따로 한다. 
    => 이렇게 하면 좋은 점 :  좋은 코드를 만들수 있다.  

     

     

     

     

     

     

    com.itwillbs.action;
    BoardFrontController

     

    컨트롤러 

    주소값을 받아주는 변수를 만들어서 .equals를 적용시켜서 페이지들이 리턴.

    리턴 해주는 주소 값을 비교하여 View와 Model사이를 이동하는 역할.

    주소 값이 true일 때와 false일 때의 이동 방식(포워딩)을 정해주는 역할을 한다.

     

    package com.itwillbs.action;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    // 컨트롤러 -> 서블릿 
    @WebServlet("/board2")
    public class BoardFrontController extends HttpServlet {
    	//http://localhost:8088/MVC/board  (web.xml 매핑)
    	//http://localhost:8088/MVC/board2 (어노테이션)
    
    	//alt shift s + v
    	@Override
    	protected void doGet(HttpServletRequest request, 
    			HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("BoardFrontController - doGet() 호출");
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest request, 
    			HttpServletResponse response) throws ServletException, IOException {
    	
    	}
    
    }

    extends HttpServlet상속을 해야 컨트롤러의 역할이 가능하다. 

     

    web.xml
    <!-- 서블릿 매핑 -->
    <servlet>
    	<servlet-name>BoardFrontController</servlet-name>
    	<servlet-class>com.itwillbs.action.BoardFrontController</servlet-class>
    </servlet>
    <servlet-mapping>
    	<servlet-name>BoardFrontController</servlet-name>
    	<url-pattern>/board</url-pattern>
    </servlet-mapping>

     

     

    webapp
    index.jsp

     

    이제는 jsp 페이지를 실행 할 일이 없다!

    직접 실행하면 잘못 된 것~

     

    • 프로젝트의 시작 지점 
    • MVC 프로젝트 사용하면서 실행가능한 유일한 jsp 파일 
    • url에 ~~~.jsp 페이지 주소 나오면 잘못 실행 한 것. 


    	<%
    	//response.sendRedirect("./board");
    	response.sendRedirect("./test.bo");
    	
    	%>

     

     

     

     

     

    com.itwillbs.action;
    BoardFrontController
    package com.itwillbs.action;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    // 컨트롤러 -> 서블릿 
    //: 주소가 ~~~.bo 주소의 형태면 해당 컨트롤러 처리
    
    @WebServlet("*.bo")   
    public class BoardFrontController extends HttpServlet {
    	//http://localhost:8088/MVC/board  (web.xml 매핑)
    	//http://localhost:8088/MVC/board2 (어노테이션)
    
    	//프로세스는 오버라이드 x 
    	protected void doProcess(HttpServletRequest request, 
    			HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("BoardFrontController - doProcess() 호출");
    		System.out.println(" GET / POST 방식 상관없이 한번에 처리 ");
    	
    		
    		
    		
    		
    	
    //	*********************************************1.가상주소계산*****************************************************
    //	♥1단계♥
    //	System.out.println(request.getrequestURI());   //프로토콜,아이피,포트번호를 제외한 게 uri (웹실행주소)
    //	System.out.println(request.getRequestURL());   //프로토콜o 아이피 o 포트번호 o 
    
    	System.out.println(" C : (1단계 시작) 가상주소 계산 시작----------------------------------" );
    	String requestURI = request.getRequestURI();
    	System.out.println(" C: requestURI : " + requestURI);
    
    	String ctxPath = request.getContextPath();
    	System.out.println(" C : ctxPath언니화이팅 : " + ctxPath);
    	
    	String command = requestURI.substring(ctxPath.length());
    	System.out.println(" C : command : " + command);
    	
    	
    	System.out.println(" C : (1단계 끝) 가상주소 계산 완료----------------------------------" );
    	
    //	*********************************************2.가상주소계산*****************************************************
    	
    	
    	
    	
    	
    	
    	
    //	*********************************************1.가상주소매핑*****************************************************
    //	♥2단계♥
    	System.out.println(" C : (2단계 시작) 가상주소 매핑 시작----------------------------------" );
    	
    	ActionForward forward = null;
    			
    	if(command.equals("/BoardWrite.bo")) {
    		System.out.println("C : /BoardWrite.bo 호출");
    		System.out.println("C : [패턴1] DB 사용 x, view 페이지 이동");
    		
    		forward = new ActionForward();
    		forward.setPath("./board/writeForm.jsp");
    		forward.setRedirect(false);
    		
    	}
    	
    	System.out.println(" C : (2단계 끝) 가상주소 매핑 완료----------------------------------" );
    //	*********************************************2.가상주소매핑*****************************************************
    	
    	
    	
    	
    	
    //	*********************************************1.페이지 이동*****************************************************
    //	♥3단계♥
    	System.out.println(" C : (3단계 시작) 페이지 이동 시작----------------------------------" );
    	
    	if(forward != null) { //이동 정보가 있을 때
    		if(forward.isRedirect()) { //true
    			System.out.println(" C : 이동방식 : " + forward.isRedirect() + ", 주소 : " + forward.getPath());
    			response.sendRedirect(forward.getPath());
    			
    		}else { //false 
    			System.out.println(" C : 이동방식 : " + forward.isRedirect() + ", 주소 : " + forward.getPath());
    			
    			RequestDispatcher dis 
    				=request.getRequestDispatcher(forward.getPath());
    			dis.forward(request, response);
    		}
    	}
    	
    	
    	System.out.println(" C : (3단계 끝) 페이지 이동 완료----------------------------------" );
    //	*********************************************2.페이지 이동*****************************************************
    	
    	}//doProcess
    	//alt shift s + v
    	@Override
    	protected void doGet(HttpServletRequest request, 
    			HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("BoardFrontController - doGet() 호출");
    		doProcess(request, response);
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest request, 
    			HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("BoardFrontController - doPost() 호출");
    		doProcess(request, response);
    	}
    
    }

    @WebServlet은 밑에 코드랑 꼭 붙어있어야함..

     

    1단계

     

     

    2단계

    actionForward라는 객체를 만들어서 이동할 준비 시킴.  < < 열차 티켓 같은 역할 > > 

     

    set, get을 만듬 

     

    이동 방식 :

    true : redirect 방식 이동

    false : forward 방식 이동 

               

     

    3단계

    sendRedirect냐, forward냐..

     

    index.jsp 를 실행해서 작동시키기. 

    주소줄에 .jsp 가 나오면 안된다. 


     

    ./  의 의미..? 

    .은 프로젝트 명

    MVC 2단계에서는 .이 없는 가상주소로만 동작을 할 것. 

     

     

     

     

     

    com.itwillbs.action;
    ActionForward

     

    컨트롤러에서 페이지 이동할 때 필요한
    이동 주소, 이동 방법을 저장하는 객체

     

     

     

    /이동 방법

    이동 방법  
    true  :  redirect 방식 이동 
    false : forward 방식 이동 

     

     

     

    isRedirect   =  get 메서드 

    이름이 is로 시작되는 메서드는 get 메서드이다. 

     

    변수명이 is 로 시작하면, 거의 출력 값이 true / false 이다. (boolean일 것이다.)

     

     

    package com.itwillbs.action;
    
    public class ActionForward {
    	//컨트롤러에서 페이지 이동할 때 필요한
    	//이동 주소, 이동 방법을 저장하는 객체
    	
    	private String path;   // 이동 주소 
    	private boolean isRedirect;  // 이동 방법 
    	
    	
    	public ActionForward() {
    		System.out.println(" 페이지 이동 준비 (티켓 준비) ");
    	}
    	
    	
    	
    	public String getPath() {
    		return path;
    	}
    	public void setPath(String path) {
    		this.path = path;
    	}
    	public boolean isRedirect() {
    		return isRedirect;
    	}
    	public void setRedirect(boolean isRedirect) {
    		this.isRedirect = isRedirect;
    	}
    	
    	//이동 방법 - true  : redirect 방식 이동 
    //				- false : forward 방식 이동 
    	
    }

     

     

    jsp폴더에 있는 board/writeForm.jsp 파일을 복붙 해오니, 

    그대로 페이지가 열어짐! 

     

    이제 writeForm.jsp 로 가서 필요한 동작들을 구현해볼 것. 

     

     

    728x90
    반응형

    'Spring > Model1 _2(MVC)' 카테고리의 다른 글

    0930 JSP - (MVC) writeForm.jsp , interface 인터페이스  (0) 2022.09.30
    0930 JSP - Lombok  (0) 2022.09.30
    0929 JSP - jstl 커스텀 액션  (0) 2022.09.29
    0927 JSP - JSTL (JSP Standard Tag Library)  (0) 2022.09.27
    0926 JSP - servlet  (0) 2022.09.26