상품관리 (상품 목록 보기 구현)

Back-End/Spring 2019. 6. 12. 11:48
728x90
반응형

 - 상품관리 실습 파일 목록 -


  

  ProductDTO.java (계층별 데이터 이동)


  ProductDAO.java (상품관리 DB연결 인터페이스)


  ProductDAOImpl.java (상품관리 DB연결 구현 클래스)


  ProductMapper.xml (SQL 매핑 어노테이션을 가진 자바 클래스)


  ProductService.java (상품 서비스 계층 인터페이스)


  ProductServiceImpl.java (상품 서비스 계층 구현 클래스)


  product_list.jsp (상품 리스트)


  product_detail.jsp (상품 정보)




기본적으로 컨트롤러 => 서비스 호출

    서비스 => 모델 호출



참고

https://abn-abn.tistory.com/211





-상품 목록보기 구현-



1. 메인페이지에서 컨트롤러(list.do) URL이 매핑되어 있는 메소드를 호출


2. 그 메소드에서는 ProductService에서 상품 리스트를 받아와서 list라는 이름으로 저장하고, product_list페이지로 이동.


3. product_list 페이지에서는 ProductDAO (ProductDAOImpl로 구현한 클래스) 에서  

    DB에 저장된 ID, NAME, PRICE, PICTURE_URL 값을 DTO를 거쳐서 불러온다.


4. ProductMapper.xml에서 SQL 상품 정보를 

   정렬해주는 SQL문을 실행하고, 그 상품 정보(DTO에 담긴 정보)들을 arraylist에 저장한다.


5. product_list파일에선 그 저장한 리스트를 불러와서 하나씩 출력한다.





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
package com.example.spring02.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; //첨부파일은 MultipartFile타입으로 저장한다.
    
    
    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 setPrcture_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=" + picture_name + ", price=" + price
                + ", description=" + description + ", prcture_url=" + picture_url + ", file1=" + file1 + "]";
    }
}
 
cs



ProductDAO.java (DAO 인터페이스)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.example.spring02.model.shop.dao;
 
import java.util.List;
 
import com.example.spring02.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);
}

cs



ProductDAOImpl.java 중 일부 (DAO 인터페이스 구현)

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
package com.example.spring02.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.spring02.model.shop.dto.ProductDTO;
 
@Repository //DB관련 객체를 스프링에서 대신 관리해주게하는 어노테이션
public class ProductDAOImpl implements ProductDAO {
    
    @Inject //sqlSession을 의존성을 주입해서 스프링 자체에서 객체를 생성하고 소멸시키게끔 한다.
    SqlSession sqlSession; 
 
    @Override
    public List<ProductDTO> listProduct() {
        return sqlSession.selectList("product.list_product"); //mapper을 호출하게 한다.

"product.list_product"

product가 namespace의 이름

list_product가 id의 이름

productMapper.xml 파일과 맵핑 된다. (단, 맵핑 되려면 namespace이름과 id의 이름이 같아야함)
    
}
cs



root-context.xml

(실행할 수있는 mapper의 경로가 작성되어 있다.)

1
2
3
4
5
6
7
    <!-- 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>
cs



productMapper.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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와 중복되지 않도록 네임스페이스 기재 -->
 
<!-- 목록을 뽑아야되므로 select SQL 구문을 추가한다. -->
<mapper namespace="product">
    <select id = "list_product"
    resultType = "com.example.spring02.model.shop.dto.ProductDTO"
    <!-- 코드의 자료형을 알려준다 DTO타입으로 받아야 되므로 DTO파일의 경로를 입력. -->
    <!-- 이 코드가 호출되면 ProductDTO가 arraylist로 저장됨 -->
        select * from product
        order by product_id 
<!-- id의 내림차순으로 검색한다. (id의 오름차순으로 검색 - 1,2,3,4,.....10) -->
    </select>
</mapper>
cs



ProductService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.spring02.service.shop;
 
import java.util.List;
 
import com.example.spring02.model.shop.dto.ProductDTO;
 
public interface ProductService {
    List<ProductDTO> listProduct();
    ProductDTO detailProduct(int product_id);
    String fileInfo(int product_id);
    void updateProduct(ProductDTO dto);
    void deleteProduct(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
package com.example.spring02.service.shop;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.springframework.stereotype.Service;
 
import com.example.spring02.model.shop.dao.ProductDAO;
import com.example.spring02.model.shop.dto.ProductDTO;
 
@Service
public class ProductServiceImpl implements ProductService {
 
    //Service에서는 model(DAO)를 받으므로 의존성을 주입해야한다.
    @Inject
    ProductDAO productDao;
    
    
    @Override
    public List<ProductDTO> listProduct() {
        return productDao.listProduct(); //데이터베이스에 저장된 상품 리스트를 리턴한다.
    }

cs



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
package com.example.spring02.controller.shop;
 
import javax.inject.Inject;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.spring02.service.shop.ProductService;
 
 
@Controller //현재 클래스를 스프링에서 관리하는 Controller Bean으로 설정함
@RequestMapping("/shop/product/*"//공통적인 url 맵핑
public class ProductController {
 
    @Inject //의존관계 주입 (DI)
    ProductService productService; //스프링에서 만든 서비스 객체를 연결시킴
    
    @RequestMapping("list.do"//세부적인 url mapping
    public ModelAndView list(ModelAndView mav) {
        mav.setViewName("/shop/product_list"); //이동할 페이지 이름 (product_list.jsp 파일로 이동)
        mav.addObject("list", productService.listProduct());  //데이터 저장
        
        //서비스에서 상품 리스트를 받아와 list라는 이름의 변수에 저장
        
        //service -> model -> mybatis -> 리스트를 받아옴
        
        return mav; //페이지 이동    
    }
}
 
cs



menu.jsp (상품목록으로 이동하는 하이퍼링크 추가)

1
2
3
4
5
6
7
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>

<!-- 다른페이지에 include되는 페이지 -->

<a href = "${path }/memo/list.do">한줄메모장</a> ㅣ
<a href = "${path }/upload/uploadForm">업로드 테스트</a> ㅣ
<a href = "${path }/shop/product_list.do">상품목록</a> ㅣ

cs



product_list.jsp (상품리스트 출력 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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv = "Content=Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%@ include file = "../include/header.jsp" %>
<script>

$(function(){ //자바스크립트 태그안쪽에
    $("#btnAdd").click(function(){
        location.href = "${path}/shop/product/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>상품사진</th>
        <th>상품명</th>
        <th>가격</th>
    </tr>
<c:forEach var="row" items="${list }"> //컨트롤러의 list변수와 같다.
    <tr align = "center">
    <td>${row.product_id }</td>
    <td><img src="${path }/images/${row.picture_url}"
    width="100" height = "100"></td>
    <td>${row.product_name }</td>
    <td>
    <fmt:formatNumber value="${row.price}" pattern="#,###" /> </td>
    <!-- 가격을 표시하기 위해서 사용함. 0이 3개 있을 때마다 ,를 하나씩 찍게 한다. -->
    </tr>
    
</c:forEach>
</table>
</body>
</html>
cs




728x90
반응형
: