22.03.15 Web Server MVC패턴5, FrontController, Command

FrontController pattern

  • Http를 상속받아 쓰이는데 자원을 많이 먹게됨!
  • 모든 요청을 하나의 서블릿으로 정의하는 패턴
  • 하나의 컨트롤러에서 요청을 제어할 수 있다. -> 서블릿 수를 줄임
  • 모든기능이 합쳐져있어서 결합도, 응집도가 높다. (가독성이 안좋음) => 우리가 지향하는 프로그래밍 설계 : 결합도 높고, 응집도 높은 형태
  • 중복되는 코드를 줄일 수 있고 보안 적용할때 하나의 서블릿에서 적용할 수 있다!
  • 로그인 해서 session 저장시 이름이 dto, info, member 등 다양해질 수 있어서 식별하기 어려움

Command pattern

  • 동일한 방식으로 실행하기 위한 인터페이스 이용 -> 서블릿에서 받은 요청을 처리할 클래스를 생성
  • 일정한 방식을 정의해놓은 파일 메소드명을 정해놓은대로 다른곳에서 사용함
  • 클래스 상속 extends vs 인터페이스 구현 implements
    상속은 확장의 개념 /인터페이스에서 정의한대로만 사용할 수 있다. 이행(구현)

FrontController & Command 패턴

  • 만들었던 모든 컨트롤러들을 하나의 컨트롤러로 정의함
  • 컨트롤러의 마지막 맵핑을 .do로 바꿔줌
    -> @WebServlet("*.do")
  • 모든 컨트롤러의 내용을 복사 붙여 넣으면 가독성이 떨어지고 구분이 힘듦
    -> command패턴 사용하기

메인 -> FC 에 요청, FC는 어떤요청인지 구분만 -> 해당 기능이 있는 클래스파일로 전달 ->요청값을 가져와 DAO(값 조회,수정,삭제 등) DB에 접근해 값을 다시 FC로 보내줌 -> FC에서 페이지 이동을 판단해줌(.java, .jsp등)

request.getContextPath() : 프로젝트 Path만 --> /project
request.getRequestURI() : 프로젝트 + 파일경로까지
--> /project/loginServiceCon
request.getRequestURL() : 전체 경로 --> http://localhost:8090/MessageSystem/goMain
request.ServletPath() : 파일명만 --> /loginServiceCon

Str.substring(index) : index부터 문자열 시작

  • 어떤기능을 하는 문자열인지 판단하기 위해서, String command에 uri를 추출해서 if문으로 판단
    /까지 가져오기때문에 substring은 +1번째 인덱스부터 추출

  • inter패키지에 interface를 정의

package inter;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.rowset.serial.SerialException;

public interface command {
	//실행 메소드를 정의
	//request, response 가지고 갈 수 있도록
	
	public String execute(HttpServletRequest request, HttpServletResponse response) throws ServerException, IOException;
}
  • service 패키지에 interface를 상속받는 클래스를 생성

    -->command 인터페이스 상속
    --> 메소드 오버라이딩 / 리턴 String / 메소드 안에 앞에 했던 컨트롤러 내용복사
    --> 페이지 이동시켜주는 문자열을 리턴

FC에서 요청인식,판단하고 클래스에서 요청을 수행하게됨>> 인터의 클래스 - 결과값으로 이동할 페이지의 주소값만 넘겨줌 리턴이 String

컨트롤러에서 값을 받아오고 돌려주는 response기능 -> 요청하고 요청의 결과로 페이지 이동을 컨트롤러에서 해줌

여러객체 불러올 필요없이 부모클래스가 가지고있는 하위클래스가 재정의(오버라이딩)

package Controller;

import java.io.IOException;
import java.io.PrintWriter;

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 javax.servlet.http.HttpSession;

import Model.MemberDAO;
import Model.MemberDTO;
import Model.MessageDAO;
import Model.MessageDTO;
import Service.DeleteService;
import Service.IdCheckService;
import Service.JoinService;
import Service.LoginService;
import Service.LogoutService;
import Service.MsgService;
import Service.UpdateService;
import inter.command;

//.do로 끝나는 문자열 맵핑
@WebServlet("*.do")
public class FrontController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("frontController 실행");
		// 프론트 컨트롤러 패턴 : 모든 요청을 하나의 서블릿으로 정의하는 패턴
		// 중복되는 코드를 줄일 수 있고 보안 적용할때 하나의 서블릿에서 적용할 수 있다!

		String nextpage = "";
		command com = null;
		// 여러객체 불러올 필요없이 부모클래스가 가지고있는 하위클래스가 재정의(오버라이딩)
		// com객체에 service 패키지의 각 객체 담아주기
		// com에있는 execute()메소드 호출해서 리턴값 nextpage담아주기

		// 어떤기능을 수행하는 문자열인지 판단
		String uri = request.getRequestURI();
		System.out.println(uri);
		String path = request.getContextPath();
		System.out.println(path);
		String command = uri.substring(path.length() + 1);  //0번부터 문자열이 시작되는 시작위치
		System.out.println(command);
        
		if (command.equals("LoginServiceCon.do")) {
			com = new LoginService();
			nextpage = com.execute(request, response);
		} else if (command.equals("JoinServiceCon.do")) {
			com = new JoinService();
			nextpage = com.execute(request, response);
		} else if (command.equals("MsgCon.do")) {
			com = new MsgService();
			nextpage = com.execute(request, response);
		} else if (command.equals("LogoutServiceCon.do")) {
			com = new LogoutService();
			nextpage = com.execute(request, response);
		} else if (command.equals("idCheckServiceCon.do")) {
			com = new IdCheckService();
			nextpage = com.execute(request, response);
		} else if (command.equals("UpdateServiceCon.do")) {
			com = new UpdateService();
			nextpage = com.execute(request, response);
		} else if (command.equals("DeleteServiceCon.do")) {
			com = new DeleteService();
			nextpage = com.execute(request, response);
		}
		if (nextpage != null) {
			response.sendRedirect(nextpage);
		}
	}

}

좋은 웹페이지 즐겨찾기