본문 바로가기
Spring/study

상품관리 프로젝트 코드 작성 -2

by avvin 2019. 6. 14.

상품관리 프로젝트 코드 작성 -2



상품관리 예제 코드 작성 순서 

 

7강) 상품관리 프로젝트 코드 작성 -1 (상품 테이블, 파일업로드 테스트)


1. jsp페이지 및 리소스 파일 넣고 servlet-context에 등록, url 매핑 : include / images ...


2. pom에 파일업로드, 썸네일 라이브러리 등록


3. 등록한 라이브러리에서 사용할 클래스를  servlet-context에 빈으로 등록


4. UploadController.java


5. 파일 업로드 폼.jsp


6. 업로드 결과.jsp

-----------------------------------------------------------------------------------------------------

8강 ) 상품관리 프로젝트 코드 작성 -2 ( 상품목록, 상세화면 )


7. 사용자 페이지

 : productDTO , DAO > Mapper(sample매퍼 사용)  > Service > Controller 작성

  / 상품 목록jsp 

-----------------------------------------------------------------------------------------------------

9강) 상품관리 프로젝트 코드 작성 -3


8. 로그인 페이지, 로그아웃

 : Member DTO , DAO > Mapper(sample매퍼 사용) > Service > Controller 작성


9. 장바구니 (cart 테이블 )

 : Cart DTO , DAO > Mapper(sample매퍼 사용) > Service > Controller 작성

-----------------------------------------------------------------------------------------------------

10강) 상품관리 프로젝트 코드 작성 -4


10. 관리자 로그인, 상품 등록, 수정, 삭제  (admin테이블 )

 :   Admin DTO , DAO > Mapper(sample매퍼 사용) > Service > Controller 작성

    관리자 로그인 페이지, 관리자 메뉴 페이지.jsp





쇼핑몰 페이지


자바파일


Controller


HomeController 

: home.jsp를 실행하기 위해 경유하는 컨트롤러 / 시간 정보 담아서 home.jsp  실행

MemberController

 : 로그인, 로그인 체크, 로그아웃, 

UploadController

 : 업로드폼으로 포워딩, 폼데이터 업로드, 업로드 함수

CartController

 : cart테이블 저장, cart 리스트 반환, 품목 삭제, 전체 삭제, 업데이트??<<

ProductController

 : 상품 목록, 상품 상세보기, 상품 등록 페이지로 포워딩, 등록시 상품목록페이지로 포워

AdminController

 : 관리자 로그인창으로 포워딩, 로그인 체크,  

   관리자 로그아웃처리하고 관리자로그인페이지로 포워딩  


Model


MemberDAO + Impl

MemberDTO

 : userid / passwd / name / email / join_date


CartDAO +Impl

CartDTO

 : cart_id / userid / name / product_id / product_name / price / money / amount 


ProductDAO + Impl

ProductDTO

 : product_id product_name price / description / picture_url / file1


Service


MemberService + Impl

CartService + Impl
ProductService + Impl

AdminService + Impl



설정파일


Mapper ( namespace로 구분 ) ★


memberMapper.xml 

 : 로그인 체크 쿼리

adminMapper.xml

 :  관리자 로그인 체크 쿼리  

cartMapper.xml

 : 장바구니 담기, 장바구니 리스트, 개별상품 삭제, 전체 삭제 쿼리  

productMapper.xml

 : 상품 리스트, 상품 상세, 상품 추가 쿼리  


기본 설정 파일  


web.xml 

 : root-context.xml, servlet-context.xml 로딩


root-context.xml

 : mybatis 객체 빈으로 등록, 등록시 Mappers.xml 스캔


servlet-context.xml

 : include나 image폴더 리소스 매핑 설정 / 업로드 경로 리소스 빈으로 등록 /

   파일 업로드에 필요한 클래스 빈으로 등록 / 컴포넌트 스캔 / 뷰로 포워딩시 pre,suffix 설정


pom.xml



//mybatis mapper 코드는 어디에?<<


views 파일 ( .jsp )


include 파일 : header / menu / admin_menu / style.css 

memberLogin / cart_list / product_detail / product_list / product_write / uploadForm / uploadResult

admin / a
dminLogin




pom.xml 수정할 부분 다시 체크하기


root-context.xml 에서 datasource bean부분 


root-context.xml 에 mybatis mapper interface bean을 자동으로 검색하여 생성해주는 코드 추가

<mybatis-spring:xcan base-package="com.example.spring02.model.memo">


root-context.xml 에 sqlSession객체 빈으로 등록 ( DAO에서 사용 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- SqlSessionFactory 객체 주입 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
        <property name="mapperLocations" 
        value="classpath:mappers/**/*Mapper.xml"></property>
    </bean>
    <!-- SqlSession 객체 주입 -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"
        destroy-method="clearCache">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
    </bean>
<!-- 
mybatis mapper 코드가 포함된 클래스를 찾아서 
bean으로 등록하도록 설정해야함 -->    
    <mybatis-spring:scan 
    base-package="com.example.spring02test.model.memo" />
 
cs




ProductDTO / ProductDAO 작성



servlet-context에 등록한 스프링 내장객체인 MultipartFile클래스를 사용하여 DTO 객체에 파일도 포함시킬 수 있다.



 ProductDTO.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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.example.spring02test.model.shop.dto;
 
import org.springframework.web.multipart.MultipartFile;
 
public class ProductDTO {
    
    private int product_id;
    private String product_name;
    private int price;
    private String description;
    private String picture_url;
    private MultipartFile file1;
    
    
    public int getProduct_id() {
        return product_id;
    }
    public void setProduct_id(int product_id) {
        this.product_id = product_id;
    }
    public String getProduct_name() {
        return product_name;
    }
    public void setProduct_name(String product_name) {
        this.product_name = product_name;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getPicture_url() {
        return picture_url;
    }
    public void setPicture_url(String picture_url) {
        this.picture_url = picture_url;
    }
    public MultipartFile getFile1() {
        return file1;
    }
    public void setFile1(MultipartFile file1) {
        this.file1 = file1;
    }
    
    //하나의 상품 정보 전체를 문자열로 반환해주는 메서드로 오버라이딩
    @Override
    public String toString() {
        return "ProductDTO [product_id=" + product_id 
                + ", product_name=" + product_name 
                + ", price=" + price 
                + ", description=" + description 
                + ", picture_url=" + picture_url 
                + ", file1=" + file1 + "]";
    }
    
}
 






ProductDAO.java ( 인터페이스 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.example.spring02test.model.shop.dao;
 
import java.util.List;
 
import com.example.spring02test.model.shop.dto.ProductDTO;
 
public interface ProductDAO {
    
    List<ProductDTO> listProduct(); //상품 전체 목록
    ProductDTO detailProduct(int product_id); //상품 상세 정보
    
    void updateProduct(ProductDTO dto); //상품 상세 정보 수정
    void deleteProduct(int product_id); //등록한 상품 삭제
    void insertProduct(ProductDTO dto); //상품 등록
    String fileInfo(int product_id); //파일의 정보
  //파일 삭제할때 파일명 비교하기위해 파일명을 가져오는 메서드
}
 






ProductDAOImpl.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
package com.example.spring02test.model.shop.dao;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
 
import com.example.spring02test.model.shop.dto.ProductDTO;
 
@Repository
public class ProductDAOImpl implements ProductDAO {
 
    //DAO니까 mybatis의 sqlSession을 주입받음
    @Inject
    SqlSession sqlSession;
        
    @Override
    public List<ProductDTO> listProduct() {
        return sqlSession.selectList("product.list_product");
    }
 
...생략 
}



sqlSession에 데이터 처리 떠넘김


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
        <property name="mapperLocations" 
        value="classpath:mappers/**/*Mapper.xml"></property>
    </bean>


sqlSession 설정에 매퍼파일 설정을 해놨으므로 매퍼에서 sql코드 확인

src/main/resources 하위에 mapper 패키지 생성후 productMapper.xml 작성



sqlSession.selectList("product.list_product")


product는 매퍼 파일에서 설정하는 namespace

list_product는 쿼리 설정 태그의 id 


매퍼는 sample 매퍼 파일을 복사해와서 수정해서 쓴다.

sampleMapper.xml

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<!-- 다른 mapper와 중복되지 않도록 네임스페이스 기재 -->
<mapper namespace="sample">
    
</mapper>




productMapper.xml 일부  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<!-- 다른 mapper와 중복되지 않도록 네임스페이스 기재 -->
<mapper namespace="product"> //namespace
    <select id="list_product" //id
    resultType="com.example.spring02test.model.shop.dto.ProductDTO">
        select * from product
        order by product_name
    </select>
    
...생략
 
</mapper>





ProductService 작성


ProductService.java ( 인터페이스 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.example.spring02test.service.shop;
 
import java.util.List;
 
import com.example.spring02test.model.shop.dto.ProductDTO;
 
public interface ProductService {
 
    //메서드는 DAO클래스와 동일
    List<ProductDTO> listProduct();
    ProductDTO detailProduct(int product_id);
    String fileInfo(int product_id);
    void updateProduct(ProductDTO dto);
    void deletePrduct(int product_id);
    void insertProduct(ProductDTO dto);
}
 
cs



ProductServiceImpl.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
42
43
44
45
46
47
48
49
50
51
52
package com.example.spring02test.service.shop;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.springframework.stereotype.Service;
 
import com.example.spring02test.model.shop.dao.ProductDAO;
import com.example.spring02test.model.shop.dto.ProductDTO;
 
@Service
public class ProductServiceImpl implements ProductService {
 
    @Inject
    ProductDAO productDao;
    
    @Override
    public List<ProductDTO> listProduct() {
        
        return productDao.listProduct();
    }
 
    @Override
    public ProductDTO detailProduct(int product_id) {
        
        return productDao.detailProduct(product_id);
    }
 
    @Override
    public String fileInfo(int product_id) {
        
        return productDao.fileInfo(product_id);
    }
 
    @Override
    public void updateProduct(ProductDTO dto) {
        productDao.updateProduct(dto);
        
    }
 
    @Override
    public void deletePrduct(int product_id) {
        productDao.deleteProduct(product_id);
    }
 
    @Override
    public void insertProduct(ProductDTO dto) {
        productDao.insertProduct(dto);
    }
    
}





ProductController 작성



컨트롤러에서 해야하는 일


1. URL매핑

2. service나 DAO에 데이터 처리 떠넘기고 

3. view페이지로 포워딩  


jsp로 처리된 데이터를 보내야하면 


3-1) 리턴타입 String으로 설정 + model객체를 사용 + view로 포워딩  

3-2) 리턴타입 ModelAndView로 설정 + ModelAndView(데이터Object와 view정보 담고있음) 리턴



ProductController.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
42
43
44
45
46
47
48
49
50
package com.example.spring02test.controller.shop;
 
import java.util.HashMap;
import java.util.Map;
 
import javax.inject.Inject;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.spring02test.model.shop.dto.ProductDTO;
import com.example.spring02test.service.shop.ProductServiceImpl;
 
@Controller
@RequestMapping("/shop/product/*")
public class ProductController {
 
    @Inject 
    ProductServiceImpl productServiceImpl;
    
    @RequestMapping("list.do")
    public ModelAndView list(ModelAndView mav){    
    
        //1. ModelAndView setViewName과 addObject 메서드 사용하여 데이터 담기
        
        mav.setViewName("/shop/product_list");  //상품리스트 페이지로
        mav.addObject("list", productServiceImpl.listProduct());
    
        return mav;
    };//상품목록 
    //product_list.jsp>>>
    @RequestMapping("/detail/{product_id}")
    public ModelAndView detail(
            @PathVariable("product_id"int product_id,
            ModelAndView mav) {
        mav.setViewName("/shop/product_detail");
        mav.addObject("dto", productServiceImpl.detailProduct(product_id));
    
        return mav;
    }//상품 디테일
 
    
    @RequestMapping("write.do")
    public String write() {
        return "shop/product_write";
    }//데이터처리 없이 글쓰기 페이지로 포워딩
    
    ...생략...
cs



상품리스트 페이지 만들기


product_list.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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp" %>
<script>
$(function(){
    $("#btnAdd").click(function(){
        loation.href="${path}/shop/product/write.do";    
    });
}); /* Add버튼을 누르면 write.do 실행하는 함수 */
 
</script>
</head>
<body>
<%@ include file="../include/menu.jsp" %>
<h2>상품 목록</h2>
<button type="button" id="btnAdd"> 상품 등록 </button>
<table border="1" width="500px">
    <tr>
        <th> 상품ID</th>
        <th>&nbsp;</th>
        <th>상품명</th>
        <th>가격</th>
    </tr>
 
<!--반복문 태그 c:forEach에서 list(ProductDTO)의 원소 변수 row 선언-->
<c:forEach var="row" items="${list}">
    <tr align="center">
        <td>${row.product_id}</td>
        <td>
        <img src="${path}/images/${row.picture_url}" 
        width="100" height="100">
        </td>
        <td>
            <a href="${path}/shop/product/detail/${row.product_id}">
            ${row.product_name}</a>
        </td>
        <td>
            <fmt:formatNumber value="${row.price}" pattern="#,###"/>
        </td>
    </tr>
</c:forEach>
</table>
</body>
</html>
cs



*<th> : table head 기본값은 굵은 글씨, 가운데정렬



product_detail.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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp" %>
</head>
<body>
<%@ include file="../include/menu.jsp" %>
<h2> 상품 정보 </h2>
<table>
<tr>
<td>
<img src="${path}/images/${dto.picture_url}" 
width=300px height="300px">
</td>
<td align="center">
<table>
    <tr>
        <td> 상품명 </td>
        <td>${dto.product_name}</td>
    </tr>
    <tr>
        <td>가격</td>
        <td>${dto.price}</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>${dto.description}</td>
    </tr>
    <tr>
        <td colspan="2">
        
            <form name="form1" method="post" 
            action="${path}/shop/cart/insert.do">
                <input type="hidden" name="product_id"
                value="${dto.product_id}">
                <select name="amount">
                    <c:forEach begin="1" end="10" var="i">
                        <option value="${i}">${i}</option>
                    </c:forEach>
                </select>
                <input type="submit" value="장바구니에 담기">
            </form>
            <a href="${path}/shop.product/list.do">상품목록</a>
        </td>
    </tr>
</table>
</body>
</html>
cs



@PathVariable 예시

memo_list.jsp

1
2
3
4
5
6
<script>
function memo_view(idx){
    location.href="${path}/memo/view/"+idx;
// 파라미터가 아니라 고유 주소로 넘어간다. //@PathVariable로 받을 수 있다.
  //?를 사용하면 같은 주소로 이동하여 ?이하는 파라미터로 넘어가고 고유 주소
</script>

cs


MemoController.java

1
2
3
4
5
6
7
8
//http://localhost/spring02/memo/view/6 => @PathVariable     
    @RequestMapping("view/{idx}")
    public ModelAndView view(@PathVariable int idx,
            ModelAndView mav) {
        mav.setViewName("memo/view"); //출력 페이지 지정
        mav.addObject("dto",memoService.memo_view(idx)); //데이터 저장
        return mav; //출력 페이지로 이동 
    }

cs