# Spring - 파일업로드 연습1 (일반적인 방식)
# Spring - 파일업로드 연습2 (파일명 중복제거)
# Spring - 파일업로드 연습3 (업로드 결과를 iframe에 출력)
# Spring - 파일업로드 연습4 AJAX방식(파일 저장 디렉토리, 썸네일 이미지 생성)
# Spring - 파일업로드 연습5 AJAX방식(업로드한 파일표시, 썸네일 출력, 다운로드, 삭제)
# AJAX(Asynchronous Javascript And XML)란?
지금까지 ajax방식으로 파일을 업로드, 다운로드, 삭제 처리를 구현해보았는데 이제 전에 만들어 놓은 게시판에 파일 업로드 기능을 적용시켜보자. 먼저 게시글 작성화면에 파일첨부 기능을 추가하고, 게시글 상세화면에는 첨부파일의 목록을 보여주고 다운로드하거나 삭제를 할 수 있도록 해보자. 마지막으로는 수정화면에서는 새로운 첨부파일을 올리거나 삭제할 수 있도록 처리를 구현해보자.
1. DB(Oracle)에 첨부파일 테이블 생성
게시판 파일 업로드 기능을 구현하기에 앞서 DB(Oracle)에 업로드한 파일의 정보를 저장할 테이블을 생성해보자.
01) 첨부파일 테이블 생성
02) bno 칼럼에 외래키 설정
tbl_board와 tbl_attach의 관계도
03) tbl_board 테이블의 bno컬럼을 위한 시퀀스 생성
게시판 입력처리를 할 때 tbl_board 테이블의 기본키인 bno컬럼에 서브쿼리
(SELECT NVL(MAX(bno)+1, 1)FROM tbl_board)
로 값을 생성해 입력했었다.
하지만 지금은 게시글 입력처리와 동시에 파일 업로드도 같이 처리해줘야하는데 이렇게 되면 bno컬럼을 참조하지 못하게 되므로 bno칼럼을 시퀀스로 값이 자동 증가하도록 처리해주었다.
2. 게시판에 파일첨부 기능 추가
DB에 업로드한 파일의 정보를 저장할 테이블을 생성했으니 이제 본격적으로 게시판 파일첨부 기능을 구현해보자.
01) View - write.jsp
먼저 게시글을 작성화면에 ajax방식으로 파일업로드를 할 수 있도록 뷰를 수정해보자.
html, style 영역
body에 첨부파일을 드래그해서 등록할 수 있는 영역과 첨부파일의 목록을 출력해주는 영역을
div
로 작성해준다.
javascript, jquery 영역
common.js
파일업로드에 관련하여 공통으로 사용할 javascript함수들을 따로 모듈화해서 include폴더에 js파일로 작성해주었다. 파일 업로드를 구현하는 페이지마다 공통으로 들어가는 함수들이기때문에 중복코드를 최대한 줄이기 위함이다. 페이지 상단에
<script type="text/javascript" src="${path}/include/js/common.js"></script>
를 작성해주면 페이지가 로드될때 같이 들어가게된다.
파일을 드래그해서 드롭하면 바로 파일이 실행되는 이벤트를 제한하기 위해
preventDefault()
를 작성해준다. ajax 업로드 요청이 성공적으로 처리되면 common.js의getFileInfo()
함수를 호출하여 첨부파일의 정보를 가져와<a>
태그에 파일의 디렉토리를 링크해주고 원본파일명을 출력해준다.
입력 처리과정에서 날짜별 디렉토리를 포함한 파일명을 DB에 저장하기 위해<input>
태그의 value속성에 파일의 날짜별 디렉토리를 포함한 파일명을 넣어준다. 그리고 화면에 보이지 않게 하기 위해 hidden으로 처리해준다.
마지막으로 모든과정을 처리하고 나서 업로드할 파일을 목록에 출력해준다.
02) Model(DB연동 작업처리)
BoardVO
BoardVO에 게시글의 첨부파일의 이름을 추가한다.
getter, setter, toString도 함께 추가한다.
boardMapper.xml
파일 업로드처리 구현 전의 게시글 입력 쿼리
파일 업로드처리 구현 후의 게시글 입력 쿼리
앞서 sql을 작성할 때 말했듣이 이전의 게시글 insert에서는 게시글 번호를 서브쿼리로 생성해주었지만 파일업로드를 같이 처리하는 게시글 insert는 시퀀스로 게시글 번호를 생성하도록 변경하였다.
그 이유는 게시글과 파일정보는 동시에 입력 되어야하는데 서브쿼리를 사용하게 되면 파일의 정보를 입력할 때 게시글의 번호를 참조할 수가 없어지기 때문이다.
파일의 정보 입력 쿼리
CURRVAL
은 현재 시퀀스의 값을 의미한다.
BoardDAOImpl(BoardDAO인터페이스를 구현 클래스)
파일업로드 메서드 추가
03) service(비지니스 로직, 핵심업무를 처리)
BoardService(BoardService인터페이스를 구현한 클래스)
게시글 입력처리 메서드에 게시물의 첨부파일 정보를 등록하는 로직을 추가한다.
첨부파일이 없으면 메서드를 종료시키고, 첨부파일의 갯수만큼 반복문을 수행한다.
04) Controller(흐름제어) - BoardController(변경사항 없음)
05) 구현화면 확인
파일 업로드 및 파일 정보를 크롬개발자 도구에서 확인
파일 저장 디렉토리에서 업로드가 되었는지 확인
2. 게시글 상세 및 수정화면 - 첨부파일 목록, 다운로드, 삭제, 새로운 첨부파일 올리기
이제는 게시글의 상세화면과 수정화면에서 첨부파일을 목록을 보여주고 첨부파일을 다운로드하거나 삭제할 수 있도록 구현해보자. 그리고 수정화면에서는 새로운 첨부파일을 올릴 수 있게 처리해보자. 전에 구현했던 내용과 크게 다른 내용이 없으므로 자세한 설명보다는 코드에 주석을 달아 놓았다.
01) View(게시글 상세화면) - view.jsp
html, style영역
게시글 입력페이지와 동일하게 코드를 작성해준다.
<form>
태그 id속성에 form1을 추가해준다.
javascript, jquery영역
jquery
02) Model(DB연동 작업처리)
boardMapper.xml
boardDAOImpl(boardDAO인터페이스를 구현한 클래스)
03) Service(비지니스 로직, 핵심업무 처리) - BoardServiceImpl(BoardService인터페이스를 구현한 클래스)
게시글 입력처리와 마찬가지로 수정처리시에도 첨부파일이 없으면 메서드를 종료하고, 있으면 갯수만큼 반복문을 수행하여 테이블에 insert해준다.
04) Controller(흐름제어)
BoardController(게시판 관련 컨트롤러)
UploadController(업로드 관련 컨트롤러)
파일을 삭제처리하면서 동시에 DB의 파일레코드도 함께 삭제처리