76일차_Spring

서창민·2023년 6월 28일

Spring

목록 보기
7/15
post-thumbnail

23.06.28 수 76일차

Spring

  • MultipartResolver
pom.xml 추가

		<!-- 파일 업로드 (FileUpload) -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
  • PsdVO (학생정보게시판)
package com.jungbo.k1.psd;

import org.springframework.web.multipart.MultipartFile;

import lombok.Data;

@Data
public class PsdVO {
	private String m_idx;
	private String m_sno;
	private String m_sname;
	private String m_filesStr;
	private MultipartFile m_files;
	private String m_etc;
	private int m_cnt;
	private String ch1;
	private String ch2;
}
  • PsdDao , PsdService
package com.jungbo.k1.psd;

import java.util.List;

public interface PsdDao {
	void insertPsd(PsdVO vo);
	void updatePsd(PsdVO vo);
	void deletePsd(PsdVO vo);
	void cnt(PsdVO vo);
	PsdVO getPsd(PsdVO vo);
	List<PsdVO> getPsdList(PsdVO vo);
}

파일명만 다르기 때문에 서비스는 생략 !

  • PsdServiceImpl
package com.jungbo.k1.psd;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class PsdServiceImpl implements PsdService{
	
	@Autowired
	private PsdDao dao;
	
	@Override
	public void insertPsd(PsdVO vo) {
		dao.insertPsd(vo);
	}

	@Override
	public void updatePsd(PsdVO vo) {
		dao.updatePsd(vo);
		
	}

	@Override
	public void deletePsd(PsdVO vo) {
		dao.deletePsd(vo);
	}

	@Override
	public PsdVO getPsd(PsdVO vo) {
		return dao.getPsd(vo);
	}

	@Override
	public List<PsdVO> getPsdList(PsdVO vo) {
		return dao.getPsdList(vo);
	}

	@Override
	public void cnt(PsdVO vo) {
		dao.cnt(vo);
	}
}
  • PsdDaoImpl
package com.jungbo.k1.psd;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;


@Repository
public class PsdDaoImpl implements PsdDao{
	
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	String INSERT = "insert into memberT2(m_idx, m_sno, m_sname, m_files, m_etc, m_cnt)"
			+ "values(idx_memberT2.nextval,?,?,?,?,0)";
	String UPDATE1 = "update memberT2 set m_sno=?, m_sname=?, m_files=?, m_etc=? where m_idx=?";
	String UPDATE2 = "update memberT2 set m_sno=?, m_sname=?, m_etc=? where m_idx=?";
	String DELETE = "delete from memberT2 where m_idx=?";
	String SELECT_ONE = "select * from memberT2 where m_idx=?";
	String SELECT_SNO = "select * from memberT2 where m_sno like ? order by m_idx desc";
	String SELECT_SNAME = "select * from memberT2 where m_sname like ? order by m_idx desc";
	String SELECT_ALL = "select * from memberT2 order by m_idx desc";
	String CNT = "update memberT2 set m_cnt=m_cnt+1 where m_idx = ? ";
	
	@Override
	public void insertPsd(PsdVO vo) {
		System.out.println("insertPsd :" + vo);
		Object args[] = {vo.getM_sno(), vo.getM_sname(), vo.getM_filesStr(), vo.getM_etc()};
		jdbcTemplate.update(INSERT,args);		
	}

	@Override
	public void updatePsd(PsdVO vo) {
		System.out.println("==========> updatePsd "+ vo.getM_filesStr());
		if (vo.getM_filesStr() == "" || vo.getM_filesStr().equals("")) {
			System.out.println("==========> updatePsd : 2 ");
			Object args[] = {vo.getM_sno(), vo.getM_sname(), vo.getM_etc(),vo.getM_idx()};
			jdbcTemplate.update(UPDATE2,args);		
		}else {
			System.out.println("==========> updatePsd : 1 ");
			Object args[] = {vo.getM_sno(), vo.getM_sname(), vo.getM_filesStr(), vo.getM_etc(),vo.getM_idx()};
			jdbcTemplate.update(UPDATE2,args);		
		}
	}

	@Override
	public void deletePsd(PsdVO vo) {
		Object args[] = {vo.getM_idx()};
		jdbcTemplate.update(DELETE, args);	
	}

	@Override
	public PsdVO getPsd(PsdVO vo) {
		Object args[] = {vo.getM_idx()};
		return jdbcTemplate.queryForObject(SELECT_ONE, new PsdRowMapper(), args);
	}

	@Override
	public List<PsdVO> getPsdList(PsdVO vo) {		
		if(vo.getCh1()==null || vo.getCh2()=="" || vo.getCh2().equals("")) {
			return jdbcTemplate.query(SELECT_ALL, new PsdRowMapper());	
		}else if(vo.getCh1().equals("sno")) {
			Object args[] = {"%" + vo.getCh2() +"%"};
			return jdbcTemplate.query(SELECT_SNO, new PsdRowMapper(), args);	
		}else if(vo.getCh1().equals("sname")) {
			Object args[] = {"%" + vo.getCh2() +"%"};
			return jdbcTemplate.query(SELECT_SNAME, new PsdRowMapper(), args);	
		}
		return null;
	}

	@Override
	public void cnt(PsdVO vo) {
		Object args[] = {vo.getM_idx()};
		jdbcTemplate.update(CNT, args);	
	}
}
  • PsdController
package com.jungbo.controller;

import java.io.File;
import java.text.SimpleDateFormat;
import javax.annotation.PostConstruct;
import javax.servlet.ServletContext;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.jungbo.k1.psd.PsdServiceImpl;
import com.jungbo.k1.psd.PsdVO;

@Controller
public class PsdController {
	String path="";
	
	@Autowired // 서블릿 주입하기
	private ServletContext servletContext;
	
	@Autowired
	PsdServiceImpl service;
	
	// @PostConstruct 어노테이션을 설정해놓는다.
	//init 메소드는 WAS가 띄워질때 실행된다.
	@PostConstruct
	public void init() {
		path = servletContext.getRealPath("/psd/files/");
		System.out.println("=====> realpath: "+path);
	}
	
	@RequestMapping(value="/insertPsd.do")
	public String insertPsd(PsdVO vo) throws Exception {
		System.out.println("=====> insert확인 ");
		
		MultipartFile uploadFile = vo.getM_files();
		
		//시 분 초 시간 추가
		long time = System.currentTimeMillis();
		SimpleDateFormat daytime = new SimpleDateFormat("HHmmss");
		String timeStr = daytime.format(time);
		System.out.println("시간 확인 : " + timeStr);
		
		// 파일이 첨부되는 실제 이름
		String fileName = uploadFile.getOriginalFilename();

		File f = new File(path+ fileName);

		// 중복 확인
		if(! uploadFile.isEmpty()) {
			if(f.exists()) {
				System.out.println("중복된 파일이 있습니다. !!");
				
				// 파일명만 표기하기 방법 1
				String fName = FilenameUtils.getBaseName(fileName);
				// 파일명만 표기하기 방법 2
//				String fName = fileName.substring(0, fileName.lastIndexOf("."));
				
				// 파일 확장자
				String Extention = fileName.substring(fileName.lastIndexOf("."));
				
				// 시간 포함된 파일명
				fileName = fName + "_" + timeStr + Extention;
				System.out.println(fileName);
			}
			uploadFile.transferTo(new File(path+ fileName));
		}else {
			System.out.println("파일이 첨부되지 않았습니다. !!");
			fileName ="space.png";
		}
		vo.setM_filesStr(fileName);
		service.insertPsd(vo);
		
		return "/getPsdList.do";
	}
	
	@RequestMapping(value="/getPsd.do")
	public ModelAndView getPsd(PsdVO vo, ModelAndView mav) {
		mav.addObject("m", service.getPsd(vo));
		mav.setViewName("/psd/getPsd.jsp");
		service.cnt(vo);
		
		return mav;
	}
	
	@RequestMapping(value="/updatePsd.do")
	public String updatePsd(PsdVO vo) throws Exception {
		PsdVO delVO = service.getPsd(vo);
		String delFile = delVO.getM_filesStr();
		MultipartFile uploadFile = vo.getM_files();
		long time = System.currentTimeMillis();
		SimpleDateFormat daytime = new SimpleDateFormat("HHmmss");
		String timeStr = daytime.format(time);
		
		String fileName = uploadFile.getOriginalFilename();
		File f = new File(path+fileName);
		
		// 첨부 파일이 공백이 아니면 기존파일을 삭제
		if(! uploadFile.isEmpty()) {

			File delf = new File(path+delFile);
			if(delf.exists()) { // 삭제할 파일이 있으면
				if(!delFile.equals("space.png")) { // space.png가 아니면
					delf.delete(); // 삭제
				}
			}
			
			if(f.exists()) {
				// 파일명만 표기
				String fName = fileName.substring(0, fileName.lastIndexOf("."));
				// 파일 확장자
				String Extention = fileName.substring(fileName.lastIndexOf("."));
				// 시간 포함된 파일명
				fileName = fName + "_" + timeStr + Extention;
				uploadFile.transferTo(new File(path+ fileName));
			}

		}else {
				fileName ="space.png";
			}
			
		vo.setM_filesStr(fileName);
		service.updatePsd(vo);
		return "getPsdList.do";	
		
	}

	@RequestMapping(value="/deletePsd.do")
	public String deletePsd(PsdVO vo) {
		service.deletePsd(vo);
		return "getPsdList.do";
	}

	@RequestMapping(value="/getPsdList.do")
	public ModelAndView getPsdList(PsdVO vo, ModelAndView mav) {		
		mav.addObject("li", service.getPsdList(vo));
		mav.setViewName("/psd/getPsdList.jsp");
		return mav;
	}
}

컨트롤러에 들어온 값이 서비스를 통해 Dao로 이어진다.
이미지라는 file부분이 추가되니 보다 더 복잡해졌다.
아직은 어색하고 먼 사이인듯 어렵게만 느껴진다 ..

경로 설정, 파일에 대한 호출값을 유의해서 불러와야 에러를 줄일수 있다.
수시로 프린트문을 통해 어떤 값이 호출되고 값이 정확하게 들어오는지를 확인하는 것을 습관화 하자.

  • getPsd(edit).jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.lang.*" %>    
<%@page import ="com.jungbo.k1.psd.*" %>
<%@page import ="java.util.*" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ include file = "/include/top.jsp" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
	<div><font size=5> <b>학생 신상 수정하기</b></font></div>
		<hr>
			<form action="<%=path %>/updatePsd.do" method="post"
					enctype="multipart/form-data">
					<input type=hidden name=m_idx value="${m.m_idx}">
				<table border=1 width="400" height="250" align=center>
					<tr>
						<td width=100><b>학번</b></td><td><input type=text name=m_sno value="${m.m_sno}"></td>
						<td rowspan=3 align=center><img src="<%=path %>/psd/files/${m.m_filesStr}" width=100 height=100>				
					</tr>
					<tr>
						<td>이름</td>
						<td><input type=text name=m_sname value="${m.m_sname}"></td>
					</tr>
					<tr>
						<td>파일</td>
						<td><input type=file name=m_files value="${m.m_sname}"></td>
					</tr>
					<tr>
						<td>특이사항</td>
						<td colspan=2><textarea name=m_etc cols=50 rows=10>${m.m_etc}</textarea></td>
					</tr>
					<tr> 
						<td colspan=3 align=center>
						<input type=submit value="수정하기">
					</td>
					</tr>
				</table>
			</form>
		<br>
	<hr>
<c:url value="${path}/psd/psd_form.jsp" var="insert"/>
&emsp; <a href="${insert}">학생등록</a>
<c:url value="${path}/deletePsd.do" var="delete">
		<c:param name="m_idx" value="${m.m_idx }"/>
		<c:param name="m_filesStr" value="${m.m_filesStr}"/>
</c:url>
&emsp; <a href="${delete}" >학생목록삭제</a>
<c:url value="${path}/getPsdList.do" var="select_all"/>
&emsp; <a href="${select_all}">학생목록</a>
</div>
</body>
</html>
  • getPsdList(BoardList).jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="com.jungbo.k1.psd.*" %>
<%@ page import="java.util.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ include file="/include/top.jsp" %>

<section>
    <br>
    <div align="center">
        <h2>학생 등록 목록</h2>
        <table border=1 width="600">
            <tr>
                <td>순번</td>
                <td>학번</td>
                <td>이름</td>
                <td>파일명</td>
                <td>이미지</td>
                <td>조회수</td>
            </tr>
            <c:forEach items="${li}" var="m">
                <tr>
                	<td>${m.m_idx}</td>
                    <td> ${m.m_sno}</td>
                    <td><a href="<%=path %>/getPsd.do?m_idx=${m.m_idx}">
                            ${m.m_sname}</a>
                	</td>
                    <td>${m.m_filesStr}</td>
                    <td align=center><img src="<%=path %>/psd/files/${m.m_filesStr}" width=50 height=50></td>
                    <td>${m.m_cnt}</td>
                </tr>
            </c:forEach>
        </table>
        <form action="<%=path %>/getPsdList.do">
            <table>
                <tr>
                    <td colspan=5 align="center">
                        <select name="ch1">
                            <option value="m_sno">학번</option>
                            <option value="m_sname">이름</option>
                        </select>
                        <input name="ch2" type="text">
                        <input type="submit" value="검색">
                    </td>
                </tr>
            </table>
        </form>
    </div>
</section>
<%@ include file="/include/footer.jsp" %>

한글 값으로 된 파일명을 받아오기위해 jstl의 c태그를 통해 url변수에 값을 담아 호출했다.

  • Psd_form(form).jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file = "/include/top.jsp" %>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<br><br><br>
<div><font size=5> <b>학생 신상 등록</b></font></div>
	<hr>
		<form action="<%=path %>/insertPsd.do" method="post"
				enctype = "multipart/form-data">
			<table border=1>

				<tr>
					<td>학번</td>
					<td><input type=text name=m_sno></td>
				</tr>
				<tr>
					<td>이름</td>
					<td><input type=text name=m_sname></td>
				</tr>
				<tr>
					<td>업로드</td>
					<td><input type=file name=m_files></td>
				</tr>
				<tr>
					<td>내용</td>
					<td><textarea name=m_etc cols=40 rows=5></textarea></td>
				</tr>
				<tr>
					<td colspan=2 align=center>
						<input type=submit value="학생등록">
					</td>
				</tr>
			</table>
		</form>
	</div>
</body>
</html>

.do로 받는 컨트롤러 사용은 조금 익숙해진 것 같다.
하지만 아직 경로를 받아오는 부분과 오타부분, 정확히 해결되지 않는 오류들이있다.
오류에 대한 로그를 보며 분석하고 같은 에러가 발생했을때 수정할 수 있도록 데이터를 쌓도록 하자.

profile
Back-end Developer Preparation Students

0개의 댓글