// 지난시간 사진첨부 insertBoard()에서 추가작업했다..
public class BoardController {
@PostMapping("/insert/{boardCode}")
public String insertBoard(
Board b,
@PathVariable("boardCode") String boardCode,
@ModelAttribute("loginUser") Member loginUser,
Model model, //게시글등록 실패시 errorMsg 담아줄 예정
HttpSession session,
RedirectAttributes ra,
// form태그안에 input type="file"(첨부파일 1개)
@RequestParam(value="upfile", required=false) MultipartFile upfile,
// form태그안에 input type="files"(첨부파일 여러개)
@RequestParam(value="upfiles", required=false) List<MultipartFile> upfiles
// required=false : 매개변수가 있을때만 추가하겠다는 의미
) {
// 이미지, 파일을 저장할 저장경로 얻어오기
String webPath = "/resources/images/board/"+boardCode+"/";
String serverForderPath = application.getRealPath(webPath);
// 디렉토리가 존재하지 않는다면 생성해주는 코드 추가
File dir = new File(serverForderPath);
if(!dir.exists()) {
// 존재하지 않는다면
dir.mkdirs(); // mkdirs() : 디렉토리 여러개 추가할때
}
// 사용자가 첨부파일을 등록한 경우
if(upfile != null && !upfile.getOriginalFilename().equals("")) {
// upfile == null 로 체크하면 안됨!
// => 첨부파일을 등록하지 않아도 무조건 객체는 생성되고 없다면 내부에 데이터가 비어있다("")
// 사용자가 전달한 파일유무는 filename 존재여부로 확인해야 한다!
String changeName = Utils.saveFile(upfile, serverForderPath);
b.setOriginName(upfile.getOriginalFilename()); //원본파일명 저장
b.setChangeName(changeName); // 등록시 변경된 파일명 저장
}
// Board객체에 나머지 데이터 추가하기(default 필드명 제외)
b.setBoardWriter(loginUser.getUserNo()+""); //number -> String으로 변경
b.setBoardCd(boardCode);
log.info("board {}", b); // b에 담긴 데이터 확인하기
// 첨부파일목록(upfiles)의 경우 선택유무에 상관없이 객체는 생성이 된다.
// 단, 선택한 파일이 없다면 길이가 0일 수 있음
// 전달된 파일이 있을 경우에만 해당 파일을 웹서버에 저장하고 BOARD_IMG 테이블에 해당 정보를 등록할 예정
List<BoardImg> imgList = new ArrayList();
int level = 0;
if(upfiles != null) {
for(MultipartFile mf : upfiles) {
if(mf.getOriginalFilename().equals("")) {
continue;
}
String changeName = Utils.saveFile(mf, serverForderPath);
// 이미지 갯수만큼 넣어줌
BoardImg bi = new BoardImg();
bi.setChangeName(changeName);
bi.setOriginName(mf.getOriginalFilename());
bi.setImgLevel(level++);
// pk, refBno 만 추가못함(게시글 작성완료되어야 추가할 수 있음)
imgList.add(bi);
}
}
int result = 0;
try {
result = boardService.insertBoard(b, imgList);
} catch (Exception e) {
e.printStackTrace();
}
String url = "";
if(result > 0) {
// 등록성공시
// session.setAttribute("alertMsg", "게시글 등록 성공!"); // 세션에 담으면 페이지 이동시에도 계속 alertMsg가 뜸
ra.addFlashAttribute("alertMsg", "게시글 등록 성공!"); // 1회만 alert뜨도록 함
url = "redirect:/board/list/" + boardCode;
}else {
model.addAttribute("errorMsg", "게시글 작성 실패!");
url = "common/errorPage";
}
return url;
}
}
<!-- boardImg 다중등록 -->
<insert id="insertBoardList" parameterType="list">
INSERT INTO BOARD_IMG(BOARD_IMG_NO, ORIGIN_NAME, CHANGE_NAME, REF_BNO, IMG_LEVEL)
SELECT SEQ_INO.NEXTVAL, C.*
FROM (
<!--
동적 SQL문 중 foreach
- 특정 SQL구문을 반복할 때 사용함.
- 반복되는 쿼리문 사이에 구분자(separator)를 추가할 수 있음
collection : 반복할 객체의 타입(자료형)
item : collection에서 순차적으로 꺼낸 값을 저장하는 변수
separator : 반복사이의 구분자
index : 현재 반복접근중인 인덱스(0,1,2...)
open : 반복 "전"에 출력할 SQL
close : 반복 "후"에 출력할 SQL
-->
<foreach collection="list" item="boardImg" separator="UNION ALL" >
SELECT #{boardImg.originName},
#{boardImg.changeName},
#{boardImg.refBno},
#{boardImg.imgLevel}
FROM DUAL
</foreach>
) C
</insert>