Controller

FileUploadController.java

package kr.or.ddit.controller.file.item01;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

import javax.annotation.Resource;
import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;

import kr.or.ddit.controller.file.item01.service.ItemService;
import kr.or.ddit.vo.Item;
import lombok.extern.slf4j.Slf4j;

@Controller
@RequestMapping("/item")
@Slf4j
public class FileUploadController01 {
/*
 * 13장 파일업로드
 * 
 * 1. 파일업로드 설명
 * 
 * 	- 파일 업로드 등록 기능 컨트롤러 메소드 만들기 (itemRegister:post)
 * 	- 파일 업로드 등록 기능 서비스 인터페이스 메소드 만들기
 * 	- 파일 업로드 등록 기능 서비스 클래스 메소드 만들기
 * 	- 파일 업로드 등록 기능 Mapper 인터페이스 메소드 만들기
 * 	- 파일 업로드 등록 기능 Mapper xml 쿼리 만들기
 * 	- 파일 업로드 등록 완료 페이지 만들기.
 *  - 여기까지 확인 
 *  
 * 	- 파일 업로드 목록 화면 컨트롤러 메소드 만들기 (itemList:post)
 * 	- 파일 업로드 목록 화면 서비스 인터페이스 메소드 만들기
 * 	- 파일 업로드 목록 화면 서비스 클래스 메소드 만들기
 * 	- 파일 업로드 목록 화면 Mapper 인터페이스 메소드 만들기
 * 	- 파일 업로드 목록 화면 Mapper xml 쿼리 만들기
 * 	- 파일 업로드 목록 화면  만들기(item/list).
 *  - 여기까지 확인 
 */
	
	// root-context.xml 에서 설정한 uploadPath 빈등록 path 경로를 사용한다.(value로 설정했던 값)
	@Resource(name="uploadPath")
	private String resourcesPath;
//	private String uploadPath = "C://upload";
	
	@Inject
	private ItemService itemService;
	
	// 등록 페이지로 가는 메소드
	@RequestMapping(value="/register", method = RequestMethod.GET)
	public String itemRegisterForm() {
		return "item/register";
	}
	
	// 파일 등록을 진행하는 메소드
	@RequestMapping(value="/register", method = RequestMethod.POST)
	public String itemRegister(Item item, Model model) throws IOException {
		MultipartFile file = item.getPicture();
		
		log.info("originalName : " + file.getOriginalFilename());
		log.info("size : " + file.getSize());
		log.info("contentType : " + file.getContentType());
		
		// 넘겨받은 파일을 이용하여 파일 업로드(복사)를 진행한다.
		// return : UUID + "_" _ 원본 파일명
		String createdFileName = uploadFile(file.getOriginalFilename(), file.getBytes());
		item.setPictureUrl(createdFileName);
		itemService.register(item);
		model.addAttribute("msg", "등록이 완료되었습니다");
		return "item/success";
	}
	
	// 업로드할 파일 생성
	private String uploadFile(String originalName, byte[] fileData) throws IOException {
		System.out.println("resourcesPath : " + resourcesPath);
		UUID uuid = UUID.randomUUID(); // UUID 파일명 생성 준비
		String createdFileName = uuid.toString() + "_" + originalName; //UUID + "_" + 원본파일명
		
		File file = new File(resourcesPath);
		if(!file.exists()) {
			file.mkdirs();
		}
		
		File target = new File(resourcesPath, createdFileName);
		FileCopyUtils.copy(fileData, target); // 파일 복사
		return createdFileName;
	}
	
	**// 파일 목록 화면 이동 메소드**
	@RequestMapping(value="/list", method = RequestMethod.GET)
	public String itemList(Model model) {
		List<Item> itemList = itemService.list();
		model.addAttribute("itemList", itemList);
		return "item/list";
	}
}

Service

package kr.or.ddit.controller.file.item01.service;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.ItemMapper;
import kr.or.ddit.vo.Item;

@Service
public class ItemServiceImpl implements ItemService {
	
	@Inject
	private ItemMapper mapper;
	
	@Override
	public void register(Item item) {
		mapper.create(item);
	}

	@Override
	public List<Item> list() {
		return mapper.list();
	}

}

Mapper

package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Item;

public interface ItemMapper {
	public void create(Item item);
	public List<Item> list();
}

Mapper(SQL)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "<https://mybatis.org/dtd/mybatis-3-mapper.dtd>">
 <mapper namespace="kr.or.ddit.mapper.ItemMapper">
 
 <!-- 파일 등록하는 쿼리 -->
 	<insert id="create" parameterType="item">
 		insert into item(
 			item_id, item_name, price, description, picture_url
 		) values (
 			seq_item.nextval, #{itemName}, #{price}, #{description}, #{pictureUrl}
 		)
 	</insert>
 	
 	<!-- 파일 목록 출력하는 쿼리 -->
 	<select id="list" resultType="item">
 		select
 			item_id, item_name, price, description, picture_url
 		from item
 		order by item_id desc
 	</select>
 </mapper>

JSP 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="<http://java.sun.com/jsp/jstl/core>" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>List</h2>
	<a href="/item/register">상품 등록</a>
	<table border="1">
		<tr>
			<th align="center" width="80">상품ID</th>		
			<th align="center" width="320">상품명</th>		
			<th align="center" width="100">가격</th>		
			<th align="center" width="80">편집</th>		
			<th align="center" width="80">제거</th>		
		</tr>
		<c:choose>
			<c:when test="${empty itemList }">
				<tr>
					<td colspan="5">조회하신 상품이 존재하지 않습니다</td>
				</tr>
			</c:when>
			<c:otherwise>
				<c:forEach items="${itemList }" var="item">
					<tr>
						<td>${item.itemId }</td>
						<td>${item.itemName }</td>
						<td>${item.price }</td>
						<td>
							<a href="/item/modify?itemId=${item.itemId}">상품편집</a>
						</td>
						<td>
							<a href="/item/remove?itemId=${item.itemId}">상품삭제</a>
						</td>
					</tr>
				</c:forEach>
			</c:otherwise>
		</c:choose>
	</table>
</body>
</html>

localhost/item/list 를 요청하면 해당 리스트가 잘 출력되는 것을 확인할 수 있다.

Untitled