Study/JSP

JSP 쇼핑몰 MVC 모델2 로 변경하기

토기발 2022. 5. 21. 00:28

학원에서 기존에 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