파일을 올리는 것은 db에 저장하는 것이 아니고 서버나 DISK에 저장하게 된다. 이때, 올려준 파일들은 예를들어, D:\dev\data\(+날짜폴더)와 같은 경로에 배열1.jpg(uuid:avdsae13124lks), 배열2.jpg와 같이 저장된다.
Files테이블
파일번호 | 글번호 | 파일명 | 실제파일명 |
4 | 1 | 배열1.jpg | avdsae13124lks |
5 | 1 | 배열2.jpg | 31nrio32hlk3 |
그리고 db에는 파일법호, 파일명, 실제 파일명(중복방지)과 같은 파일의 정보에 대해서만 저장하게 된다.
수업시간에는 dao를 mapper와 mybatis로 대체했다.
~> 실제 파일은 dao(mapper)가 저장하고 넘어온 값을 받아서 모델에 던져준다
~> 디스크에 저장하는 일은 service가 하는 것
~> db와 관련된 일은 dao(mapper와 mybatis)
PdsController - 파일 저장 로직 시작점
역할: 사용자가 입력한 자료실 글 작성 폼 데이터를 수집하고, 업로드된 파일들을 PdsService로 전달합니다.
write() 메서드에서 @RequestParam으로 map과 uploadfiles 배열을 받아옵니다.
이 map은 menu_id, nowpage, title, writer, content 등의 자료실 글 정보이며, uploadfiles는 MultipartFile 배열로 전송된 파일들을 포함합니다.
pdsService.setWrite(map, uploadfiles);를 호출하여 서비스 계층으로 자료를 넘기며 저장 작업을 위임합니다.
작업이 완료되면 작성 완료 후 redirect:/Pds/List로 목록 페이지로 리다이렉션합니다.
2. PdsService 및 PdsServiceImpl - 파일 저장 로직을 서비스 계층에서 처리
역할: 파일 저장을 위한 비즈니스 로직을 담고 있으며, 파일 저장을 처리하는 PdsFile 클래스를 호출해 실제 파일 저장 및 데이터베이스 저장을 위임합니다.
PdsServiceImpl의 setWrite() 메서드는 map과 uploadfiles를 입력으로 받아, 업로드 경로(uploadPath)를 map에 추가한 뒤, PdsFile.save()를 호출하여 파일 저장을 진행합니다.
파일이 PdsFile에서 처리되면 그 결과 데이터(fileList)가 map에 포함되어 돌아옵니다. 이후 map을 통해 DB에 파일 및 글 관련 데이터를 저장할 수 있게 됩니다.
3. PdsFile - 파일 저장 처리 전담
PdsFile 클래스는 파일 저장과 관련된 다양한 작업을 담당하는 유틸리티 클래스입니다. 이 클래스는 특히 다음의 기능을 수행합니다.
파일 저장 경로 지정: map에서 uploadPath를 불러와 실제로 파일이 저장될 경로를 설정합니다.
파일 이름 처리 및 고유 ID 생성: 파일의 중복을 방지하기 위해 UUID를 사용해 파일명을 생성하고, makeFolder() 메서드로 날짜별 폴더를 만들어 파일이 정렬되게 합니다.
파일 업로드 및 저장: 각 MultipartFile 객체에 대해 uploadfile.transferTo(savePath);를 통해 실제 파일을 지정된 경로에 저장합니다.
파일 정보 수집: 저장된 파일의 정보를 FilesVo 객체로 생성하여, 파일 목록(fileList)에 추가하고, map에 저장하여 이후 서비스 계층에서 사용할 수 있도록 합니다.
PdsFile의 메서드 세부 설명:
save(): 파일 저장과 관련된 전체 프로세스를 진행합니다. 각 파일에 대해 UUID 기반의 고유 이름과 날짜별 폴더를 포함한 경로를 생성하여 파일을 물리적으로 저장한 뒤, FilesVo 객체에 저장된 파일 정보를 map에 담아 반환합니다.
makeFolder(): 날짜별 폴더 생성 메서드로, 매일 새로운 폴더가 생겨 저장 경로가 정리됩니다. uploadPath에 날짜 포맷(yyyy/MM/dd)을 적용해 폴더 경로를 지정하고, 해당 경로가 없으면 mkdirs()로 폴더를 생성합니다.
4. 파일 저장 후 데이터베이스 처리
파일이 PdsFile을 통해 물리적으로 저장되면, 각 파일 정보는 FilesVo 리스트에 담겨 map에 포함됩니다.
PdsServiceImpl은 map을 통해 글과 파일 정보를 DB에 각각 저장하도록 합니다.
이 과정에서 PdsMapper는 글 데이터와 파일 데이터를 BOARD 테이블과 FILES 테이블에 저장하는 역할을 합니다.
JSP 파일 - 자료실 글 작성 화면
사용자는 WriteForm에서 제목, 작성자 이름, 내용을 입력하고 파일을 추가합니다.
<form> 태그는 /Pds/Write로 POST 요청을 보내고, multipart/form-data를 설정해 파일도 함께 업로드합니다.
JavaScript로 작성된 간단한 입력 유효성 검사를 통해 제목과 작성자 이름이 입력되지 않으면 경고를 표시합니다.
btnAddFile 버튼을 클릭하면 <input type="file"> 요소가 추가되면서 여러 파일을 업로드할 수 있습니다.
요약
PdsController가 받은 데이터를 PdsService로 전달하여 비즈니스 로직을 수행하며, 파일은 PdsFile에서 실제 저장 처리를 담당합니다. PdsFile은 파일명 중복 방지를 위한 UUID 생성, 날짜별 폴더 구조 생성, 파일 저장 및 삭제 기능을 통해 파일을 효과적으로 관리하도록 설계되었습니다.
1. PdsController
PdsController는 /Pds 관련 요청을 처리하며, 자료실의 목록, 작성 폼, 저장과 같은 기능을 제공합니다.
list() 메서드
/Pds/List 요청을 받아 자료실 목록 페이지를 반환합니다.
menuMapper를 통해 menuList를 받아와서 자료실 카테고리를 준비하고, pdsService.getPdsList(map)을 호출해 pdsList 데이터를 조회합니다.
데이터는 ModelAndView에 추가하여 pds/list.jsp로 렌더링됩니다.
writeForm() 메서드
/Pds/WriteForm 요청을 받아 자료실 작성 폼을 보여줍니다.
menuList와 현재 페이지의 데이터를 map에 추가하고, pds/write.jsp로 이동하여 폼을 렌더링합니다.
write() 메서드
/Pds/Write 요청을 처리해 폼에서 입력한 자료실 글과 파일을 저장합니다.
전달된 map과 uploadfiles 배열을 pdsService.setWrite()에 넘겨 파일과 글 저장을 처리합니다.
작성 완료 후, 목록 페이지로 리다이렉트합니다.
2. PdsService
PdsService 인터페이스는 자료실 관련 메서드를 선언합니다.
getPdsList(map): 목록 조회 메서드.
setWrite(map, uploadfiles): 파일 저장 및 글 등록 메서드.
3. PdsServiceImpl
PdsServiceImpl는 PdsService의 구현체로, 실제로 파일을 저장하고 데이터베이스에 자료실 글과 파일 정보를 등록하는 역할을 수행합니다.
getPdsList() 메서드
pdsMapper.getPdsList(map)을 호출해 자료실 글 목록을 조회합니다.
pdsMapper는 MyBatis 매퍼로, SQL 쿼리를 통해 자료실 글과 관련된 파일 개수를 가져옵니다.
setWrite() 메서드
map과 uploadfiles 배열을 받아 파일 저장과 글 등록을 담당합니다.
PdsFile.save(map, uploadfiles) 메서드를 호출하여 실제 파일을 서버에 저장하고, 파일 정보를 fileList에 담아 map에 추가합니다.
이후, pdsMapper를 통해 BOARD 테이블과 FILES 테이블에 파일과 글 정보를 저장합니다.
4. PdsFile 클래스
PdsFile 클래스는 파일 저장을 전담하며, 실제 파일 저장 경로 설정과, FILES 테이블에 저장될 파일 정보를 구성합니다.
save(map, uploadfiles) 메서드
uploadPath 경로와 uploadfiles 파일 배열을 받아 파일 저장을 진행합니다.
파일 배열을 반복 처리하며 파일 이름과 확장자를 구분하고, UUID를 통해 중복을 방지하는 고유 파일 이름을 생성합니다.
makeFolder() 메서드를 호출해, 현재 날짜에 따른 하위 폴더 구조를 생성하고 해당 경로에 파일을 저장합니다.
저장한 파일의 경로와 파일명을 포함하는 FilesVo 객체를 생성하고, fileList에 추가합니다.
모든 파일 정보를 fileList에 담아 map에 저장해 pdsServiceImpl로 반환합니다.
makeFolder(uploadPath) 메서드
날짜를 기준으로 연/월/일 구조의 폴더를 생성합니다.
예를 들어, 2024/11/05 형식의 폴더가 uploadPath 아래에 생성됩니다.
mkdirs() 메서드를 사용해 상위 폴더가 없더라도 전체 경로를 생성합니다.
delete(uploadPath, fileList) 메서드
삭제 시 fileList를 순회하며 각 파일의 실제 경로를 찾아 삭제합니다.
파일이 존재하는지 확인하고, exists() 메서드를 통해 확인 후 delete()로 제거합니다.
5. JSP 파일 (pds/write.jsp)
작성 폼 페이지로, 사용자가 글을 작성하고 파일을 업로드할 수 있습니다.
파일 업로드:
여러 파일을 업로드할 수 있도록 파일 입력 필드를 추가하는 버튼이 포함되어 있으며, JavaScript 이벤트로 파일 필드를 동적으로 추가합니다.
폼 제출:
title과 writer 필드의 입력값을 검사하고, 누락 시 사용자에게 경고를 표시합니다.
제출 시 enctype="multipart/form-data" 속성을 설정해 파일을 포함하여 서버로 전송합니다.
전체 흐름
목록 조회: PdsController.list() → PdsServiceImpl.getPdsList() → PdsMapper.getPdsList().
작성 폼 이동: PdsController.writeForm().
글 작성 및 파일 업로드: PdsController.write() → PdsServiceImpl.setWrite() → PdsFile.save().
'SPRING' 카테고리의 다른 글
[spring]파일 다운로드 (2) | 2024.11.07 |
---|---|
[spring] Dao와 Service (2) | 2024.11.04 |
[Spring] 페이징(Pagination) (0) | 2024.10.20 |
[spring]회원정보 수정 - 비밀번호 체크하기 (0) | 2024.10.13 |
[spring] 회원가입 - 아이디 중복 체크하기 (0) | 2024.10.13 |