[Spring] STS / file upload 파일 올리기 _ 1. select

2021. 3. 4. 14:03Web_Back-end/Spring

 

 

프로젝트 생성

 

상품 테이블 goods 를 사용해서 연습해보기

goods 테이블

 


mybatis 설정 - DB와 연동하기 위해

 

oracle 설정

db.properties 
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger

 

properties 파일을 읽어들이는 설정 + vo에 대한 애칭 설정 + 작성할 mapping 파일 경로 설정

dbConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="com/example/demo/db/db.properties"/>

<typeAliases>
	<typeAlias type="com.example.demo.vo.GoodsVo" alias="goodsVo"/>
</typeAliases>

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="om/example/demo/db/GoodsMapper.xml"/>
  </mappers>
</configuration>

 

sql 설정

GoodsMapper.xml
<?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 namespace="goods">
  <select id="findAll" resultType="goodsVo">
    select * from goods
  </select>
</mapper>

 

sql을 요청하는 SqlSessionFactory 사용, 실제로 sql 요청하는 method 

DBManager.java
package com.example.demo.db;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.example.demo.vo.GoodsVo;

public class DBManager {
	private static SqlSessionFactory factory;
	static {
		try {
			Reader reader = 
					Resources.getResourceAsReader("com/example/demo/db/dbConfig.xml");
			factory = new SqlSessionFactoryBuilder().build(reader);
			reader.close();
		}catch(Exception e) {
			System.out.println("예외발생 : " + e.getMessage());
		}
	}
	
	/**
	 * method명 Mapper파일의 id 와 동일하게 한다
	 */
	public static List<GoodsVo> findAll(){
		SqlSession session = factory.openSession();
		List<GoodsVo> list = session.selectList("goods.findAll");
		session.close();
		return list;
	}
}

 


Dao 생성

GoodsDao.java
package com.example.demo.dao;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.example.demo.db.DBManager;
import com.example.demo.vo.GoodsVo;

@Repository
public class GoodsDao {
	public List<GoodsVo> findAll(){
		return DBManager.findAll();
	}
}

Controller 생성

GoodsController.java
package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.example.demo.dao.GoodsDao;

@Controller
public class GoodsController {

	//의존관계 자동설정
	@Autowired
	private GoodsDao dao;

	public void setDao(GoodsDao dao) {
		this.dao = dao;
	}

	@RequestMapping("/listGoods.do")
	public ModelAndView listGoods() {
		ModelAndView mav = new ModelAndView();
		mav.addObject("list", dao.findAll());
		return mav;
	}
}

 


JSP 사용하는 설정하기

 

application.properties
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.data-username=scott
spring.datasource.data-password=tiger

server.port=9090

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

 

porm.xml


view 생성

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<h2>상품목록</h2>
	<hr>
	<table border="1" width="80%">
		<tr>
			<th>상품번호</th>
			<th>상품이름</th>
		</tr>
		<c:forEach var="g" items="list">
			<tr>
				<td>${g.no }</td>
				<td>${g.name }</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

 


파일 업로드

상품정보 insert 하기 _ fname을 사용해서, 파일을 업로드하기

 

상품등록으로 가는 a태그를 목록페이지에서 추가

listGoods.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<h2>상품목록</h2>
	<a href="insertGoods.do">상품등록</a>
	<hr>
	<table border="1" width="80%">
		<tr>
			<th>상품번호</th>
			<th>상품이름</th>
		</tr>
		<c:forEach var="g" items="${list }">
			<tr>
				<td>${g.no }</td>
				<td>${g.name }</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

 

상품등록 페이지 생성

insertGoods.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h2>상품등록</h2>
<hr>
<form action="insertGoods.do" method="post" enctype="multipart/form-data">
	상품번호 : <input type="text" name="no"><br>
	상품이름 : <input type="text" name="name"><br>
	상품수량 : <input type="text" name="qty"><br>
	상품가격 : <input type="text" name="price"><br>
	상품사진 : <input type="file" name="uploadFile"><br>
	<input type="submit" value="등록">
	<input type="reset" value="취소">
</form>
</body>
</html>

 

 


파일 업로드를 위한 객체생성을 하는 방법

SpringConfig.java
package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

@Configuration
public class SpringConfig {

	// xml을 대신해주는 method 생성
	@Bean
	public CommonsMultipartResolver multipartResolver() {
		return new CommonsMultipartResolver();
	}
	
}

 


vo에서 MultipartFile 추가 _ 변수명은 jsp id와 같이 한다

GoodsVo.java
package com.example.demo.vo;

import org.springframework.web.multipart.MultipartFile;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GoodsVo {
	private int no;
	private String name;
	private int qty;
	private int price;
	private String fname;
	private MultipartFile uploadFile;
}

 

 


webapp 폴더안에 파일을 저장할 폴더를 생성


 

Controller 에 method 추가하기

GoodsController.java
package com.example.demo.controller;

import java.io.FileOutputStream;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.example.demo.dao.GoodsDao;
import com.example.demo.vo.GoodsVo;

@Controller
public class GoodsController {

	//의존관계 자동설정
	@Autowired
	private GoodsDao dao;

	public void setDao(GoodsDao dao) {
		this.dao = dao;
	}

	@RequestMapping("/listGoods.do")
	public ModelAndView listGoods() {
		ModelAndView mav = new ModelAndView();
		mav.addObject("list", dao.findAll());
		return mav;
	}
	
	@RequestMapping(value="/insertGoods.do", method=RequestMethod.GET)
	public void insertForm() {
		// setViewName() 하지 않아도, 요청한 이름의 view페이지로 이동하기 때문에
		// ModelAndView객체를 따로 만들지 않아도 된다
	}
	
	@RequestMapping(value="/insertGoods.do", method=RequestMethod.POST)
	public ModelAndView insertSubmit(GoodsVo g, HttpServletRequest request) {
		ModelAndView mav = new ModelAndView();
		String path = request.getRealPath("/img");
		System.out.println("path: " + path);
		
		// client(=g = vo)가 업로드한 파일에 대한 정보를 가져온다(=getUploadFile)
		// vo에 MultipartFile : uploadFile을 추가했다
		MultipartFile uploadFile = g.getUploadFile();
		
		if(uploadFile != null) {
			try {
				// file의 내용을 담는다 
				// uploadFile.getBytes() : 실제 파일의 내용을 byte형으로 담는다
				// getBytes() : 예외처리
				byte[] data = uploadFile.getBytes();
				
				// client가 업로드한 파일의 파일명 알아오기
				String fname = uploadFile.getOriginalFilename();
				FileOutputStream fos = 
						new FileOutputStream(path + "/" + fname);
				// client가 업로드한 파일의 내용을 기록
				fos.write(data);
				fos.close();
				
				// 파일명을 fname에 지정해주기
				g.setFname(fname);
				
			} catch (IOException e) {
				System.out.println("예외발생: " + e.getMessage());
			}
		}
		
		int re = dao.insertGoods(g);
		if(re == 1) {
			mav.setViewName("redirect:/listGoods.do");
		}else {
			mav.addObject("msg", "상품등록에 실패하였습니다");
			mav.setViewName("error");
		}
		
		return mav;
	}
}

Dao 에 insertGoods() method 생성

GoodsDao.java
package com.example.demo.dao;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.example.demo.db.DBManager;
import com.example.demo.vo.GoodsVo;

@Repository
public class GoodsDao {
	public List<GoodsVo> findAll(){
		return DBManager.findAll();
	}

	public int insertGoods(GoodsVo g) {
		// TODO Auto-generated method stub
		return DBManager.insert(g);
	}
}

 

 

 

DBManager.java 에 insert() method 생성

DBManager.java
package com.example.demo.db;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.example.demo.vo.GoodsVo;

public class DBManager {
	private static SqlSessionFactory factory;
	static {
		try {
			Reader reader = 
					Resources.getResourceAsReader("com/example/demo/db/dbConfig.xml");
			factory = new SqlSessionFactoryBuilder().build(reader);
			reader.close();
		}catch(Exception e) {
			System.out.println("예외발생 : " + e.getMessage());
		}
	}
	
	/**
	 * method명 Mapper파일의 id 와 동일하게 한다
	 */
	public static List<GoodsVo> findAll(){
		SqlSession session = factory.openSession();
		List<GoodsVo> list = session.selectList("goods.findAll");
		session.close();
		return list;
	}

	public static int insert(GoodsVo g) {
		// TODO Auto-generated method stub
		SqlSession session = factory.openSession();
		int re = session.insert("goods.insert", g);
		// DB에 변동이 있는 명령을 내린 이후에 commit을 해줘야한다
		session.commit();
		session.close();
		return re;
	}
}

 


insert하는 방법 찾아보기

<insert id="insertAuthor"> insert into Author (id,username,password,email,bio) values
(#{id},#{username},#{password},#{email},#{bio}) </insert>

mapping 파일에 , sql 문 작성 (insert Node 추가)

GoodsMapper.xml
<?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 namespace="goods">
  <select id="findAll" resultType="goodsVo">
    select * from goods
  </select>
  
  <insert id="insert">
  	insert into goods values(#{no}, #{name}, #{qty}, #{price}, #{fname})
  </insert>
</mapper>

Error 페이지 작성

error.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
${msg }
</body>
</html>

 


파일 업로드를 위한 jar파일이 필요하다

pom.xml에 jar를 추가

 

필요한 jar파일을 추가하는 방법 등을 볼 수 있다 ↓↓↓↓

mvnrepository.com/

 

Maven Repository: Search/Browse/Explore

Coroutines support libraries for Kotlin Last Release on Mar 3, 2021

mvnrepository.com

1 fileupload

현재 프로젝트 환경과 맞는 버전 선택

2 commons-io

현재 프로젝트 환경과 맞는 버전 선택

 

위의 내용을 복사하여, pom.xml 에 추가해준다

pom.xml


server가동하고, 서비스 요청하기

 

아직 한글 처리를 하지 않아, 한글이 깨진다

콘솔창에 출력한, img폴더의 경로에 파일이 저장되었는지 확인

잘 저장이 되었다

 

  • 이제 한글깨지는 것을 처리해보자
  • 모든 jsp파일을 UTF-8 로 인코딩해주고,
  • 이후에 생성될 jsp파일이 자동으로 인코딩할 수 있게 변경해준다
  • window_preferences_web_jsp files_utf-8로 변경