본문 바로가기

카테고리 없음

Spring 10. 게시글 작성(사진게시판)

 

// 지난시간 사진첨부 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>