딸기말차
[Java web] 14. Mini_Project_3 본문
엔코아 플레이데이터(Encore Playdata) Backend 2기 백엔드 개발 부트캠프 (playdata.io)
백엔드 개발 부트캠프
백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.
playdata.io
1. 기획
MVC Pattern을 사용하는, 세번째 팀 프로젝트를 진행하였다. 이번 프로젝트는 GET 방식으로 페이지 이름을 전달받아 해당 페이지로 이동하던 방식으로 완성 된 프로젝트의 기능들을 각 모듈별로 분리, 분리한 모듈을 UrlPatterns 를 이용해 URL로 접근하는 방식으로 변경하는 프로젝트를 진행하였다.
이들 중 필자는 Admin에 관한 기능을 담당하였다.
2. 설계
기존에 선생님이 예제로 주셨던 Controller의 구조를 보면, URL의 마지막에 GET 방식으로 command라는 데이터를 날려, 해당 데이터로 페이지를 분리하는 구조로 되어있다. 때문에 모든 페이지에 URL 접근 시, 기본적으로 command라는 데이터를 GET방식으로 날려줘야했기 때문에, 매우 비효율적이라 볼 수 있다.
이를 URL Pattern을 사용하면, URL을 통해 기능들을 모듈화가 가능하다. 특정 URL을 지날 때, Servlet의 @WebServlet을 이용하여 URL을 캐치해, 기능들을 모듈화 시킬 수 있다.
1. Serlvet을 Controller의 역할을 하게 하여 URL을 통해 기능을 구별
2. URL에 맞는 Controller 메서드 호출
3. Controller 내에서 Model 생성, 해당 Model에 담을 데이터 완성하기 위해 Service 호출
4. Service 내에선 DAO에 접근하여 데이터를 가져오기 위해 DAO 호출
5. DAO 내에서 쿼리 실행, DB에 접근
3. Controller 구조
Controller는 Model을 완성하여, View에 rending해주는 역할을 담당한다. 하지만 Model을 채우는 코드를 전부 Controller에 써버린다면, Controller가 담당하는 역할이 너무 많아지고 유지보수가 힘들어지게 된다.
때문에 Controller는 Model을 완성하기 위한 Parameter를 받아 Service에 넘기고, Service에서 Model을 완성 후 return 받아 View로 보내는 역할만을 담당하게 구성하였다.
Controller의 실행 순서는 다음과 같다.
1. 클라이언트의 요청
2. URL Pattern를 통해 /admin/members를 지나는 모든 URL을 해당 Servlet 내에서 catch
3. doPost() 내에 doGet()을 작성 (default로 들어가 있음)
4. 이를 통해 POST 방식으로 들어오던, GET 방식으로 들어오던 doGet()을 거치게 됨
5. request.getPathInfo()을 통해 * 에 들어오는 URL Catch, if-else if-else를 통해 method로 이동해 기능 실행
@WebServlet("/admin/members/*")
public class AdminMemberController extends HttpServlet {
private static final long serialVersionUID = 1L;
private final AdminMemberService adminMemberService = new AdminMemberService();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String path = request.getPathInfo();
if (path.equals("/adminLogin"))
adminLogin(request, response);
else if (path.equals("/adminLoginForm"))
adminLoginForm(request, response);
else if (path.equals("/adminLogout"))
adminLogout(request, response);
else if (path.equals("/adminMemberList"))
adminMemberList(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
private void adminLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = "/admin/main.jsp";
request.getRequestDispatcher(url).forward(request, response);
}
private void adminLoginForm(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = "admin/members/adminLogin";
String msg = "";
String workerId = request.getParameter("workerId").trim();
String workerPwd = request.getParameter("workerPwd").trim();
int result = adminMemberService.adminLoginForm(workerId, workerPwd);
if (result == 1) {
HttpSession session = request.getSession();
session.setAttribute("workerId", workerId);
response.sendRedirect(request.getContextPath() + "/admin/products/adminProductList");
return;
}
else if (result == 0)
msg = "비밀번호를 확인하세요.";
else if (result == -1)
msg = "아이디를 확인하세요.";
request.setAttribute("message", msg);
request.getRequestDispatcher(url).forward(request, response);
}
private void adminLogout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
request.setAttribute("message", "");
}
response.sendRedirect(request.getContextPath() + "/admin/members/adminLogin");
}
private void adminMemberList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = "/admin/member/memberList.jsp";
String key = "";
if (request.getParameter("key") != null) {
key = request.getParameter("key");
}
request.setAttribute("memberList", adminMemberService.adminMemberList(key));
request.getRequestDispatcher(url).forward(request, response);
}
3. Service 구조
Service는 Controller에서 Model을 채우기 위한 Parameter를 받아, 해당 Parameter를 사용해 DAO에 접근하여 받은 값을 Controller로 return해주는 역할을 담당하게 구성하였다.
이 경우, SpringFramework를 사용한게 아니라 ModelAndView 객체가 없기 때문에 DAO에서 return 되는 객체 자체를 모델로 사용하였다.
public class AdminMemberService {
private final WorkerDAO workerDAO = WorkerDAO.getInstance();
private final MemberDAO memberDAO = MemberDAO.getInstance();
public AdminMemberService() {
}
public int adminLoginForm(String workerId, String workerPwd) {
return workerDAO.workerCheck(workerId, workerPwd);
}
public ArrayList<MemberVO> adminMemberList(String key) {
return memberDAO.listMember(key);
}
}
4. 26일차 후기
이번 프로젝트는 기능이 완성되어 있는 프로젝트에서 약간의 구조 변경, 경로 변경을 하는 작업이었다.
기존에 parameter를 받아 기능을 분리하던 방식을 실제 spring에서 사용하는 방식인 URL을 이용해 분리하는 방식으로 변경하였고, 이에따라 jsp 쪽의 경로도 전부 절대경로로 변환해주었다.
jsp의 경로까지 수정하며, 구조 변경을 진행할 때는 절대 경로를 사용하는 것이 추후 패키지 구조를 변경하기 편하다는 것을 알게되었다.
'Bootcamp > Java web' 카테고리의 다른 글
[Java web] 13. MVC 실습 (0) | 2023.08.08 |
---|---|
[Java web] 12. MVC, 외래키, Oracle 함수, 계층형 쿼리 (1) | 2023.08.02 |
[Java web] 11. File Up/Download, JQuery, Ajax, Json (0) | 2023.08.01 |
[Java web] 10. Cookie, Session, Filter, Listener (0) | 2023.07.28 |
[Java web] 9. Servlet Context, Servlet Config (0) | 2023.07.27 |