Part 25. 프로젝트의 첨부파일 - 등록
- 기존의 프로젝트에 첨부파일 기능을 추가하는 작업을 진행한다.
- 첨부파일은 게시물의 등록/조회/수정, 삭제 화면에서 처리할 필요가 있으므로 각 단계마다 나누어서 개발을 진행한다.
- 개발을 위해 예제를 작성한 프로젝트에 기존 프로젝트의 설정이나 패키지 등을 먼저 복사해서 추가한 상태를 개발을 시작한다.
25.1 첨부파일 정보를 위한 준비
- 첨부파일이 게시물과 합쳐지면 가장 먼저 진행해야 하는 일은 게시물과 첨부파일의 관계를 저장하는 테이블의 설계가 우선이다.
- 게시물의 첨부파일은 각자 고유한 UUID를 가지고 있기 때문에 별도의 PK를 지정할 필요는 없지만, 게시물을 등록할 때 첨부파일 테이블 역시 같이 insert 작업이 진행되어야 하므로 트랜잭션 처리가 필요하다.
- 첨부파일을 보관하는 테이블은 tbl_attach로 설계한다.
- tbl_board는 tbl_reply와 이미 외래키의 관계를 가지고 있으므로 첨부파일이 추가되면 아래와 같은 구조가 된다.
create table tbl_attach (
uuid varchar2(100) not null,
uploadPath varchar2(200) not null,
fileName varchar2(100) not null,
filetype char(1) default 'I',
bno number(10,0)
);
alter table tbl_attach add constraint pk_attach primary key (uuid);
alter table tbl_attach add constraint fk_board_attach foreign key (bno) references tbl_board(bno);
- 첨부팡리의 보관은 UUID가 포함된 이름을 PK로 하는 uuid 칼럼과 실제 파일이 업로드된 경로를 의미하는 uploadPath, 파일 이름을 의미하는 fileName, 이미지 파일 여부를 판단할 수 있는 fileType, 해당 게시물 번호를 저장하는 bno 칼럼을 이용한다.
- SQL을 처리하기 위해서는 파일 정보를 처리하기 위해 파라미터를 여러 개 사용해야 하는 불편함이 있으므로, org.zerock.domain 패키지에 아예 BoardAttachVO 클래스를 설계하는 것이 유용하다(AttachFileDTO와 거의 유사하지만 게시물을 번호가 추가되었고, 혼란을 피하기 위해 새로 클래스를 작성한다.).
< BoardAttachVO 클래스 >
package org.zerock.domain;
import lombok.Data;
@Data
public class BoardAttachVO {
private String uuid;
private String uploadPath;
private String fileName;
private boolean fileType;
private Long bno;
}
- 기존의 BoardVO는 등록 시 한 번에 BoardAttachVO를 처리할 수 있도록 List< BoardAttachVO >를 추가한다.
< BoardVO 클래스 >
package org.zerock.domain;
import java.util.Date;
import java.util.List;
import lombok.Data;
@Data
public class BoardVO {
private Long bno;
private String title;
private String content;
private String writer;
private Date regdate;
private Date updateDate;
private int replyCnt;
private List<BoardAttachVO> attachList;
}
25.1.1 첨부파일 처리를 위한 Mapper 처리
- 첨부파일 정보를 데이터베이스를 이용해 보관하므로 이를 처리하는 SQL을 Mapper 인터페이스와 XML을 작성해 처리한다.
< BoardAttachMapper 인터페이스 >
package org.zerock.mapper;
import java.util.List;
import org.zerock.domain.BoardAttachVO;
public interface BoardAttachMapper {
public void insert(BoardAttachVO vo);
public void delete(String uuid);
public List<BoardAttachVO> findByBno(Long bno);
}
- BoardAttachMapper의 경우는 첨부파일의 수정이라는 개념이 존재하지 않기 때문에, insert()와 delete() 작업만을 처리한다.
- 특정 게시물의 번호로 첨부파일을 찾는 작업이 필요하므로 findByBno() 메서드를 정의한다.
- Mapper 인터페이스의 SQL을 처리하는 BoardAttachMapper.xml을 추가한다.
< BoardAttachMapper.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="org.zerock.mapper.BoardAttachMapper">
<insert id="insert">
insert into tbl_attach (uuid, uploadPath, fileName, filetype, bno)
values (#{uuid}, #{uploadPath}, #{uploadPath}, #{fileName}, #{fileType}, #{bno} )
</insert>
<delete id="delete">
</delete>
<select id="findByBno" resultType="org.zerock.domain.BoardAttachVO">
select * from tbl_attach where bno = #{bno}
</select>
</mapper>