728x90
FrontController
웹 애플리케이션의 디자인 패턴 중 하나로, 클라이언트 요청을 처리하기 위한 중앙 집중적인 컨트롤러 역할을 하는 컴포넌트
FrontController의 특징
- 중앙 집중적인 컨트롤러
- 모든 클라이언트 요청을 중앙에서 처리함
- 코드 중복을 줄이고 애플리케이션의 일관성을 유지함
- 루틴 기능 분배
- 클라이언트 욫멍에 따라 적절한 컨트롤러나 핸들러로 요청을 보냄
- 이를 통해 요청을 처리할 컴포넌트가 모듈화되고 유연한 구조를 가질 수 있음
- 전처리 및 후처리 작업
- 클라이언트 요청을 처리하기 전에 전처리 작업(입증, 권한 확인 등)과 후처리 작업(로깅, 통계 수집 등)을 수행할 수 있음
- 커맨드 패턴 활용
- 각 요청에 대한 구체적인 처리 로직은 커맨드 객체로 캡슐화 됨
- 뷰 관리
- 요청 처리가 완료되면 FrontController는 적절한 뷰를 선택하고 뷰를 랜더링하여 클라이언트에 반환함
- 개선된 유지보수성
- 새로운 기능을 추가하거나 기존 기능을 변경할 때, FrontController 만 수정하면 되므로 코드 중복을 방지하고 일관성을 유지하기 쉬워짐
실습
현재까지 해왔던 MVC 패턴의 Controller.jsp 에서 FrontController.java 로 변경하는 실습
기존 controller
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.ArrayList,model.BoardVO" %>
<jsp:useBean id="bDAO" class="model.BoardDAO" />
<jsp:useBean id="mDAO" class="model.MemberDAO" />
<jsp:useBean id="mVO" class="model.MemberVO" />
<jsp:setProperty property="*" name="mVO" />
<jsp:useBean id="bVO" class="model.BoardVO" />
<jsp:setProperty property="*" name="bVO" />
<%
String action=request.getParameter("action");
System.out.println("로그: controller.jsp");
System.out.println("action: "+action);
System.out.println("bVO: "+bVO);
System.out.println("mVO: "+mVO);
if(action.equals("main")){
ArrayList<BoardVO> datas=bDAO.selectAll(null);
request.setAttribute("datas", datas);
request.getRequestDispatcher("b_main.jsp").forward(request, response);
}
else if(action.equals("board")){
bVO=bDAO.selectOne(bVO);
if(bVO!=null){
request.setAttribute("data", bVO);
request.getRequestDispatcher("d_board.jsp").forward(request, response);
}
}
else if(action.equals("login")){
mVO = mDAO.selectOne(mVO);
if(mVO==null){
out.println("<script>alert('로그인 실패...');history.go(-1);</script>");
}
else{
session.setAttribute("mid", mVO.getMid());
response.sendRedirect("controller.jsp?action=main");
}
}
else if(action.equals("logout")){
session.removeAttribute("mid");
response.sendRedirect("controller.jsp?action=main");
}
else if(action.equals("signupPage")){
response.sendRedirect("e_signup.jsp");
}
else if(action.equals("signup")){
boolean flag=mDAO.insert(mVO);
if(flag){
out.println("<script>alert('회원가입 성공! 로그인후에 이용하세요! :D');location.href='controller.jsp?action=main';</script>");
}
else{
out.println("<script>alert('회원가입 실패...');history.go(-1);</script>");
}
}
else if(action.equals("insertBoardPage")){
response.sendRedirect("c_insertBoard.jsp");
}
else if(action.equals("insertBoard")){
boolean flag=bDAO.insert(bVO);
if(flag){
out.println("<script>alert('게시글 작성 성공!');location.href='controller.jsp?action=main';</script>");
}
else{
out.println("<script>alert('게시글 작성 실패...');history.go(-1);</script>");
}
}
else if(action.equals("updateBoard")){
boolean flag=bDAO.update(bVO);
if(flag){
out.println("<script>alert('게시글 변경 성공!');location.href='controller.jsp?action=board&num="+bVO.getNum()+"';</script>");
}
else{
out.println("<script>alert('게시글 변경 실패...');history.go(-1);</script>");
}
}
else if(action.equals("deleteBoard")){
boolean flag=bDAO.delete(bVO);
if(flag){
response.sendRedirect("controller.jsp?action=main");
}
else{
out.println("<script>alert('게시글 삭제 실패...');history.go(-1);</script>");
}
}
else if(action.equals("mypagePage")){
response.sendRedirect("mypage.jsp");
}
else if(action.equals("mypage")){
///// mVO.setMid((String)session.getAttribute("mid"));
mVO=mDAO.selectOne(mVO);
if(mVO!=null){
request.setAttribute("data", mVO);
request.getRequestDispatcher("f_mypage.jsp").forward(request, response);
}
else{
out.println("<script>alert('비밀번호 불일치...');history.go(-1);</script>");
}
}
else if(action.equals("updateMember")){
boolean flag=mDAO.update(mVO);
if(flag){
out.println("<script>alert('회원정보 변경 성공! 로그인후에 이용하세요! :D');location.href='controller.jsp?action=logout';</script>");
}
else{
out.println("<script>alert('회원정보 변경 실패...');history.go(-1);</script>");
}
}
else if(action.equals("deleteMember")){
boolean flag=mDAO.delete(mVO);
if(flag){
out.println("<script>alert('회원탈퇴 성공!');location.href='controller.jsp?action=logout';</script>");
}
else{
out.println("<script>alert('회원탈퇴 실패...');history.go(-1);</script>");
}
}
else{
out.println("<script>alert('action 파라미터의 값을 확인해주세요!');history.go(-1);</script>");
}
%>
변경된 Controller (FrontController)
@WebServlet("*.do")
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
public FrontController() {
super();
}
private void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. Client가 보낸 요청을 추출 -> 어떤 액션인지 파악
// 더이상 파라미터를 들고다니지않음!
// URL을 분석해야함!!!
String uri=request.getRequestURI();
System.out.println("uri: "+uri);
String cp=request.getContextPath();
System.out.println("cp: "+cp);
String command=uri.substring(cp.length());
System.out.println("command: "+command);
// 2. 추출한 요청에 맞는 Action클래스의 execute() 메서드를 호출
ActionForward forward=null;
if(command.equals("/main.do")) {
forward=new MainAction().execute(request, response);
}
else if(command.equals("/signup.do")) {
forward=new SignupAction().execute(request, response);
}
else if(command.equals("/mypage.do")) {
forward=new MypageAction().execute(request, response);
}
else if(command.equals("/login.do")) {
forward=new LoginAction().execute(request, response);
}
else if(command.equals("/logout.do")) {
forward=new LogoutAction().execute(request, response);
}
else if(command.equals("/board.do")) {
forward=new BoardAction().execute(request, response);
}
else if(command.equals("/signupPage.do")) {
forward=new ActionForward();
forward.setRedirect(true);
forward.setPath("e_signup.jsp");
}
else if(command.equals("/insertBoardPage.do")) {
forward=new ActionForward();
forward.setRedirect(true);
forward.setPath("c_insertBoard.jsp");
}
else if(command.equals("/updateBoard.do")) {
forward=new UpdateBoardAction().execute(request, response);
}
else if(command.equals("/deleteMember.do")) {
forward=new DeleteMemberAction().execute(request, response);
}
else if(command.equals("/deleteBoard.do")) {
forward=new DeleteBoardAction().execute(request, response);
}
else if(command.equals("/updateMember.do")) {
forward=new UpdateMemberAction().execute(request, response);
}
else if(command.equals("/insertBoard.do")) {
forward=new InsertBoardAction().execute(request, response);
}
else {
}
// 3. 사용자에게 응답. View로 이동
if(forward!=null) {
if(forward.isRedirect()) {
response.sendRedirect(forward.getPath());
}
else {
RequestDispatcher dispatcher=request.getRequestDispatcher(forward.getPath());
dispatcher.forward(request, response);
}
}
else {
response.sendRedirect("goback.jsp");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
}
Action 인터페이스를 생성하여 메소드 강제성을 부여하기 위해 execute() 추상메소드 정의
Action.java
public interface Action {
ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
서버 측에서 클라이언트로 페이지 이동 및 리다이렉션 정보를 저장할 객체인 ActionForward 클래스 생성
ActionForward.java
public class ActionForward {
private boolean redirect;
private String path;
public boolean isRedirect() {
return redirect;
}
public void setRedirect(boolean redirect) {
this.redirect = redirect;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
728x90
'Web > JSP' 카테고리의 다른 글
[JSP] 페이징 처리 (Pagination) (0) | 2023.07.11 |
---|---|
[JSP] Set 구조 (0) | 2023.07.05 |
[JSP] Listener (0) | 2023.07.05 |
[JSP] Filter (0) | 2023.07.04 |
[JSP] POJO 와 NOT POJO (0) | 2023.07.04 |