관리 메뉴

거니의 velog

231201_SPRING 2 (8-2) 본문

대덕인재개발원/대덕인재개발원_웹기반 애플리케이션

231201_SPRING 2 (8-2)

Unlimited00 2023. 12. 1. 08:31

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/item2")
public class FIleUploadController02 {

	/*
	 * 		3. 여러 개의 이미지 업로드
	 * 
	 * 			- 한 번에 여러 개의 이미지를 업로드 하는 파일 업로드 기능을 구현한다.
	 * 
	 * 			# 데이터베이스 만들기
	 * 			> item2 테이블을 활용
	 * 
	 * 			# 파일 업로드 구현 설명
	 *
	 *				- 파일 업로드 등록 화면 컨트롤러 만들기 (FileUploadController02)
	 *				- 파일 업로드 등록 화면 컨트롤러 메소드 만들기 (item2RegisterForm:get)
	 *				- 파일 업로드 등록 화면 만들기 (item2/register.jsp)
	 *				- 여기까지 확인
	 */
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String item2RegisterForm() {
		return "item2/register";
	}
	
}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>ITEM2</title>
	</head>
	<body>
		<h2>REGISTER</h2>
		<form action="/item2/register" method="post" enctype="multipart/form-data">
			<table border="1">
				<tr>
					<td>상품명</td>
					<td><input type="text" name="itemName" id="itemName" /></td>
				</tr>
				<tr>
					<td>가격</td>
					<td><input type="text" name="price" id="price" /></td>
				</tr>
				<tr>
					<td>파일</td>
					<td><input type="file" name="pictures" id="picture1" /></td>
				</tr>
				<tr>
					<td>파일</td>
					<td><input type="file" name="pictures" id="picture2" /></td>
				</tr>
				<tr>
					<td>개요</td>
					<td><textarea rows="10" cols="30" wrap="soft" name="description" id="description"></textarea></td>
				</tr>
			</table>
			<div>
				<button type="submit" id="registerBtn">Register</button>
				<button type="button" id="listBtn" onclick="javascript:location.href='/item2/list'">List</button>
			</div>
		</form>
	</body>
</html>

- http://localhost/item2/register


package kr.or.ddit.vo;

import java.util.List;

import org.springframework.web.multipart.MultipartFile;

import lombok.Data;

@Data
public class Item2 {

	private int itemId;
	private String itemName;
	private int price;
	private String description;
	private List<MultipartFile> pictures;
	private String pictureUrl;
	private String pictureUrl2;
	
}
package kr.or.ddit.controller.file.item02;

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.service.IItem2Service;
import kr.or.ddit.vo.Item2;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/item2")
public class FIleUploadController02 {

	/*
	 * 		3. 여러 개의 이미지 업로드
	 * 
	 * 			- 한 번에 여러 개의 이미지를 업로드 하는 파일 업로드 기능을 구현한다.
	 * 
	 * 			# 데이터베이스 만들기
	 * 			> item2 테이블을 활용
	 * 
	 * 			# 파일 업로드 구현 설명
	 *
	 *				- 파일 업로드 등록 화면 컨트롤러 만들기 (FileUploadController02)
	 *				- 파일 업로드 등록 화면 컨트롤러 메소드 만들기 (item2RegisterForm:get)
	 *				- 파일 업로드 등록 화면 만들기 (item2/register.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 파일 업로드 등록 기능 컨트롤러 만들기 (item2Register:post)
	 *				- 파일 업로드 등록 기능 서비스 인터페이스 메소드 만들기
	 *				- 파일 업로드 등록 기능 서비스 클래스 메소드 만들기
	 *				- 파일 업로드 등록 기능 Mapper 인터페이스 메소드 만들기
	 *				- 파일 업로드 등록 기능 Mapper xml 쿼리 만들기
	 *				- 파일 업로드 등록 완료 페이지 만들기 (item2/success.jsp)
	 *				- 여기까지 확인
	 */
	
	@Inject
	private IItem2Service itemService;
	
	// root-context.xml에서 설정한 uploadPath 빈등록 path 경로를 사용한다.
	@Resource(name = "uploadPath")
	private String resourcePath;
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String item2RegisterForm() {
		return "item2/register";
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String item2Register(Item2 item, Model model) throws IOException {
		List<MultipartFile> pictures = item.getPictures();
		
		for(int i = 0; i < pictures.size(); i++) {
			MultipartFile file = pictures.get(i);
			
			log.info("originalName : " + file.getOriginalFilename());
			log.info("size : " + file.getSize());
			log.info("contentType : " + file.getContentType());
			
			String savedName = uploadFile(file.getOriginalFilename(), file.getBytes());
			
			if(i == 0) { // 첫번째 URL 정보
				item.setPictureUrl(savedName);
			}else if(i == 1) { // 두번째 URL 정보
				item.setPictureUrl2(savedName);
			}
		}
		
		itemService.register(item);
		model.addAttribute("msg", "등록이 완료되었습니다.");
		return "item2/success";
	}
	
	private String uploadFile(String originalName, byte[] fileData) throws IOException {
		UUID uuid = UUID.randomUUID(); // UUID로 파일명 생성
		// UUID + "_" + 원본 파일명
		String createdFileName = uuid.toString() + "_" + originalName;
		
		File file = new File(resourcePath);
		if(!file.exists()) {
			file.mkdirs();
		}
		
		File target = new File(resourcePath, createdFileName); // 파일 업로드 준비
		FileCopyUtils.copy(fileData, target); // 파일 복사 진행
		return createdFileName;
	}
	
}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>SUCCESS</title>
	</head>
	<body>
		<h2>${msg }</h2>
		<a href="/item2/list">List</a>
	</body>
</html>
package kr.or.ddit.service;

import kr.or.ddit.vo.Item2;

public interface IItem2Service {

	public void register(Item2 item);

}
package kr.or.ddit.service.impl;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IItem2Mapper;
import kr.or.ddit.service.IItem2Service;
import kr.or.ddit.vo.Item2;

@Service
public class Item2ServiceImpl implements IItem2Service {

	@Inject
	private IItem2Mapper mapper;
	
	@Override
	public void register(Item2 item) {
		mapper.create(item);
	}

}
package kr.or.ddit.mapper;

import kr.or.ddit.vo.Item2;

public interface IItem2Mapper {

	public void create(Item2 item);

}

<?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.IItem2Mapper">
	
	<insert id="create" parameterType="item2">
		insert into item2 (
			item_id, item_name, price, description, picture_url, picture_url2
		) values (
			seq_item2.nextval, #{itemName}, #{price}, #{description}, #{pictureUrl}, #{pictureUrl2}
		)
	</insert>
	
</mapper>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
	<!--  
		[마이바티스] 스프링에서 "_"를 사용한 컬럼명 사용 시(BOOK 테이블의 BOOK_ID와 같은 컬럼)
		카멜케이스로 읽어주는 역할(bookId와 같이)
		
		ex) 테이블 컬럼명이 member_id인 경우 jsp 화면 단에서 이 값을 사용시 memberId로 사용할 수 있다.
	-->
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
	
	<typeAliases>
		<typeAlias type="kr.or.ddit.vo.Board" alias="board"/>
		<typeAlias type="kr.or.ddit.vo.crud.CrudMember" alias="crudMember"/>
		<typeAlias type="kr.or.ddit.vo.crud.CrudMemberAuth" alias="crudMemberAuth"/>
		<typeAlias type="kr.or.ddit.vo.Item" alias="item"/>
		<typeAlias type="kr.or.ddit.vo.Item2" alias="item2"/>
		
		<typeAlias type="kr.or.ddit.vo.crud.PaginationInfoVO" alias="pagingVO"/>
		<typeAlias type="kr.or.ddit.vo.crud.NoticeVO" alias="noticeVO"/>
		<typeAlias type="kr.or.ddit.vo.crud.NoticeFileVO" alias="noticefileVO"/>
	</typeAliases>
	
</configuration>

- http://localhost/item2/register


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

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.service.IItem2Service;
import kr.or.ddit.vo.Item2;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/item2")
public class FIleUploadController02 {

	/*
	 * 		3. 여러 개의 이미지 업로드
	 * 
	 * 			- 한 번에 여러 개의 이미지를 업로드 하는 파일 업로드 기능을 구현한다.
	 * 
	 * 			# 데이터베이스 만들기
	 * 			> item2 테이블을 활용
	 * 
	 * 			# 파일 업로드 구현 설명
	 *
	 *				- 파일 업로드 등록 화면 컨트롤러 만들기 (FileUploadController02)
	 *				- 파일 업로드 등록 화면 컨트롤러 메소드 만들기 (item2RegisterForm:get)
	 *				- 파일 업로드 등록 화면 만들기 (item2/register.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 파일 업로드 등록 기능 컨트롤러 만들기 (item2Register:post)
	 *				- 파일 업로드 등록 기능 서비스 인터페이스 메소드 만들기
	 *				- 파일 업로드 등록 기능 서비스 클래스 메소드 만들기
	 *				- 파일 업로드 등록 기능 Mapper 인터페이스 메소드 만들기
	 *				- 파일 업로드 등록 기능 Mapper xml 쿼리 만들기
	 *				- 파일 업로드 등록 완료 페이지 만들기 (item2/success.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 파일 업로드 목록 화면 컨트롤러 메소드 만들기 (item2List:get)
	 *				- 파일 업로드 목록 화면 서비스 인터페이스 메소드 만들기
	 *				- 파일 업로드 목록 화면 서비스 클래스 메소드 만들기
	 *				- 파일 업로드 목록 화면 Mapper 인터페이스 메소드 만들기
	 *				- 파일 업로드 목록 화면 Mapper xml 쿼리 만들기
	 *				- 파일 업로드 목록 화면 페이지 만들기 (item2/list.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 파일 업로드 수정 화면 컨트롤러 메소드 만들기 (item2ModifyForm:get)
	 *				- 파일 업로드 수정 화면 서비스 인터페이스 메소드 만들기
	 *				- 파일 업로드 수정 화면 서비스 클래스 메소드 만들기
	 *				- 파일 업로드 수정 화면 Mapper 인터페이스 메소드 만들기
	 *				- 파일 업로드 수정 화면 Mapper xml 쿼리 만들기
	 *				- 파일 업로드 수정 화면 페이지 만들기 (item2/modify.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 파일 업로드 수정 기능 컨트롤러 메소드 만들기 (item2Modify:post)
	 *				- 파일 업로드 수정 기능 서비스 인터페이스 메소드 만들기
	 * 				- 파일 업로드 수정 기능 서비스 클래스 메소드 만들기
	 * 				- 파일 업로드 수정 기능 Mapper 인터페이스 메소드 만들기
	 * 				- 파일 업로드 수정 기능 Mapper xml 쿼리 만들기
	 *				- 여기까지 확인
	 *
	 *				- 파일 업로드 삭제 화면 컨트롤러 메소드 만들기 (item2RemoveForm:get)
	 *				- 파일 업로드 삭제 화면 서비스 인터페이스 메소드 만들기
	 * 				- 파일 업로드 삭제 화면 서비스 클래스 메소드 만들기
	 * 				- 파일 업로드 삭제 화면 Mapper 인터페이스 메소드 만들기
	 * 				- 파일 업로드 삭제 화면 Mapper xml 쿼리 만들기
	 * 				- 파일 업로드 삭제 화면 만들기 (item2/remove.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 파일 업로드 삭제 기능 컨트롤러 메소드 만들기 (item2Remove:post)
	 *				- 파일 업로드 삭제 기능 서비스 인터페이스 메소드 만들기
	 * 				- 파일 업로드 삭제 기능 서비스 클래스 메소드 만들기
	 * 				- 파일 업로드 삭제 기능 Mapper 인터페이스 메소드 만들기
	 * 				- 파일 업로드 삭제 기능 Mapper xml 쿼리 만들기
	 * 				- 여기까지 확인
	 */
	
}
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String item2list(Model model) {
		List<Item2> itemList = itemService.list();
		model.addAttribute("itemList", itemList);
		return "item2/list";
	}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.vo.Item2;

public interface IItem2Service {

	public void register(Item2 item);
	public List<Item2> list();

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IItem2Mapper;
import kr.or.ddit.service.IItem2Service;
import kr.or.ddit.vo.Item2;

@Service
public class Item2ServiceImpl implements IItem2Service {

	@Inject
	private IItem2Mapper mapper;
	
	@Override
	public void register(Item2 item) {
		mapper.create(item);
	}

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

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Item2;

public interface IItem2Mapper {

	public void create(Item2 item);
	public List<Item2> list();

}
<?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.IItem2Mapper">
	
	<insert id="create" parameterType="item2">
		insert into item2 (
			item_id, item_name, price, description, picture_url, picture_url2
		) values (
			seq_item2.nextval, #{itemName}, #{price}, #{description}, #{pictureUrl}, #{pictureUrl2}
		)
	</insert>
	
	<select id="list" resultType="item2">
		select 
			item_id, item_name, price, description, picture_url, picture_url2 
		from item2 
		order by item_id desc
	</select>
	
</mapper>

<%@ 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>ITEM2</title>
	</head>
	<body>
		<h2>LIST</h2>
		<a href="/item2/register">상품 등록</a>
		<hr />
		<table border="1">
			<tr>
				<th width="80">상품 ID</th>
				<th width="320">상품명</th>
				<th width="100">가격</th>
				<th width="80">편집</th>
				<th 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 align="center">${item.itemId }</td>
							<td align="left">${item.itemName }</td>
							<td align="right">${item.price }원</td>
							<td align="center">
								<a href="/item2/modify?itemId=${item.itemId }">상품편집</a>
							</td>
							<td align="center">
								<a href="/item2/remove?itemId=${item.itemId }">상품제거</a>
							</td>
						</tr>
					</c:forEach>
				</c:otherwise>
			</c:choose>
		</table>
	</body>
</html>

- http://localhost/item2/list


	@RequestMapping(value = "/modify", method = RequestMethod.GET)
	public String item2ModifyForm(int itemId, Model model) {
		Item2 item = itemService.read(itemId);
		model.addAttribute("item", item);
		return "item2/modify";
	}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.vo.Item2;

public interface IItem2Service {

	public void register(Item2 item);
	public List<Item2> list();
	public Item2 read(int itemId);

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IItem2Mapper;
import kr.or.ddit.service.IItem2Service;
import kr.or.ddit.vo.Item2;

@Service
public class Item2ServiceImpl implements IItem2Service {

	@Inject
	private IItem2Mapper mapper;
	
	@Override
	public void register(Item2 item) {
		mapper.create(item);
	}

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

	@Override
	public Item2 read(int itemId) {
		return mapper.read(itemId);
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Item2;

public interface IItem2Mapper {

	public void create(Item2 item);
	public List<Item2> list();
	public Item2 read(int itemId);

}
<?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.IItem2Mapper">
	
	<insert id="create" parameterType="item2">
		insert into item2 (
			item_id, item_name, price, description, picture_url, picture_url2
		) values (
			seq_item2.nextval, #{itemName}, #{price}, #{description}, #{pictureUrl}, #{pictureUrl2}
		)
	</insert>
	
	<select id="list" resultType="item2">
		select 
			item_id, item_name, price, description, picture_url, picture_url2 
		from item2 
		order by item_id desc
	</select>
	
	<select id="read" parameterType="int" resultType="item2">
		select 
			item_id, item_name, price, description, picture_url, picture_url2 
		from item2
		where item_id = #{itemId}
	</select>
	
</mapper>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>ITEM2</title>
	</head>
	<body>
		<h2>MODIFY</h2>
		<form action="/item2/modify" method="post" enctype="multipart/form-data">
			<input type="hidden" name="itemId" value="${item.itemId }" />
			<input type="hidden" name="pictureUrl" value="${item.pictureUrl }" />
			<input type="hidden" name="pictureUrl2" value="${item.pictureUrl2 }" />
			<table border="1">
				<tr>
					<td>상품명</td>
					<td><input type="text" name="itemName" id="itemName" value="${item.itemName }" /></td>
				</tr>
				<tr>
					<td>가격</td>
					<td><input type="text" name="price" id="price" value="${item.price }" /></td>
				</tr>
				<tr>
					<td>파일1</td>
					<td>
						<img alt="파일 이미지" src="/item2/display?itemId=${item.itemId }" width="210", height="240">
					</td>
				</tr>
				<tr>
					<td>파일1</td>
					<td><input type="file" name="pictures" id="picture1" /></td>
				</tr>
				<tr>
					<td>파일2</td>
					<td>
						<img alt="파일 이미지" src="/item2/display2?itemId=${item.itemId }" width="210", height="240">
					</td>
				</tr>
				<tr>
					<td>파일2</td>
					<td><input type="file" name="pictures" id="picture2" /></td>
				</tr>
				<tr>
					<td>개요</td>
					<td><textarea rows="10" cols="30" wrap="soft" name="description" id="description">${item.description }</textarea></td>
				</tr>
			</table>
			<div>
				<button type="submit" id="modifyBtn">Modify</button>
				<button type="button" id="listBtn" onclick="javascript:location.href='/item2/list'">List</button>
			</div>
		</form>
	</body>
</html>
package kr.or.ddit.controller.file.item02;

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

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

import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
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.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import kr.or.ddit.service.IItem2Service;
import kr.or.ddit.vo.Item2;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/item2")
public class FIleUploadController02 {
	
	@Inject
	private IItem2Service itemService;
	
	// root-context.xml에서 설정한 uploadPath 빈등록 path 경로를 사용한다.
	@Resource(name = "uploadPath")
	private String resourcePath;
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String itemRegisterForm() {
		return "item2/register";
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String itemRegister(Item2 item, Model model) throws IOException {
		List<MultipartFile> pictures = item.getPictures();
		
		for(int i = 0; i < pictures.size(); i++) {
			MultipartFile file = pictures.get(i);
			
			log.info("originalName : " + file.getOriginalFilename());
			log.info("size : " + file.getSize());
			log.info("contentType : " + file.getContentType());
			
			String savedName = uploadFile(file.getOriginalFilename(), file.getBytes());
			
			if(i == 0) { // 첫번째 URL 정보
				item.setPictureUrl(savedName);
			}else if(i == 1) { // 두번째 URL 정보
				item.setPictureUrl2(savedName);
			}
		}
		
		itemService.register(item);
		model.addAttribute("msg", "등록이 완료되었습니다.");
		return "item2/success";
	}
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String item2list(Model model) {
		List<Item2> itemList = itemService.list();
		model.addAttribute("itemList", itemList);
		return "item2/list";
	}
	
	@RequestMapping(value = "/modify", method = RequestMethod.GET)
	public String item2ModifyForm(int itemId, Model model) {
		Item2 item = itemService.read(itemId);
		model.addAttribute("item", item);
		return "item2/modify";
	}
	
	@ResponseBody
	@RequestMapping(value = "/display")
	public ResponseEntity<byte[]> displayFile(int itemId) {
		InputStream in = null;
		ResponseEntity<byte[]> entity = null;
		
		// itemId에 해당하는 이미지 파일명을 얻어온다.
		String fileName = itemService.getPicture(itemId);
		log.info("fileName : " + fileName);
		try {
			String formatName = fileName.substring(fileName.lastIndexOf(".") + 1); // 확장자 추출
			MediaType mType = getMediaType(formatName);
			HttpHeaders headers = new HttpHeaders();
			
			in = new FileInputStream(resourcePath + File.separator + fileName);
			if(mType != null) {
				headers.setContentType(mType);
			}
			entity = new ResponseEntity<byte[]>(IOUtils.toByteArray(in), headers, HttpStatus.CREATED);
		} catch (Exception e) {
			e.printStackTrace();
			entity = new ResponseEntity<byte[]>(HttpStatus.BAD_REQUEST);
		} finally {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return entity;
	}
	
	@ResponseBody
	@RequestMapping(value = "/display2")
	public ResponseEntity<byte[]> displayFile2(int itemId) {
		InputStream in = null;
		ResponseEntity<byte[]> entity = null;
		
		// itemId에 해당하는 이미지 파일명을 얻어온다.
		String fileName = itemService.getPicture2(itemId);
		log.info("fileName : " + fileName);
		try {
			String formatName = fileName.substring(fileName.lastIndexOf(".") + 1); // 확장자 추출
			MediaType mType = getMediaType(formatName);
			HttpHeaders headers = new HttpHeaders();
			
			in = new FileInputStream(resourcePath + File.separator + fileName);
			if(mType != null) {
				headers.setContentType(mType);
			}
			entity = new ResponseEntity<byte[]>(IOUtils.toByteArray(in), headers, HttpStatus.CREATED);
		} catch (Exception e) {
			e.printStackTrace();
			entity = new ResponseEntity<byte[]>(HttpStatus.BAD_REQUEST);
		} finally {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return entity;
	}
	
	// 추출된 확장자를 통한 Mime 타입 결정
	private MediaType getMediaType(String formatName) {
		if(formatName != null) {
			if(formatName.toUpperCase().equals("JPG")) {
				return MediaType.IMAGE_JPEG;
			}
			if(formatName.toUpperCase().equals("GIF")) {
				return MediaType.IMAGE_GIF;
			}
			if(formatName.toUpperCase().equals("PNG")) {
				return MediaType.IMAGE_PNG;
			}
		}
		return null;
	}
	
	private String uploadFile(String originalName, byte[] fileData) throws IOException {
		UUID uuid = UUID.randomUUID(); // UUID로 파일명 생성
		// UUID + "_" + 원본 파일명
		String createdFileName = uuid.toString() + "_" + originalName;
		
		File file = new File(resourcePath);
		if(!file.exists()) {
			file.mkdirs();
		}
		
		File target = new File(resourcePath, createdFileName); // 파일 업로드 준비
		FileCopyUtils.copy(fileData, target); // 파일 복사 진행
		return createdFileName;
	}
	
}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IItem2Mapper;
import kr.or.ddit.service.IItem2Service;
import kr.or.ddit.vo.Item2;

@Service
public class Item2ServiceImpl implements IItem2Service {

	@Inject
	private IItem2Mapper mapper;
	
	@Override
	public void register(Item2 item) {
		mapper.create(item);
	}

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

	@Override
	public Item2 read(int itemId) {
		return mapper.read(itemId);
	}

	@Override
	public String getPicture(int itemId) {
		return mapper.getPicture(itemId);
	}

	@Override
	public String getPicture2(int itemId) {
		return mapper.getPicture2(itemId);
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Item2;

public interface IItem2Mapper {

	public void create(Item2 item);
	public List<Item2> list();
	public Item2 read(int itemId);
	public String getPicture(int itemId);
	public String getPicture2(int itemId);

}
<?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.IItem2Mapper">
	
	<insert id="create" parameterType="item2">
		insert into item2 (
			item_id, item_name, price, description, picture_url, picture_url2
		) values (
			seq_item2.nextval, #{itemName}, #{price}, #{description}, #{pictureUrl}, #{pictureUrl2}
		)
	</insert>
	
	<select id="list" resultType="item2">
		select 
			item_id, item_name, price, description, picture_url, picture_url2 
		from item2 
		order by item_id desc
	</select>
	
	<select id="read" parameterType="int" resultType="item2">
		select 
			item_id, item_name, price, description, picture_url, picture_url2 
		from item2
		where item_id = #{itemId}
	</select>
	
	<select id="getPicture" parameterType="int" resultType="string">
		select picture_url 
		from item2 
		where item_id = #{itemId}
	</select>
	
	<select id="getPicture2" parameterType="int" resultType="string">
		select picture_url2 
		from item2 
		where item_id = #{itemId}
	</select>
	
</mapper>

- http://localhost/item2/modify?itemId=2


	@RequestMapping(value = "/modify", method = RequestMethod.POST)
	public String item2Modify(Item2 item, Model model) throws Exception {
		List<MultipartFile> pictures = item.getPictures();
		
		for(int i = 0; i < pictures.size(); i++) {
			MultipartFile file = pictures.get(i);
			
			if(file != null && file.getSize() > 0) {
				log.info("originalName : " + file.getOriginalFilename());
				log.info("size : " + file.getSize());
				log.info("contentType : " + file.getContentType());
				
				String savedName = uploadFile(file.getOriginalFilename(), file.getBytes());
				if(i == 0) {
					item.setPictureUrl(savedName);
				}
				if(i == 1) {
					item.setPictureUrl2(savedName);
				}
			}
		}
		
		itemService.modify(item);
		model.addAttribute("msg", "수정이 완료되었습니다.");
		return "item2/success";
	}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.vo.Item2;

public interface IItem2Service {

	public void register(Item2 item);
	public List<Item2> list();
	public Item2 read(int itemId);
	public String getPicture(int itemId);
	public String getPicture2(int itemId);
	public void modify(Item2 item);

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IItem2Mapper;
import kr.or.ddit.service.IItem2Service;
import kr.or.ddit.vo.Item2;

@Service
public class Item2ServiceImpl implements IItem2Service {

	@Inject
	private IItem2Mapper mapper;
	
	@Override
	public void register(Item2 item) {
		mapper.create(item);
	}

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

	@Override
	public Item2 read(int itemId) {
		return mapper.read(itemId);
	}

	@Override
	public String getPicture(int itemId) {
		return mapper.getPicture(itemId);
	}

	@Override
	public String getPicture2(int itemId) {
		return mapper.getPicture2(itemId);
	}

	@Override
	public void modify(Item2 item) {
		mapper.update(item);
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Item2;

public interface IItem2Mapper {

	public void create(Item2 item);
	public List<Item2> list();
	public Item2 read(int itemId);
	public String getPicture(int itemId);
	public String getPicture2(int itemId);
	public void update(Item2 item);

}
<?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.IItem2Mapper">
	
	<insert id="create" parameterType="item2">
		insert into item2 (
			item_id, item_name, price, description, picture_url, picture_url2
		) values (
			seq_item2.nextval, #{itemName}, #{price}, #{description}, #{pictureUrl}, #{pictureUrl2}
		)
	</insert>
	
	<select id="list" resultType="item2">
		select 
			item_id, item_name, price, description, picture_url, picture_url2 
		from item2 
		order by item_id desc
	</select>
	
	<select id="read" parameterType="int" resultType="item2">
		select 
			item_id, item_name, price, description, picture_url, picture_url2 
		from item2
		where item_id = #{itemId}
	</select>
	
	<select id="getPicture" parameterType="int" resultType="string">
		select picture_url 
		from item2 
		where item_id = #{itemId}
	</select>
	
	<select id="getPicture2" parameterType="int" resultType="string">
		select picture_url2 
		from item2 
		where item_id = #{itemId}
	</select>
	
	<update id="update" parameterType="item">
		update item2 
		set 
			item_name = #{itemName},
			price = #{price},
			description = #{description},
			picture_url = #{pictureUrl}, 
			picture_url2 = #{pictureUrl2} 
		where item_id = #{itemId}
	</update>
	
</mapper>

- http://localhost/item2/modify?itemId=2


	@RequestMapping(value = "/remove", method = RequestMethod.GET)
	public String item2RemoveForm(int itemId, Model model) {
		Item2 item = itemService.read(itemId);
		model.addAttribute("item", item);
		return "item2/remove";
	}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>ITEM2</title>
	</head>
	<body>
		<h2>REMOVE</h2>
		<form action="/item2/remove" method="post">
			<input type="hidden" name="itemId" value="${item.itemId }" />
			<table border="1">
				<tr>
					<td>상품명</td>
					<td><input type="text" name="itemName" id="itemName" value="${item.itemName }" disabled="disabled" /></td>
				</tr>
				<tr>
					<td>가격</td>
					<td><input type="text" name="price" id="price" value="${item.price }" disabled="disabled" /></td>
				</tr>
				<tr>
					<td>파일1</td>
					<td>
						<img alt="파일 이미지" src="/item2/display?itemId=${item.itemId }" width="210", height="240">
					</td>
				</tr>
				<tr>
					<td>파일2</td>
					<td>
						<img alt="파일 이미지" src="/item2/display2?itemId=${item.itemId }" width="210", height="240">
					</td>
				</tr>
				<tr>
					<td>개요</td>
					<td><textarea rows="10" cols="30" wrap="soft" name="description" id="description" disabled="disabled">${item.description }</textarea></td>
				</tr>
			</table>
			<div>
				<button type="submit" id="removeBtn">Remove</button>
				<button type="button" id="listBtn" onclick="javascript:location.href='/item2/list'">List</button>
			</div>
		</form>
	</body>
</html>

- http://localhost/item2/remove?itemId=2


	@RequestMapping(value = "/remove", method = RequestMethod.POST)
	public String item2Remove(int itemId, Model model) {
		itemService.remove(itemId);
		model.addAttribute("msg", "삭제가 완료되었습니다.");
		return "item2/success";
	}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.vo.Item2;

public interface IItem2Service {

	public void register(Item2 item);
	public List<Item2> list();
	public Item2 read(int itemId);
	public String getPicture(int itemId);
	public String getPicture2(int itemId);
	public void modify(Item2 item);
	public void remove(int itemId);

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IItem2Mapper;
import kr.or.ddit.service.IItem2Service;
import kr.or.ddit.vo.Item2;

@Service
public class Item2ServiceImpl implements IItem2Service {

	@Inject
	private IItem2Mapper mapper;
	
	@Override
	public void register(Item2 item) {
		mapper.create(item);
	}

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

	@Override
	public Item2 read(int itemId) {
		return mapper.read(itemId);
	}

	@Override
	public String getPicture(int itemId) {
		return mapper.getPicture(itemId);
	}

	@Override
	public String getPicture2(int itemId) {
		return mapper.getPicture2(itemId);
	}

	@Override
	public void modify(Item2 item) {
		mapper.update(item);
	}

	@Override
	public void remove(int itemId) {
		mapper.delete(itemId);
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Item2;

public interface IItem2Mapper {

	public void create(Item2 item);
	public List<Item2> list();
	public Item2 read(int itemId);
	public String getPicture(int itemId);
	public String getPicture2(int itemId);
	public void update(Item2 item);
	public void delete(int itemId);

}
<?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.IItem2Mapper">
	
	<insert id="create" parameterType="item2">
		insert into item2 (
			item_id, item_name, price, description, picture_url, picture_url2
		) values (
			seq_item2.nextval, #{itemName}, #{price}, #{description}, #{pictureUrl}, #{pictureUrl2}
		)
	</insert>
	
	<select id="list" resultType="item2">
		select 
			item_id, item_name, price, description, picture_url, picture_url2 
		from item2 
		order by item_id desc
	</select>
	
	<select id="read" parameterType="int" resultType="item2">
		select 
			item_id, item_name, price, description, picture_url, picture_url2 
		from item2
		where item_id = #{itemId}
	</select>
	
	<select id="getPicture" parameterType="int" resultType="string">
		select picture_url 
		from item2 
		where item_id = #{itemId}
	</select>
	
	<select id="getPicture2" parameterType="int" resultType="string">
		select picture_url2 
		from item2 
		where item_id = #{itemId}
	</select>
	
	<update id="update" parameterType="item">
		update item2 
		set 
			item_name = #{itemName},
			price = #{price},
			description = #{description},
			picture_url = #{pictureUrl}, 
			picture_url2 = #{pictureUrl2} 
		where item_id = #{itemId}
	</update>
	
	<delete id="delete" parameterType="int">
		delete from item2 
		where item_id = #{itemId}
	</delete>
	
</mapper>

- http://localhost/item2/remove?itemId=2


 

'대덕인재개발원 > 대덕인재개발원_웹기반 애플리케이션' 카테고리의 다른 글

231204_SPRING 2 (9-1)  (0) 2023.12.04
231201_SPRING 2 (과제 1)  (0) 2023.12.01
231201_SPRING 2 (8-1)  (0) 2023.12.01
231130_SPRING 2 (7-3)  (0) 2023.11.30
231130_SPRING 2 (7-2)  (0) 2023.11.30