상세 컨텐츠

본문 제목

스프링 웹프로젝트 연습_12

JSP·자바·코틀린

by 김일국 2019. 10. 20. 11:55

본문

스프링 웹프로젝트 연습 마지막 포스트 입니다.

전체 12번의 걸쳐서 실습을 해 보았습니다.

오늘은 마지막으로 게시판 첨부파일 기능을 스프링 프레임웍에 내장된 multipartResolver 클래스를 이용했습니다.

결과는 아래와 같습니다.(Ajax 드래그앤 드롭 파일업로드와 html file 태그. 2가지를 모두 사용가능한 업로드 기능입니다.)

- 물론 input type file 태그도 몇줄만 추가해서 Ajax 드래그 로직을 타도록 간단하게 구현 되었습니다.^^

 

#첨부파일 기능때문에 추가한 DB테이블

CREATE table tbl_attach (
    full_name varchar(150) not null
    ,bno int not null
    ,regdate timestamp DEFAULT now()
    ,PRIMARY KEY(full_name)
    );
ALTER table tbl_attach add CONSTRAINT fk_board_attach
FOREIGN KEY (bno) REFERENCES tbl_board(bno);

참고로, 업로드에 사용되는 폴더경로를 주의 하시면 됩니다.(main/webapp/WEB-INF/springa/ppServlet/servlet-context.xml 파일설정)

#지금까지 작업한 소스:

20191020_backup.zip

 

Ps. 주의)

최근에 작업한 페이징과 검색 및 파일업로드는 모두 관리자 단만 적용되어 있습니다.

사용자단은 기본 게시판 CRUD만 가능한 상태 입니다. 기회가 되면 작업예정 입니다.

 

사용된 Db스키마 정리(phpMyAdmin 디자이너 사용)

 

초기에 WAPM 3.1.9를 사용.(자바프로젝트뿐 아나라 PHP프로젝트도 사용하기 때문에...)

- my.ini[cnf] 환경설정파일을 수정해야 합니다.
 default-storage-engine=MYISAM -> default-storage-engine=InnoDB
- 테이블 쿼리 (MYISAM을 innodb 로 변경처리 - 외래키 제약조건을 적용시키기 위해서...)
alter table tbl_member engine=innodb;
alter table tbl_board engine=innodb;
alter table tbl_reply engine=innodb;
alter table tbl_attach engine=innodb;

---------------------------------------------------------------
-- version 4.8.5
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1:3306
-- 생성 시간: 19-10-20 06:33
-- 서버 버전: 5.7.26
-- PHP 버전: 5.6.40

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

--
-- 데이터베이스명: `edu`
--

-- --------------------------------------------------------

--
-- 첨부파일 테이블 구조 `tbl_attach`
--

DROP TABLE IF EXISTS `tbl_attach`;
CREATE TABLE IF NOT EXISTS `tbl_attach` (
  `full_name` varchar(150) NOT NULL,
  `bno` int(11) NOT NULL,
  `regdate` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`full_name`),
  KEY `fk_board_attach` (`bno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- 게시판 테이블 구조 `tbl_board`
--

DROP TABLE IF EXISTS `tbl_board`;
CREATE TABLE IF NOT EXISTS `tbl_board` (
  `bno` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) NOT NULL,
  `content` text,
  `writer` varchar(50) NOT NULL,
  `regdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP on UPDATE CURRENT_TIMESTAMP,
  `view_count` int(11) DEFAULT '0',
  `reply_count` int(11) DEFAULT '0',
  PRIMARY KEY (`bno`)
) ENGINE=InnoDB AUTO_INCREMENT=226 DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- 회원 테이블 구조 `tbl_member`
--

DROP TABLE IF EXISTS `tbl_member`;
CREATE TABLE IF NOT EXISTS `tbl_member` (
  `user_id` varchar(50) NOT NULL,
  `user_pw` varchar(255) NOT NULL,
  `user_name` varchar(50) NOT NULL,
  `email` varchar(100) DEFAULT NULL,
  `point` int(11) NOT NULL DEFAULT '0',
  `enabled` tinyint(1) NOT NULL DEFAULT '0',
  `level` varchar(50) NOT NULL DEFAULT 'ROLE_USER',
  `reg_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일',
  `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP on UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- 회원 테이블의 덤프 데이터 `tbl_member`
--

INSERT INTO `tbl_member` (`user_id`, `user_pw`, `user_name`, `email`, `point`, `enabled`, `level`, `reg_date`, `update_date`) VALUES
('user02', '$2a$10$kIqR/PTloYan/MRNiEsy6uYO6OCHVmAKR4kflVKQkJ345nqTiuGeO', 'user02', 'user02@edu.com', 0, 1, 'ROLE_ADMIN', '2019-10-15 10:41:44', '2019-10-15 10:41:44');

-- --------------------------------------------------------

--
-- 댓글 테이블 구조 `tbl_reply`
--

-- DROP TABLE IF EXISTS `tbl_reply`;
CREATE TABLE IF NOT EXISTS `tbl_reply` (
  `rno` int(11) NOT NULL AUTO_INCREMENT,
  `bno` int(11) NOT NULL DEFAULT '0',
  `replytext` varchar(1000) NOT NULL,
  `replyer` varchar(50) NOT NULL,
  `regdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP on UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`rno`),
  KEY `fk_board` (`bno`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

--
-- 덤프된 테이블의 제약사항(외래키 릴레이션쉽)
--

--
-- 테이블의 제약사항 `tbl_attach`
--
ALTER TABLE `tbl_attach`
  ADD CONSTRAINT `fk_board_attach` FOREIGN KEY (`bno`) REFERENCES `tbl_board` (`bno`);

--
-- 테이블의 제약사항 `tbl_reply`
--
ALTER TABLE `tbl_reply`
  ADD CONSTRAINT `fk_board` FOREIGN KEY (`bno`) REFERENCES `tbl_board` (`bno`);
COMMIT;

 

============================================================

Ps. 예전 첨부파일 업로드 방식(아래)

-------------

1 쿼리 확인

--------------

- MySql 방식(아래)

insert into tbl_attach(full_name, bno) values (#{fullname}, LAST_INSERT_ID())

- HSql 방식(아래)

insert into tbl_attach(full_name, bno) values (#{fullname},(SELECT TOP 1 bno FROM tbl_board ORDER BY bno DESC))

-----------------------------------------

2. VO, DAO, Service 확인 - 변동 없음.(Service단에 트랜잭션 필요)

-----------------------------------------

3. Controller 확인

-----------------------------------------

//첨부파일 업로드 경로 추가 servlet-context.xml파일에서 지정된 내용

@Resource(name = "uploadPath")
private String uploadPath;

 

/**
* 게시물관리 > 등록 POST부분에 MultipartFile 클래스형 변수 매개변수 추가 및 FileCopyUtils 클래스로 업로드 구현
*/
@RequestMapping(value = "/admin/board/write", method = RequestMethod.POST)
public String boardWrite(MultipartFile file, BoardVO boardVO,Locale locale, RedirectAttributes rdat) throws Exception {
String originalName = file.getOriginalFilename();
UUID uid = UUID.randomUUID();//랜덤문자 구하기
String savedName = uid.toString() + "." + originalName.split("\\.")[1];//기존 한글문자깨져서 + "_" + originalName;
String[] files = new String[] {savedName};
boardVO.setFiles(files);

boardService.insertBoard(boardVO);

byte[] fileData = file.getBytes();
File target = new File(uploadPath, savedName);
FileCopyUtils.copy(fileData, target);

rdat.addFlashAttribute("msg", "입력");
return "redirect:/admin/board/list";
}

 

/**
* 게시물관리 view 상세보기에서 파일명 보여 주기 추가
*/
@RequestMapping(value = "/admin/board/view", method = RequestMethod.GET)
public String boardView(@RequestParam("bno") Integer bno,Locale locale, Model model) throws Exception {
BoardVO boardVO = boardService.viewBoard(bno);
String files = boardService.getAttach(bno);
String[] filesArray = new String[] {files};
boardVO.setFiles(filesArray);
model.addAttribute("boardVO", boardVO);
return "admin/board/board_view";
}

 

/**
* 게시물 상세보기에서 첨부파일 다운로드 메서드 구현
*/
@RequestMapping(value = "/download", method = RequestMethod.GET)
@ResponseBody
public FileSystemResource fileDownload(@RequestParam("filename") String fileName, HttpServletResponse response){
File file = new File(uploadPath + "/" + fileName);
response.setContentType("application/download; utf-8");
response.setHeader("Content-Disposition", "attachment; filename="+fileName);
return new FileSystemResource(file);
}

 

4. 뷰단 jsp파일에 첨부파일 다운로드 링크 추가

href="/download?filename=${boardVO.files[0]"

첨부파일 배열에서 첫번째 boardVO.files[0]

'JSP·자바·코틀린' 카테고리의 다른 글

스프링BOOT사용_2  (0) 2019.10.23
스프링BOOT사용_1  (0) 2019.10.21
스프링 웹프로젝트 연습_11  (0) 2019.10.19
스프링 웹프로젝트 연습_10  (0) 2019.10.18
스프링 웹프로젝트 연습_9  (0) 2019.10.17

관련글 더보기

댓글 영역