bdfgdfg

모델2(MVC) 방식 작업 본문

웹프로그래밍/JSP_Servlet

모델2(MVC) 방식 작업

marmelo12 2023. 8. 13. 22:20
반응형

모델2 방식

기존 모델1 방식은 이때까지 작업하던 방식.

즉. 화면을 처리하는 로직과 비즈니스 로직이 하나의 jsp에 같이 담겨있는 것.

이렇게되면 기능 구현은 쉽지만 유지보수에는 어렵다는 단점이 있음.

 

그렇기에 나온 방식이 모델2방식(MVC가 뼈대).

각 기능(클라이언트의 요청 처리, 응답 처리, 비즈니스 로직 처리)들을 분리해서 구현하자는것이 핵심.

 

모델 2구조에는 여러가지 개념이 있지만 가장 근본이되며 자주 사용되는 개념이 MVC 디자인패턴

MVC : Model-View-Controller의 약자.

 - 화면 부분, 요청 처리 부분, 로직 처리 부분으로 나누어 개발하는 방

컨트롤러는 사용자로부터 요청을 받으면 어떤 비즈니스 로직을 처리해야할지 제어.

모델은 db연동같은 비즈니스로직을 처리하며

뷰는 모델에서 처리한 결과를 화면에 구현하여 클라이언트로 전송.

좀 더 자세히보면 컨트롤러의 역할은 서블릿이 담당한다. 모델은 DAO나 VO클래스로 이루어지며 뷰 역할은 JSP가 담당.

 

간단히 mvc를 통한 회원정보 조회 기능 예제를 본다.

@WebServlet("/mem.do")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private MemberDAO memberDAO;
	
    public MemberController() {
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public void init() throws ServletException
    {
    	memberDAO = new MemberDAO();
    }
    @Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}
    @Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
	
	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
        //모델
		List<MemberVO> membersList = memberDAO.getListMembers();
		//포워딩을 위한 바인딩.
		request.setAttribute("membersList", membersList);
		RequestDispatcher dispatch = request.getRequestDispatcher("listMembers.jsp");
        // (뷰)
		dispatch.forward(request, response);
	}
}

여기서는 단순히 회원정보 조회만 처리했기에 감이 잘 안잡히는데. 여기서 회원 등록까지 추가해보자.

우선 컨트롤러가 어떤 요청인지를 이해하고 필요한 모델을 호출해야한다.

 -> 이러한 패턴을 커맨드패턴이라고함.

 

여러가지 요청은 서블릿의 URL패턴을 이용해서 구현할 수 있는데 간단히 보면 밑과 같다.

@WebServlet("/members/*")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private MemberDAO memberDAO;
	
    public MemberController() {
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public void init() throws ServletException
    {
    	memberDAO = new MemberDAO();
    }
    @Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
    	doHandle(request,response);response.getWriter().append("Served at: ").append(request.getContextPath());
	}
    @Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doHandle(request,response);
	}
	
	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		// 포워딩 될 page를 담는 String.
		String nextPage = null;
		
		// URL에서 요청명을 가져옴
		String action = request.getPathInfo();
		
		if(action == null || action.equals("/listMembers.do")) {
			// 회원 정보 조회처리(request에 회원정보담기)
			nextPage = "listMembers.jsp";
		}
		else if(action.equals("/addMember.do")) {
			// 회원 정보 추가처리~
			nextPage = "/member/listMembers.do";
		}
		else if(action.equals("/memberForm.do")) {
			// 회원가입창 요청
			nextPage = "memberForm.jsp";
		}
		else {
			// 아무것도 해당되지않으면 그냥회원출력
			// 회원 정보 조회처리(request에 회원정보담기)
			nextPage = "listMembers.jsp";
		}
		
		
		RequestDispatcher dispatch = request.getRequestDispatcher(nextPage);
		dispatch.forward(request, response);
	}
}

여기서 수정 삭제도 위에서 로직을좀 더 추가해주면 끝이다.

 

즉 핵심은 요청을 받으면 톰캣이 우리의 서블릿 함수를 호출해주면 서블릿 자체에서는 컨트롤러의 역할을 하면 되고

실제 등록,조회,수정,삭제등의 로직은 모델(DAO,VO), 보여주는건 View!

반응형

'웹프로그래밍 > JSP_Servlet' 카테고리의 다른 글

JSP 이해  (0) 2023.10.30
톰캣 프로젝트 Add 안되는경우  (0) 2023.10.25
JSP - 2  (0) 2023.08.11
JSP  (0) 2023.08.11
서블릿에서의 쿠키와 세션  (0) 2023.08.10
Comments