
글 수정
저번 시간에는 글 수정을 누르고 기존 첨부된 파일에 대해 X버튼을 누르면 delFile이라는 이름에 등록되고, 없어진 그 자리에 새로운 파일을 업로드할 수 있게 만들었다.
이제 컨트롤러로 넘어가서 delFile에 해당하는 파일을 DB에서 지우고, 새로 업로드한 파일을 등록하는 기능을 구현하자.
// 글 수정 올리기 페이지
@PostMapping("/data/dataEditOk")
public ModelAndView dataEditOk(HttpServletRequest req, DataVO vo) {
ModelAndView mav = new ModelAndView();
vo.setUsername((String)req.getSession().getAttribute("logUsername"));
// 업로드 파일 위치, 파일 삭제 위치
String path = req.getSession().getServletContext().getRealPath("/upload");
// 파일 업로드 처리를 해줄 MultipartHttpServletRequest객체 생성
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
return mav;
}
우선 기존 DB에 등록되어있던 파일을 삭제시키는 작업을 해줘야한다. 삭제시킬 파일명을 가져올 Service와 쿼리문을 작성하자.
컨트롤러
// 글 수정 올리기 페이지
@PostMapping("/data/dataEditOk")
public ModelAndView dataEditOk(HttpServletRequest req, DataVO vo) {
ModelAndView mav = new ModelAndView();
vo.setUsername((String)req.getSession().getAttribute("logUsername"));
// 업로드 파일 위치, 파일 삭제 위치
String path = req.getSession().getServletContext().getRealPath("/upload");
// 파일 업로드 처리를 해줄 MultipartHttpServletRequest객체 생성
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
// DB에 등록되어 있는 수정 전 파일명
DataVO dbVO = service.selectFilename(vo.getPostno());
return mav;
}
Service
package com.poby.myapp.service;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.poby.myapp.dao.DataDAO;
import com.poby.myapp.vo.DataVO;
@Service
public class DataServiceImpl implements DataService {
@Inject
DataDAO dao;
@Override
public int dataPostOk(DataVO vo) {
return dao.dataPostOk(vo);
}
@Override
public List<DataVO> dataList() {
return dao.dataList();
}
@Override
public DataVO dataView(int postno) {
return dao.dataView(postno);
}
@Override
public DataVO selectFilename(int postno) {
return dao.selectFilename(postno);
}
}
쿼리문
<select id="selectFilename" resultType="com.poby.myapp.vo.DataVO">
SELECT filename1, filename2 FROM data_tbl WHERE postno=${param1}
</select>
그리고 컨트롤러에서 DB파일명, 삭제할 파일명, 새로 업로드할 파일명을 관리해줄 객체를 생성한다.
// 글 수정 올리기 페이지
@PostMapping("/data/dataEditOk")
public ModelAndView dataEditOk(HttpServletRequest req, DataVO vo) {
ModelAndView mav = new ModelAndView();
vo.setUsername((String)req.getSession().getAttribute("logUsername"));
// 업로드 파일 위치, 파일 삭제 위치
String path = req.getSession().getServletContext().getRealPath("/upload");
// 파일 업로드 처리를 해줄 MultipartHttpServletRequest객체 생성
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
// DB에 등록되어 있는 수정 전 파일명
DataVO dbVO = service.selectFilename(vo.getPostno());
// DB파일명, 삭제파일명, 새로 업로드한 파일명을 관리하기 위한 객체
List<String> dbFile = new ArrayList<String>();
return mav;
}
이 List안에 삭제할 파일명을 담아주자.
// 글 수정 올리기 페이지
@PostMapping("/data/dataEditOk")
public ModelAndView dataEditOk(HttpServletRequest req, DataVO vo) {
ModelAndView mav = new ModelAndView();
vo.setUsername((String)req.getSession().getAttribute("logUsername"));
// 업로드 파일 위치, 파일 삭제 위치
String path = req.getSession().getServletContext().getRealPath("/upload");
// 파일 업로드 처리를 해줄 MultipartHttpServletRequest객체 생성
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
// DB에 등록되어 있는 수정 전 파일명
DataVO dbVO = service.selectFilename(vo.getPostno());
// DB파일명, 삭제파일명, 새로 업로드한 파일명을 관리하기 위한 객체
List<String> dbFile = new ArrayList<String>();
// DB에서 읽어온 수정 전 파일명을 dbFile에 추가하기
dbFile.add(dbVO.getFilename1());
if(dbVO.getFilename2()!=null) dbFile.add(dbVO.getFilename2());
return mav;
}
여기까지 잘 실행되는지 테스트해보자. 콘솔에 delFile에 어떤 문자열이 들어가있는지 찍어봤다.
// 글 수정 올리기 페이지
@PostMapping("/data/dataEditOk")
public ModelAndView dataEditOk(HttpServletRequest req, DataVO vo) {
ModelAndView mav = new ModelAndView();
vo.setUsername((String)req.getSession().getAttribute("logUsername"));
// 업로드 파일 위치, 파일 삭제 위치
String path = req.getSession().getServletContext().getRealPath("/upload");
// 파일 업로드 처리를 해줄 MultipartHttpServletRequest객체 생성
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
// DB에 등록되어 있는 수정 전 파일명
DataVO dbVO = service.selectFilename(vo.getPostno());
// DB파일명, 삭제파일명, 새로 업로드한 파일명을 관리하기 위한 객체
List<String> dbFile = new ArrayList<String>();
// DB에서 읽어온 수정 전 파일명을 dbFile에 추가하기
dbFile.add(dbVO.getFilename1());
if(dbVO.getFilename2()!=null) dbFile.add(dbVO.getFilename2());
// 수정 form에서 삭제할 파일을 dbFile에서 제거하기
if(vo.getDelFile()!=null) { // 삭제할 파일이 있으면
for(String delFile : vo.getDelFile()) {
System.out.println("delFile -> " + delFile);
dbFile.remove(delFile);
}
}
mav.addObject("postno", vo.getPostno());
mav.setViewName("redirect:dataEdit");
return mav;
}


X를 누른 파일의 파일명이 콘솔에 제대로 찍히는걸 확인했다.
컨트롤러에서 서버에 파일을 업로드하자. 자료실 글 생성할때 했던 방법과 동일하다.
// 글 수정 올리기 페이지
@PostMapping("/data/dataEditOk")
public ModelAndView dataEditOk(HttpServletRequest req, DataVO vo) {
ModelAndView mav = new ModelAndView();
vo.setUsername((String)req.getSession().getAttribute("logUsername"));
// 업로드 파일 위치, 파일 삭제 위치
String path = req.getSession().getServletContext().getRealPath("/upload");
// 파일 업로드 처리를 해줄 MultipartHttpServletRequest객체 생성
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
// DB에 등록되어 있는 수정 전 파일명
DataVO dbVO = service.selectFilename(vo.getPostno());
// DB파일명, 삭제파일명, 새로 업로드한 파일명을 관리하기 위한 객체
List<String> dbFile = new ArrayList<String>();
// DB에서 읽어온 수정 전 파일명을 dbFile에 추가하기
dbFile.add(dbVO.getFilename1());
if(dbVO.getFilename2()!=null) dbFile.add(dbVO.getFilename2());
// 수정 form에서 삭제할 파일을 dbFile에서 제거하기
if(vo.getDelFile()!=null) { // 삭제할 파일이 있으면
for(String delFile : vo.getDelFile()) {
// System.out.println("delFile -> " + delFile);
dbFile.remove(delFile);
}
}
//-------------------파일 업로드--------------------
List<MultipartFile> fileList = mr.getFiles("filename");
List<String> uploadFileList = new ArrayList<String>(); // 새로 업로드한 파일명 관리
if(fileList!=null) { // 업로드할 파일이 있을 때
// 파일 수 만큼
for(int i=0; i<fileList.size(); i++) {
MultipartFile mf = fileList.get(i);
String file = mf.getOriginalFilename(); // 업로드한 원래 파일명
if(file!=null && !file.equals("")){
File f = new File(path, file);
if(f.exists()) { // 이미 파일명 존재하면
for(int renameNum=1;;renameNum++) { // 번호매기기
int dot = file.lastIndexOf(".");
String filename = file.substring(0, dot);
String extension = file.substring(dot+1); // 파일명, 확장자 분리
String newFilename = filename+"("+renameNum+")."+extension;
f = new File(path, newFilename);
if(!f.exists()) {
file = newFilename;
break;
}
}
}
// 실제 업로드(새로운 파일명으로 업로드)
try {
mf.transferTo(new File(path, file));
}catch(Exception e) {
e.printStackTrace();
}
// dbFile과 uploadFileList에 등록
uploadFileList.add(file);
dbFile.add(file); // DB 업데이트 시 필요
}
}
}//--------------------파일 업로드 끝---------------------
mav.addObject("postno", vo.getPostno());
mav.setViewName("redirect:dataEdit");
return mav;
}
dbFile과 uploadFileList에 담아놓은 수정 업로드할 파일의 이름인 file문자열을 add한다.
각각 DB업데이트 시 용도에 따라 쓰일 예정이다.
업로드될 파일 이름을 vo에 세팅한다.
// 글 수정 올리기 페이지
@PostMapping("/data/dataEditOk")
public ModelAndView dataEditOk(HttpServletRequest req, DataVO vo) {
ModelAndView mav = new ModelAndView();
vo.setUsername((String)req.getSession().getAttribute("logUsername"));
// 업로드 파일 위치, 파일 삭제 위치
String path = req.getSession().getServletContext().getRealPath("/upload");
// 파일 업로드 처리를 해줄 MultipartHttpServletRequest객체 생성
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
// DB에 등록되어 있는 수정 전 파일명
DataVO dbVO = service.selectFilename(vo.getPostno());
// DB파일명, 삭제파일명, 새로 업로드한 파일명을 관리하기 위한 객체
List<String> dbFile = new ArrayList<String>();
// DB에서 읽어온 수정 전 파일명을 dbFile에 추가하기
dbFile.add(dbVO.getFilename1());
if(dbVO.getFilename2()!=null) dbFile.add(dbVO.getFilename2());
// 수정 form에서 삭제할 파일을 dbFile에서 제거하기
if(vo.getDelFile()!=null) { // 삭제할 파일이 있으면
for(String delFile : vo.getDelFile()) {
// System.out.println("delFile -> " + delFile);
dbFile.remove(delFile);
}
}
//-------------------파일 업로드--------------------
List<MultipartFile> fileList = mr.getFiles("filename");
List<String> uploadFileList = new ArrayList<String>(); // 새로 업로드한 파일명 관리
if(fileList!=null) { // 업로드할 파일이 있을 때
// 파일 수 만큼
for(int i=0; i<fileList.size(); i++) {
MultipartFile mf = fileList.get(i);
String file = mf.getOriginalFilename(); // 업로드한 원래 파일명
if(file!=null && !file.equals("")){
File f = new File(path, file);
if(f.exists()) { // 이미 파일명 존재하면
for(int renameNum=1;;renameNum++) { // 번호매기기
int dot = file.lastIndexOf(".");
String filename = file.substring(0, dot);
String extension = file.substring(dot+1); // 파일명, 확장자 분리
String newFilename = filename+"("+renameNum+")."+extension;
f = new File(path, newFilename);
if(!f.exists()) {
file = newFilename;
break;
}
}
}
// 실제 업로드(새로운 파일명으로 업로드)
try {
mf.transferTo(new File(path, file));
}catch(Exception e) {
e.printStackTrace();
}
// dbFile과 uploadFileList에 등록
uploadFileList.add(file);
dbFile.add(file); // DB 업데이트 시 필요
}
}
}//--------------------파일 업로드 끝---------------------
// dbFile의 내용을 vo에 세팅
for(int i=0; i<dbFile.size(); i++) {
System.out.println("dbFile -> " + dbFile.get(i));
if(i==0) vo.setFilename1(dbFile.get(i));
if(i==1) vo.setFilename2(dbFile.get(i));
}
// DB 업데이트
mav.addObject("postno", vo.getPostno());
mav.setViewName("redirect:dataEdit");
return mav;
}
filename1은 필수로 들어가고, filename2는 있을때만 등록하도록 조건문을 추가했다.
Service
package com.poby.myapp.service;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.poby.myapp.dao.DataDAO;
import com.poby.myapp.vo.DataVO;
@Service
public class DataServiceImpl implements DataService {
@Inject
DataDAO dao;
@Override
public int dataPostOk(DataVO vo) {
return dao.dataPostOk(vo);
}
@Override
public List<DataVO> dataList() {
return dao.dataList();
}
@Override
public DataVO dataView(int postno) {
return dao.dataView(postno);
}
@Override
public DataVO selectFilename(int postno) {
return dao.selectFilename(postno);
}
@Override
public int dataEdit(DataVO vo) {
return dao.dataEdit(vo);
}
}
쿼리문 생성
<update id="dataEdit">
UPDATE data_tbl SET subject=#{subject}, content=#{content}, filename1=#{filename1}
<choose>
<when test="filename2!=null">
, filename2=#{filename2}
</when>
<otherwise>
. filename2=null
</otherwise>
</choose>
WHERE postno=#{postno} AND username=#{username}
</update>
컨트롤러 모델&뷰
이제 여기서 두 가지 상황으로 나뉜다. 수정 성공했을때, 실패했을때.
새 자료 올리기와 다른 점은 성공했을땐 원래 있던 파일을 삭제해야하고, 실패했을때 원래 파일은 놔둔 채 수정할 파일을 삭제해야한다는 점이다.
// 글 수정 올리기 페이지
@PostMapping("/data/dataEditOk")
public ModelAndView dataEditOk(HttpServletRequest req, DataVO vo) {
ModelAndView mav = new ModelAndView();
vo.setUsername((String)req.getSession().getAttribute("logUsername"));
// 업로드 파일 위치, 파일 삭제 위치
String path = req.getSession().getServletContext().getRealPath("/upload");
// 파일 업로드 처리를 해줄 MultipartHttpServletRequest객체 생성
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
// DB에 등록되어 있는 수정 전 파일명
DataVO dbVO = service.selectFilename(vo.getPostno());
// DB파일명, 삭제파일명, 새로 업로드한 파일명을 관리하기 위한 객체
List<String> dbFile = new ArrayList<String>();
// DB에서 읽어온 수정 전 파일명을 dbFile에 추가하기
dbFile.add(dbVO.getFilename1());
if(dbVO.getFilename2()!=null) dbFile.add(dbVO.getFilename2());
// 수정 form에서 삭제할 파일을 dbFile에서 제거하기
if(vo.getDelFile()!=null) { // 삭제할 파일이 있으면
for(String delFile : vo.getDelFile()) {
// System.out.println("delFile -> " + delFile);
dbFile.remove(delFile);
}
}
//-------------------파일 업로드--------------------
List<MultipartFile> fileList = mr.getFiles("filename");
List<String> uploadFileList = new ArrayList<String>(); // 새로 업로드한 파일명 관리
if(fileList!=null) { // 업로드할 파일이 있을 때
// 파일 수 만큼
for(int i=0; i<fileList.size(); i++) {
MultipartFile mf = fileList.get(i);
String file = mf.getOriginalFilename(); // 업로드한 원래 파일명
if(file!=null && !file.equals("")){
File f = new File(path, file);
if(f.exists()) { // 이미 파일명 존재하면
for(int renameNum=1;;renameNum++) { // 번호매기기
int dot = file.lastIndexOf(".");
String filename = file.substring(0, dot);
String extension = file.substring(dot+1); // 파일명, 확장자 분리
String newFilename = filename+"("+renameNum+")."+extension;
f = new File(path, newFilename);
if(!f.exists()) {
file = newFilename;
break;
}
}
}
// 실제 업로드(새로운 파일명으로 업로드)
try {
mf.transferTo(new File(path, file));
}catch(Exception e) {
e.printStackTrace();
}
// dbFile과 uploadFileList에 등록
uploadFileList.add(file);
dbFile.add(file); // DB 업데이트 시 필요
}
}
}//--------------------파일 업로드 끝---------------------
// dbFile의 내용을 vo에 세팅
for(int i=0; i<dbFile.size(); i++) {
System.out.println("dbFile -> " + dbFile.get(i));
if(i==0) vo.setFilename1(dbFile.get(i));
if(i==1) vo.setFilename2(dbFile.get(i));
}
// DB 업데이트
int result = service.dataEdit(vo);
if(result>0){// 업데이트가 된 경우 -> 삭제파일이 있으면 지우기
if(vo.getDelFile()!=null) {
for(String file : vo.getDelFile()) {
File f = new File(path, file);
f.delete();
}
}
}else{// 업데이트가 실패한 경우 -> 새로 업로드한 파일 지우기
if(uploadFileList!=null) {
for(String file : uploadFileList) {
File f = new File(path, file);
f.delete();
}
}
}
mav.addObject("postno", vo.getPostno());
mav.setViewName("redirect:dataEdit");
return mav;
}
성공했을 경우 삭제할 파일명을 담은 delFile로부터 파일명을 받아서 File객체 생성 후 서버에서 삭제했다.
실패했을 경우 수정 업로드할 파일명을 담은 uploadFileList로부터 파일명을 받아서 File객체 생성 후 서버에서 삭제했다.
삭제하는 과정의 형태가 거의 동일해서 별도의 메소드를 만들어 간략화하는 방법도 있다.
// 글 수정 올리기 페이지
@PostMapping("/data/dataEditOk")
public ModelAndView dataEditOk(HttpServletRequest req, DataVO vo) {
ModelAndView mav = new ModelAndView();
vo.setUsername((String)req.getSession().getAttribute("logUsername"));
// 업로드 파일 위치, 파일 삭제 위치
String path = req.getSession().getServletContext().getRealPath("/upload");
// 파일 업로드 처리를 해줄 MultipartHttpServletRequest객체 생성
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
// DB에 등록되어 있는 수정 전 파일명
DataVO dbVO = service.selectFilename(vo.getPostno());
// DB파일명, 삭제파일명, 새로 업로드한 파일명을 관리하기 위한 객체
List<String> dbFile = new ArrayList<String>();
// DB에서 읽어온 수정 전 파일명을 dbFile에 추가하기
dbFile.add(dbVO.getFilename1());
if(dbVO.getFilename2()!=null) dbFile.add(dbVO.getFilename2());
// 수정 form에서 삭제할 파일을 dbFile에서 제거하기
if(vo.getDelFile()!=null) { // 삭제할 파일이 있으면
for(String delFile : vo.getDelFile()) {
// System.out.println("delFile -> " + delFile);
dbFile.remove(delFile);
}
}
//-------------------파일 업로드--------------------
List<MultipartFile> fileList = mr.getFiles("filename");
List<String> uploadFileList = new ArrayList<String>(); // 새로 업로드한 파일명 관리
if(fileList!=null) { // 업로드할 파일이 있을 때
// 파일 수 만큼
for(int i=0; i<fileList.size(); i++) {
MultipartFile mf = fileList.get(i);
String file = mf.getOriginalFilename(); // 업로드한 원래 파일명
if(file!=null && !file.equals("")){
File f = new File(path, file);
if(f.exists()) { // 이미 파일명 존재하면
for(int renameNum=1;;renameNum++) { // 번호매기기
int dot = file.lastIndexOf(".");
String filename = file.substring(0, dot);
String extension = file.substring(dot+1); // 파일명, 확장자 분리
String newFilename = filename+"("+renameNum+")."+extension;
f = new File(path, newFilename);
if(!f.exists()) {
file = newFilename;
break;
}
}
}
// 실제 업로드(새로운 파일명으로 업로드)
try {
mf.transferTo(new File(path, file));
}catch(Exception e) {
e.printStackTrace();
}
// dbFile과 uploadFileList에 등록
uploadFileList.add(file);
dbFile.add(file); // DB 업데이트 시 필요
}
}
}//--------------------파일 업로드 끝---------------------
// dbFile의 내용을 vo에 세팅
for(int i=0; i<dbFile.size(); i++) {
System.out.println("dbFile -> " + dbFile.get(i));
if(i==0) vo.setFilename1(dbFile.get(i));
if(i==1) vo.setFilename2(dbFile.get(i));
}
// DB 업데이트
int result = service.dataEdit(vo);
if(result>0){// 업데이트가 된 경우 -> 삭제파일이 있으면 지우기
fileDelete(vo.getDelFile(), path);
}else{// 업데이트가 실패한 경우 -> 새로 업로드한 파일 지우기
fileDelete(uploadFileList, path);
}
mav.addObject("postno", vo.getPostno());
mav.setViewName("redirect:dataEdit");
return mav;
}
// 파일 삭제 메소드
public void fileDelete(List<String> delFileList, String path) {
if(delFileList!=null) {
for(String file : delFileList) {
File f = new File(path, file);
f.delete();
}
}
}
실행 결과에 따라 이동시킬 뷰페이지 이름을 정해준다.
// 글 수정 올리기 페이지
@PostMapping("/data/dataEditOk")
public ModelAndView dataEditOk(HttpServletRequest req, DataVO vo) {
ModelAndView mav = new ModelAndView();
vo.setUsername((String)req.getSession().getAttribute("logUsername"));
// 업로드 파일 위치, 파일 삭제 위치
String path = req.getSession().getServletContext().getRealPath("/upload");
// 파일 업로드 처리를 해줄 MultipartHttpServletRequest객체 생성
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
// DB에 등록되어 있는 수정 전 파일명
DataVO dbVO = service.selectFilename(vo.getPostno());
// DB파일명, 삭제파일명, 새로 업로드한 파일명을 관리하기 위한 객체
List<String> dbFile = new ArrayList<String>();
// DB에서 읽어온 수정 전 파일명을 dbFile에 추가하기
dbFile.add(dbVO.getFilename1());
if(dbVO.getFilename2()!=null) dbFile.add(dbVO.getFilename2());
// 수정 form에서 삭제할 파일을 dbFile에서 제거하기
if(vo.getDelFile()!=null) { // 삭제할 파일이 있으면
for(String delFile : vo.getDelFile()) {
// System.out.println("delFile -> " + delFile);
dbFile.remove(delFile);
}
}
//-------------------파일 업로드--------------------
List<MultipartFile> fileList = mr.getFiles("filename");
List<String> uploadFileList = new ArrayList<String>(); // 새로 업로드한 파일명 관리
if(fileList!=null) { // 업로드할 파일이 있을 때
// 파일 수 만큼
for(int i=0; i<fileList.size(); i++) {
MultipartFile mf = fileList.get(i);
String file = mf.getOriginalFilename(); // 업로드한 원래 파일명
if(file!=null && !file.equals("")){
File f = new File(path, file);
if(f.exists()) { // 이미 파일명 존재하면
for(int renameNum=1;;renameNum++) { // 번호매기기
int dot = file.lastIndexOf(".");
String filename = file.substring(0, dot);
String extension = file.substring(dot+1); // 파일명, 확장자 분리
String newFilename = filename+"("+renameNum+")."+extension;
f = new File(path, newFilename);
if(!f.exists()) {
file = newFilename;
break;
}
}
}
// 실제 업로드(새로운 파일명으로 업로드)
try {
mf.transferTo(new File(path, file));
}catch(Exception e) {
e.printStackTrace();
}
// dbFile과 uploadFileList에 등록
uploadFileList.add(file);
dbFile.add(file); // DB 업데이트 시 필요
}
}
}//--------------------파일 업로드 끝---------------------
// dbFile의 내용을 vo에 세팅
for(int i=0; i<dbFile.size(); i++) {
System.out.println("dbFile -> " + dbFile.get(i));
if(i==0) vo.setFilename1(dbFile.get(i));
if(i==1) vo.setFilename2(dbFile.get(i));
}
// DB 업데이트
int result = service.dataEdit(vo);
if(result>0){// 업데이트가 된 경우 -> 삭제파일이 있으면 지우기
fileDelete(vo.getDelFile(), path);
mav.addObject("postno", vo.getPostno());
mav.setViewName("redirect:dataView");
}else{// 업데이트가 실패한 경우 -> 새로 업로드한 파일 지우기
fileDelete(uploadFileList, path);
mav.setViewName("data/dataEditOk");
}
return mav;
}
수정 전:


수정 후:


업로드한 파일은 서버에 저장되고, 삭제한 파일은 서버에서 삭제된 것을 확인했다.
'Spring' 카테고리의 다른 글
| 12.19.(월) Spring Framework(34): 자료실 기능(8) (0) | 2022.12.21 |
|---|---|
| 12.16.(금) Spring Framework(32): 자료실 기능(6) (0) | 2022.12.18 |
| 12.16.(금) Spring Framework(31): 자료실 기능(5) (0) | 2022.12.18 |
| 12.16.(금) Spring Framework(30): 자료실 기능(4) (0) | 2022.12.18 |
| 12.16.(금) Spring Framework(29): 자료실 기능(3) (0) | 2022.12.18 |