- 서블릿 프로그래밍
- 프론트 컨트롤러 도입: GoF의 Facade 패턴 적용
- 프론트 컨트롤러와 페이지 컨트롤러의 관계 이해
- 페이지 컨트롤러를 POJO 로 전환하기
- Spring IoC 컨테이너 도입
- 프로젝트 실습
## 66. Front Controller 디자인 패턴 도입하기
- Front Controller 디자인 패턴의 효과 및 적용 방법
- 프론트 컨트롤러와 페이지 컨트롤러의 역할 이해
ㄴ HomeController.java 파일 복사
=>
ㄴ 같은 위치에 DispatcherServlet 이라는 이름으로 붙여넣기
=>
ㄴ bitcamp/report 위치에 servlet 이라는 이름의 패키지 생성
=>
ㄴ report/controller 패키지에 있는 DispatcherServlet.java 파일을 report/servlet 패키지로 이동 시켜주기
=>
DispatcherServlet.java
ㄴ @WebServlet 애노테이션에 "*.do" 로 설정해주기
=>
DispatcherServlet.java
=>
DispatcherServlet.java
ㄴ servletPath, pathInfo 출력해보기
=>
DispatcherServlet.java
ㄴ 해당 코드 주석 처리
=>
=>
=>
=>
ㄴ 출력 확인
=>
DispatcherServlet.java
ㄴ "/app/*" 로 @WebServlet 경로 변경해주기
=>
ㄴ App 재시작
=>
=>
=>
DispatcherServlet.java
ㄴ request.getPathInfo() 를 pageControllerPath 라는 변수에 담기
=>
DispatcherServlet.java
ㄴ 해당 위치에 저장한 값 넣어주기
=>
ㄴ 자동 리로드 됨
=>
=>
ㄴ /auth/login 값이 넘어감
=>
WEB-INF/jsp/auth/form.jsp
ㄴ /auth/login -> login 으로 변경해주기
=>
ㄴ 로그인 정보 입력 후 [로그인] 선택
=>
ㄴ 경로이동이 정상적으로 이루어짐을 확인
=>
WEB-INF/jsp/header.jsp
ㄴ /auth/login -> /app/auth/login 으로 변경
=>
WEB-INF/jsp/header.jsp
ㄴ /auth/logout -> /app/auth/logout 으로 변경
=>
WEB-INF/jsp/header.jsp
ㄴ /member/list -> /app/member/list 으로 변경
ㄴ /board/list?category=1 -> /app/board/list?category=1으로 변경
ㄴ /board/list?category=2 -> /app/member/list?category=2 으로 변경
=>
ㄴ App 재실행
=>
=>
=>
=>
LoginController.java
=>
DispatcherServlet.java
ㄴ viewUrl 변수를 가져오기
=>
DispatcherServlet.java
ㄴ 만약 viewUrl이 "redirect:"로 시작한다면, 리다이렉션을 수행하도록 함(다른 URL로 이동)
ㄴ 그렇지 않다면, viewUrl을 사용하여 현재 서블릿에서 지정된 뷰로 포워딩
=>
ㄴ App 재실행
=>
ㄴ 로그인 선택
=>
=>
LoginController.java
=>
App 재시작
=>
=>
=>
ㄴ 정상적으로 로그인됨을 확인
=>
ㄴ 암호를 잘못 입력했을 경우
=>
ㄴ 리다이렉션 오류
=>
LoginController.java
ㄴ /auth/login -> /app/auth/login 으로 변경
=>
LoginController.java
ㄴ 오류 처리 변경
=>
App 재실행
=>
ㄴ 존재하지 않는 회원정보 입력 후 [로그인] 선택
=>
=>
ㄴ 로그인 페이지로 이동됨을 확인
MemberListController.java
ㄴ 해당 코드 제거
=>
MemberListController.java
ㄴ request.getRequestDispatcher 대신 request.setAttribute 를 이용하여 값 설정하기
ㄴ viewUrl이라는 이름의 속성에 /WEB-INF/jsp/member/list.jsp라는 값을 설정하기
member/list.jsp
ㄴ /member/add -> add 로 변경
=>
ㄴ /member/detail -> detail 로 변경
=>
=>
=>
ㄴ 오타 수정 필요
=>
ㄴ viewUrl 변수가 null인 상태에서 String.startsWith(String) 메서드를 호출하려고 하여 에러 발생
=>
MemberDetailController.java
ㄴ 해당 코드 제거
=>
MemberDetailController.java
ㄴ request.getRequestDispatcher 대신 request.setAttribute 를 이용하여 값 설정하기
ㄴ viewUrl이라는 이름의 속성에 /WEB-INF/jsp/member/list.jsp라는 값을 설정하기
member/detail.jsp
ㄴ /member/update -> update 로 변경하기
=>
member/detail.jsp
ㄴ /member/delete -> delete 로 변경하기
ㄴ /member/list -> list 로 변경하기
=>
App 재실행
=>
=>
=>
ㄴ 회원 상세보기 정상적으로 출력됨을 확인
MemberAddController.java
ㄴ 해당 코드 제거
=>
MemberAddController.java
ㄴ request.getRequestDispatcher 대신 request.setAttribute 를 이용하여 값 설정하기
ㄴ viewUrl이라는 이름의 속성에 /WEB-INF/jsp/member/list.jsp라는 값을 설정하기
ㄴ /member/form.jsp -> /WEB-INF/jsp/member/form.jsp 로 변경해주기
=>
MemberAddController.java
ㄴ response.sendRedirect("list"); -> request.setAttribute("viewUrl", "redirect:list"); 로 변경해주기
=>
MemberAddController.java
ㄴ 에러 처리 방식 변경
member/form.jsp
ㄴ /member/add -> add 로 변경
=>
App 재실행
=>
=>
ㄴ 새 회원 선택
=>
ㄴ 회원 정보 입력 후 [등록] 선택
=>
=>
=>
MemberAddController.java
ㄴ MemberAddController.java 파일에서 설정한 MultipartConfig 설정 복사
=>
DispatcherServlet.java
ㄴ 복사한 코드 DispatcherServlet 에 붙여넣기
=>
=>
=>
ㄴ 회원 정상적으로 등록됨을 확인
MemberUpdateController.java
ㄴ response.sendRedirect("list"); -> request.setAttribute("viewUrl", "redirect:list"); 로 변경하기
=>
MemberUpdateController.java
ㄴ 에러 처리 방식 변경
=>
App 재실행
=>
ㄴ 정보 수정 후 [변경] 선택
=>
=>
ㄴ 변경한 회원 정보가 정상적으로 변경됨을 확인
=>
ㄴ 사진 변경 시도
=>
=>
ㄴ 사진 변경이 정상적으로 이루어짐
MemberDeleteController.java
ㄴ response.sendRedirect("/member/list"); -> request.setAttribute("viewUrl", "redirect:list"); 로 변경
=>
MemberDeleteController.java
ㄴ 에러 처리 방식 변경
=>
App 재실행
=>
ㄴ 회원 [삭제] 선택
=>
ㄴ 회원이 정상적으로 삭제됨을 확인
BoardListController.java
ㄴ 해당 코드 제거
=>
BoardListController.java
ㄴ request.getRequestDispatcher("/WEB-INF/jsp/board/list.jsp").include(request, response); 대신 request.setAttribute("viewUrl", "/WEB-INF/jsp/board/list.jsp"); 이용하기
=>
BoardListController.java
ㄴ 에러 처리 방식 변경
ㄴ throw new ServletException(e); 대신 request.setAttribute("exception", e); 이용하기
board/list.jsp
ㄴ /board/add -> add 로 변경
=>
board/list.jsp
ㄴ /board/detail -> detail 로 변경
=>
App 재실행
=>
=>
ㄴ [로그인] 선택
=>
ㄴ 게시글 목록 정상적으로 출력됨을 확인
BoardAddController.java
ㄴ request.getRequestDispatcher("/WEB-INF/jsp/board/form.jsp").include(request, response); 대신 request.setAttribute("viewUrl", "/WEB-INF/jsp/board/form.jsp"); 이용하기
=>
BoardAddController.java
ㄴ response.sendRedirect("/auth/login"); 대신 request.setAttribute("viewUrl", "redirect:../auth/login"); 이용하기
=>
BoardAddController.java
ㄴ response.sendRedirect("list?category=" + request.getParameter("category")); 대신 request.setAttribute("viewUrl", "list?category=" + request.getParameter("category")); 이용하기
=>
BoardAddController.java
ㄴ 에러 처리 방식 변경
ㄴ throw new ServletException(e); 대신 request.setAttribute("exception", e); 이용하기
board/form.jsp
ㄴ /board/add -> add 로 변경
=>
App 재실행
=>
ㄴ 새 글 선택
=>
ㄴ 내용 입력 후 [등록] 선택
=>
ㄴ 로그인이 되어있지 않으므로 로그인 창으로 이동됨을 확인
ㄴ 로그인 정보 입력 후 [로그인] 선택
=>
=>
ㄴ 내용 입력 후 [등록] 선택
=>
ㄴ 게시글이 정상적으로 등록됨을 확인
=>
로그아웃 선택
=>
=>
LogoutController.java
ㄴ response.sendRedirect("/"); 대신 request.setAttribute("viewUrl", "redirect:/"); 이용하기
=>
App 재실행
=>
ㄴ 로그인 실행
=>
ㄴ 로그아웃 선택
=>
ㄴ 로그아웃이 정상적으로 실행됨을 확인
=>
ㄴ 다시 로그인
=>
ㄴ 내용 입력 후 [등록] 선택
=>
ㄴ 게시글이 정상적으로 등록됨을 확인
BoardDetailController.java
ㄴ 해당 코드 제거
=>
BoardDetailController.java
ㄴ request.getRequestDispatcher("/WEB-INF/jsp/board/detail.jsp").include(request, response); 대신 request.setAttribute("viewUrl", "/WEB-INF/jsp/board/detail.jsp"); 이용하기
=>
BoardDetailController.java
ㄴ 에러 처리 방식 변경
board/detail.jsp
ㄴ /board/update -> update 로 변경
=>
board/detail.jsp
ㄴ /board/fileDelete -> fileDelete 로 변경
=>
board/detail.jsp
ㄴ /board/delete -> delete 로 변경
ㄴ /board/list -> list 로 변경
=>
App 재실행
=>
ㄴ 로그인 하기
=>
ㄴ 내용 수정 및 첨부파일 추가 등록 후 [변경] 선택
=>
=>
BoardUpdateController.java
ㄴ response.sendRedirect("/auth/login"); 대신 request.setAttribute("viewUrl", "redirect:../auth/login"); 이용하도록 함
=>
BoardUpdateController.java
ㄴ response.sendRedirect("list?category=" + request.getParameter("category")); 대신 request.setAttribute("viewUrl", "redirect:list?category=" + request.getParameter("category"));
=>
BoardUpdateController.java
ㄴ 에러 처리 방식 변경
=>
ㄴ 내용 수정 및 첨부파일 추가 등록 후 [변경] 선택
=>
=>
BoardUpdateController.java
ㄴ BoardUpdateController.java 파일에서 NcpObjectStorageService 를 사용하지 않고 있었음(실수)
=>
App 재시작
=>
ㄴ 내용 변경 및 첨부파일 여러 개 등록 후 [변경] 선택
=>
ㄴ 정상적으로 변경됨을 확인
=>
ㄴ 첨부파일도 정상적으로 추가됨을 확인
BoardFileDeleteController.java
ㄴ response.sendRedirect("/auth/login"); 대신 request.setAttribute("viewUrl", "redirect:../auth/login"); 사용하기
=>
BoardFileDeleteController.java
ㄴ response.sendRedirect("/board/detail?category=" + category + "&no=" + board.getNo()); 대신 request.setAttribute("viewUrl", "redirect:detail?category=" + category + "&no=" + board.getNo()); 이용하기
=>
BoardFileDeleteController.java
ㄴ 에러 처리 방식 변경
=>
BoardFileDeleteController.java
ㄴ /board/detail -> detail 로 변경
=>
ㄴ 첨부파일 [삭제] 선택
=>
ㄴ 첨부파일 정상적으로 삭제됨을 확인
=>
ㄴ 첨부파일 추가등록 후 [변경] 선택
=>
ㄴ 첨부파일 정상적으로 추가됨을 확인
=>
BoardDeleteController.java
ㄴ response.sendRedirect("/auth/login"); 대신 request.setAttribute("viewUrl", "redirect:../auth/login"); 대신 request.setAttribute("viewUrl", "redirect:../auth/login"); 이용하기
=>
BoardDeleteController.java
ㄴ response.sendRedirect("list?category=" + request.getParameter("category")); 대신 request.setAttribute("viewUrl", "redirect:list?category=" + request.getParameter("category")); 이용하도록 함
=>
BoardDeleteController.java
ㄴ 에러 처리 방식 변경
=>
App 재실행
=>
=>
ㄴ 게시글 [삭제] 선택
=>
ㄴ 33번 게시글이 정상적으로 삭제됨을 확인
=>
ㄴ 다른 사람의 게시글의 삭제하려고 할 경우
=>
ㄴ DispatcherServlet.java 에 코드 추가해줘야 함
=>
ㄴ 게시글 목록으로 이동됨을 확인
BoardAddController.java
ㄴ 해당 코드 추가
BoardUpdateController.java
ㄴ 해당 코드 추가
DispatcherServlet.java
ㄴ 해당 코드 추가
ㄴ viewUrl 이 null 인 오류 해결됨을 확인
=>