Spring/[Spring]Board(기본 게시판)
스프링 게시판 만들기 - 4(글 업로드)
Ms.Pudding
2022. 1. 15. 00:13
1.controller
파일이랑 게시판 업로드 화면을 받는 controller를 만들어보자
@Controller
@AllArgsConstructor
public class BoardController{
private final BoardService boardService;
//단순 화면 보여주기
@GetMapping("/board/list")
public ModelAndView getList(){
ModelAndView view = new ModelAndView();
view.setViewName("views/board/board_list");
return view;
}
//게시판 등록페이지
@GetMapping("/board/register")
public ModelAndView registerView(){
ModelAndView view = new ModelAndView();
view.setViewName("views/board/register");
return view;
}
//게시판 등록 psot
@("/board/register/add")
public MoadelAndView register(@ModelAttribute BoardVO.request request){
ModelAndView view = new ModelAndView();
try{
boardService.register(request);
}catch(Exception e){
e.printStackTrace();
}
view.setViewName("views/board/board_list");
return view;
}
}
@ModelAttribute 객체를 받아오며, 게시판 등록 post부분에 BoardVO.request 객체를 받아온다!
2.mapper쿼리 등록
<insert id="insertBoard" parameterType="com.board.web.vo.board.BoardVO$Request">
insert into board(title,content,writer,origin_file_name,stored_file_name)
values(#{title},#{content},#{writer},#{originFileName},#{storedFileName})
</insert>
윗칸이 db에 쓰는 형식으로 쓰고 #{}로 셀렉트 된 부분은 자바형식으로 쓴다
3. 자바 mapper
//게시판 전체 게시글 수 가져오기 (페이징 시 필요)
public int getListCount() throws Exception;
//게시판 등록하기
public int insertBoard(BoardVO.Request request) throws Exception;
4.service
@Service
public class BoardService{
private BoardMapper mapper;
@Value("${propertiy 주소}")
private String filePath;
public BoardService(BoardMapper mapper){
this.mapper = mapper;
}
//전체 게시글 수
public int getListCount() throws Exception{
return this.mapper.getListCount();
}
//게시글 등록
public int register(BoardVO.Request request) throws Exception{
//파일 업로드 실행 부분
MultipartFile file = request.getFile();
//원본 파일 저장변수
String originFileName ="";
//확장자 저장 변수
String exe ="";
//저장 파일 이름
String storedFileName = "";
//파일 객체를 넘겨 준 후, 업로드 시작
if(!file.isEmpty()){
//원본 파일 이름을 저장
originFileName = file.getOriginalFileName();
//파일 확장자만 추출
exe = originFileName.subString(originFileName.lastIndexOf(".")+1)
//파일 저장 이름
storedFileName = "file_" + nowTime +"."+exe;
//파일 저장 경로
String fullPath = filePath+storedFileName;
//파일 객체를 생성
File newFile = new File(fullPath);
}
//파일이나 경로가 존재하지 않는 경우
if(!newFile.exists()){
//저장 디렉토리 만들기
newFile.getParentFile().mkdirs();
//파일 복사할 내용이 없는 파일을 만든다.
newFile.createNewFile();
}
// 빈 파일에 원본을 복사하여 담는다
file.transferTo(newFile);
request.setOriginFileName(originFileName);
request.setStoredFileName(storedFileName);
return mapper.insertBoard(request);
}
}
1.@AllArgsContstuctor를 쓰지 않았다. 왜냐하면 filePath는 주소를 가지고 있는 변수인데, 여기서 주소가 변동될 수도 있기 때문에 mapper 생성자는 따로 써줬다.
2.업로드 실행순서
-1. MultiPartFile 객체를 만든다. 여기에 파일을 저장할 것이다.
-2. 원본 파일 이름, 확장자, 저장 파일 이름을 구분 짓는다.
-3. 저장경로를 설정한다. 이때 저장경로는 filePath 즉, 내 로컬파일에 있는 주소와 저장된 파일 이름을 가지고 있다.
-4. 이 저장경로를 가지고 있는 파일 객체를 만든다.
-5. 이제 MultipartFile 객체에 파일을 복사하여 담는다
3.originFileName.lastIndexOf(".")+1
확장자를 추출하는 과정인데 +1을 안하면 .을 포함한 뒷 부분 전체를 가르킨다.
+1을 했으니 .을 포함하지 않는 뒷부분을 가르키며
이를 subString으로 감싸주었으니 그 부분만 추출하여 확장자를 확인한다.