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);
}
}
}
Author And Source
이 문제에 관하여(22.03.15 Web Server MVC패턴5, FrontController, Command), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ggg4155/22.03.15-Web-Server-MVC패턴5-FrontController-Command저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)