학원에서 기존에 jsp로 작성했던 코드를 mvc 모델2로 변경하는 수업을 받았습니다.
코드를 보며 잘 몰랐던 기능들을 확인하고 복습하기로 합니다.
혹시 설명에 틀린 부분이 있으면 지적 부탁드립니다~!
Model2 : Model1방식을 보완한 아키텍처다. MVC 패턴에 맡게 Model, Controller, View 부분으로 모듈화 되었고, JSP는 로직 처리가 없이 단순히 Client에게 보여지는 뷰만을 담당한다. 이 방식은 각각이 모듈화되어 있어 유지보수가 매우 쉬워지는 큰 장점이 있다.
출처: https://engkimbs.tistory.com/686 [새로비]
자바 파일 패키지는 이렇게 정리되어 있다.
먼저 크게 쇼핑몰을 관리자(admin)/사용자(mall) 로 나누고, dao, dto, command패키지를 따로 나누었다.
(mall은 dao,dto가 필요없어서 나누지 않았다.)
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>admin</servlet-name> <servlet-class>shop.admin.ShopAdminServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>admin</servlet-name> <url-pattern>*.admin</url-pattern> </servlet-mapping> <servlet> <servlet-name>mall</servlet-name> <servlet-class>shop.mall.ShopMallServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>mall</servlet-name> <url-pattern>*.mall</url-pattern> </servlet-mapping> </web-app> | cs |
맵핑을 해준 모습이다.
그런데 이런 식으로 맵핑을 하는 것은 구버전이고 요즘에는 다른 방식으로 하는 것 같았다...(인프런 강의에서 봄)
나중에 그 방식에 대해서도 따로 정리해보는 걸로 하겠다ㅎㅎ
ShopAdminServlet.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package shop.admin; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ShopAdminServlet extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("EUC-KR"); resp.setContentType("text/html; charset=EUC-KR"); String address = req.getRequestURI(); String path = req.getContextPath(); String cmd = address.substring(path.length()); CommandFactory factory = CommandFactory.getInstance(); CommandIf cmdIf = factory.createCommand(cmd); String nextPage = (String)cmdIf.processCommand(req, resp); RequestDispatcher view = req.getRequestDispatcher(nextPage); view.forward(req, resp); } } | cs |
CommandIf.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | package shop.admin; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface CommandIf { public Object processCommand(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException ; } | cs |
CommandFactory.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package shop.admin; import shop.admin.command.*; public class CommandFactory { private CommandFactory() {} private static CommandFactory instance = new CommandFactory(); public static CommandFactory getInstance() { return instance; } public CommandIf createCommand(String cmd) { CommandIf cmdIf = null; if (cmd.equals("/shopAdmin.admin")) { cmdIf = new ShopAdminCommand(); }else if (cmd.equals("/cate_input.admin")) { cmdIf = new CateInputCommand(); }else if (cmd.equals("/cate_input_ok.admin")) { cmdIf = new CateInputOkCommand(); }else if (cmd.equals("/cate_list.admin")) { cmdIf = new CateListCommand(); }else if (cmd.equals("/cate_delete.admin")){ cmdIf = new CateDeleteCommand(); }else if (cmd.equals("/prod_input.admin")) { cmdIf = new ProdInputCommand(); }else if (cmd.equals("/prod_input_ok.admin")) { cmdIf = new ProdInputOkCommand(); }else if (cmd.equals("/prod_list.admin")) { cmdIf = new ProdListCommand(); }else if (cmd.equals("/prod_view.admin")) { cmdIf = new ProdViewCommand(); }else if (cmd.equals("/prod_delete.admin")) { cmdIf = new ProdDeleteCommand(); }else if (cmd.equals("/prod_update.admin")) { cmdIf = new ProdUpdateCommand(); }else if (cmd.equals("/prod_update_ok.admin")) { cmdIf = new ProdUpdateOkCommand(); } return cmdIf; } } | cs |
팩토리 메소드 패턴을 사용하여 객체의 생성 코드를 별도의 클래스/메서드로 분리했다.
팩토리 메소드에 관해 이해가 잘 가게 설명한 블로그를 발견해서 링크 : https://gdtbgl93.tistory.com/19
[디자인패턴] 팩토리 메소드 패턴 (Factory-Method Pattern)
팩토리 메서드 패턴(Factory method pattern)은 객체지향 디자인 패턴이다. Factory method는 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며. 자식(하위) 클래스가 어떤 객체를 생
gdtbgl93.tistory.com
아직 자바파일이 한참 남았는데 전부 올리면 스크롤이 너무 길어질 것 같아서 여기서부터는 몰랐던 함수 정리나 모델1->2 변환 관련 공부한 것을 적겠다.
카테고리 등록/목록/삭제 기능
상품 등록 시 카테고리를 설정하게 해 두었기 때문에 카테고리별로 상품을 정렬할 수 있다.
cate_list.jsp 모델1
1 2 3 4 5 6 7 8 9 | <% List<CategoryDTO> clist = cdao.listCate(); if (clist == null || clist.size()==0){%> <tr> <td colspan="4">등록된 카테고리가 없습니다.</td> </tr> <% }else { for(CategoryDTO dto : clist){%> | cs |
cate_list.jsp 모델2
1 2 3 4 5 6 7 8 | <% List<CategoryDTO> clist = (List)request.getAttribute("listCate"); if (clist == null || clist.size()==0){%> <tr> <td colspan="4">등록된 카테고리가 없습니다.</td> </tr> <% }else { for(CategoryDTO dto : clist){%> | cs |
모델1은 jsp:useBean 으로 CategoryBean 을 불러와 카테고리 리스트를 사용할 수 있다.
모델 2에서는 request.getAttribute()를 이용해 리스트를 사용했다.
request.getAttribute("객체명",객체) : jsp에서 서버로부터 넘겨준 정보를 꺼낼 때 사용하는 함수
request.setAttribute("객체명",객체) : 서버에서 다른 곳으로 정보를 넘겨주기 위해 사용하는 함수
둘 다 타입은 object
CateListCommand.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class CateListCommand implements CommandIf { @Override public Object processCommand(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { CategoryDAO dao = new CategoryDAOImpl(); List<CategoryDTO> list = dao.listCate(); req.setAttribute("listCate", list); return "WEB-INF/shop/admin/cate_list.jsp"; } } | cs |
서버에서 데이터를 가져오기 위해 CategoryDAOImpl() 을 호출-> listCate()메소드를 호출한다.
위에 썼던 request.setAttribute("객체명",객체) 를 사용하여 jsp에 카테고리 리스트를 넘겨주기 위한 준비를 한다.
리턴값은 cate_list.jsp 주소로 한다.
cate_input_ok.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <% if (cdto.getCode() == null || cdto.getCname() == null || cdto.getCode().trim().equals("") || cdto.getCname().trim().equals("")){%> <script type="text/javascript"> alert("카테고리에 코드와 코드명을 모두 입력해 주세요!!") history.back() </script> <% return; } %> <jsp:useBean id="cdao" class="my.shop.CategoryBean" /> <jsp:useBean id="pool" class="my.db.ConnectionPoolBean" scope="application"/> <jsp:setProperty property="pool" name="cdao" value="<%=pool%>"/> <% int res = cdao.insertCate(cdto); String msg = null, url = null; if (res>0){ msg = "카테고리 등록 성공!! 카테고리 목록페이지로 이동합니다."; url = "cate_list.jsp"; }else { msg = "카테고리 등록 실패!! 카테고리 등록페이지로 이동합니다."; url = "cate_input.jsp"; } %> <script type="text/javascript"> alert("<%=msg%>") location.href="<%=url%>" </script> | cs |
CateInputOkCommand.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public Object processCommand(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { CategoryDTO dto = new CategoryDTO(); dto.setCname(req.getParameter("cname")); dto.setCode(req.getParameter("code")); CategoryDAO dao = new CategoryDAOImpl(); int res = dao.insertCate(dto); String msg = null, url = null; if (res>0) { msg = "카테고리등록성공!! 카테고리목록페이지로 이동합니다."; url = "cate_list.admin"; }else { msg = "카테고리등록실패!! 카테고리등록페이지로 이동합니다."; url = "cate_input.admin"; } req.setAttribute("msg", msg); req.setAttribute("url", url); return "message.jsp"; } | cs |
cate_input은 mvc모델1과 동일하고, 커멘드에는 return값에 jsp주소만 입력하였기 때문에 생략한다.
cate_input_ok는 화면에 보여줄 스크립트가 없어서 파일을 삭제하고 커멘드에만 정보를 넣었다.
cname과 code를 getParameter()로 가져와서 dto값에 넣었다.
CategoryDAOImpl() 호출 후 insertCate()를 호출한다.
cate_delete.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <% String cnum = request.getParameter("cnum"); if (cnum == null || cnum.trim().equals("")){ response.sendRedirect("main.jsp"); return; } %> <jsp:useBean id="cdao" class="my.shop.CategoryBean" /> <jsp:useBean id="pool" class="my.db.ConnectionPoolBean" scope="application"/> <jsp:setProperty property="pool" name="cdao" value="<%=pool%>"/> <% int res = cdao.deleteCate(Integer.parseInt(cnum)); String msg = null, url = null; if (res>0){ msg = "카테고리 삭제 성공!! 카테고리 목록페이지로 이동합니다."; url = "cate_list.jsp"; }else { msg = "카테고리 삭제 실패!! 카테고리 목록페이지로 이동합니다."; url = "cate_list.jsp"; } %> <script type="text/javascript"> alert("<%=msg%>") location.href="<%=url%>" </script> | cs |
CateDeleteCommand.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | String cnum = req.getParameter("cnum"); CategoryDAO dao = new CategoryDAOImpl(); int res = dao.deleteCate(Integer.parseInt(cnum)); String msg = null, url = null; if (res>0) { msg = "카테고리삭제성공!! 카테고리목록페이지로 이동합니다."; url = "cate_list.admin"; }else { msg = "카테고리삭제실패!! 카테고리목록페이지로 이동합니다."; url = "cate_list.admin"; } req.setAttribute("msg", msg); req.setAttribute("url", url); return "message.jsp"; } | cs |
cate_delete도 화면에 보여줄 스크립트가 없어서 파일을 삭제하고 커멘드에만 정보를 넣었다.
cnum 의 정보를 getParameter()로 가져온다.
CategoryDAOImpl();을 호출한 후 deleteCate()를 int로 형변환한 cnum을 넣어 호출한다.
이렇게 카테고리 추가/삭제/리스트까지 모두 mvc2패턴으로 작성했다.
'Study > JSP' 카테고리의 다른 글
JSP 쇼핑몰 MVC 모델2로 변경하기-3 (0) | 2022.05.21 |
---|---|
JSP 쇼핑몰 MVC 모델2로 변경하기-2 (0) | 2022.05.21 |