Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

기록

JAVA sping BOOK 테이블 Create 본문

JAVA

JAVA sping BOOK 테이블 Create

9400 2023. 1. 31. 17:40

컨트롤러/create 메서드

   public ModelAndView create() {
      /* ModelAndView
       *  1) Model : Controller가 반환할 데이터(String,int,List,Map,VO..)를 담당.
       *  2) View : 화면을 담당(뷰(View:jsp)의 경로). jsp파일의 위치
       */
      ModelAndView mav = new ModelAndView();
      
      //	WEB-INF\views\book\create.jsp 의 주소인데
      //	<beans:property name="prefix" value="/WEB-INF/views/" />
      //	<beans:property name="suffix" value=".jsp" />
      //	servlet-context에 저장된 경로를 제외하고 써줌
      //forwarding
      mav.setViewName("book/create");
      return mav;
   }

 

/create.jsp (+파일 이미지 미리보기)

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>책 등록하기</title>
<script type="text/javascript" src="/resources/ckeditor/ckeditor.js"></script>
<script type="text/javascript" src="/resources/js/jquery-3.6.0.js"></script>
<script type="text/javascript">
$(function(){
	
	//이미지 미리보기
	$('#input_imgs').on('change',handleImgFileSelect); //이미지 파일을 선택하면 handleImgFileSelect 함수가 실행됨.
	
	function handleImgFileSelect(e){ //e -> 이벤트
		//파일 객체에 파일들
		let files = e.target.files; //e.target => <input type="file" 태그> 
		let fileArr = Array.prototype.slice.call(files);
		
		//fileArr에서 하나 꺼내면 f(파일객체1개)
		fileArr.forEach(function(f){ 
			if(!f.type.match("image.*")){
				alert("이미지 확장자만 가능합니다.");
				return;
			}
			
			//이미지를 읽을 객체
			let reader = new FileReader();
			
			//reader.readAsDataURL(f);의 이벤트
			reader.onload = function(e){
				let img_html = "<img src=\""+e.target.result+"\" style='width:30%'/>";
				
				$(".imgs_wrap").append(img_html);
			}
			//이미지를 읽자
			reader.readAsDataURL(f);
		});
	}
});

</script>
</head>
<body>
<h1>책 등록</h1>
<!-- 폼페이지 -->
<!-- 
요청URI : /crate?title=냠냠쿨쿨&category=동화&price=10000
요청파라미터 : title=냠냠쿨쿨&category=동화&price=10000
요청방식 : post
 -->
<form action="/create" method="post" enctype="multipart/form-data">
	<!-- 폼데이터 -->
	<div class="imgs_wrap" style="width:30%"></div>
	<p>제목 : <input type="text" name="title" required/></p>
	<p>카테고리 : <input type="text" name="category" required/></p>
	<p>가격 : <input type="number" name="price" required/></p>
	<p>내용 : <textarea name="cont" rows="5" cols="30"></textarea>
	<p>
		책표지 : <input type="file" name="uploadfile" id="input_imgs" multiple>
	</p>
	<p>
		<input type="submit" value="저장" />
		<input type="button" value="목록" />
	</p>
</form>
<script type="text/javascript">
 CKEDITOR.replace('cont'); 
</script>

</body>
</html>

 

저장-->> 클릭

컨트롤러 create(post) 메서드 

   @RequestMapping(value="/create", method=RequestMethod.POST)
   public ModelAndView createPost(BookVO bookVO,ModelAndView mav) {
	   
      //<selectKey resultType="int" order="BEFORE" keyProperty="bookId">
      // 1 증가된 기본키 값을 받음 
      int bookId = bookService.createPost(bookVO);
      
      log.info("bookVO:"+bookVO.toString());

      if(bookId < 1) { // 등록 실패
    	  // /create 로 요청을 다시 함 => uri 주소가 바뀜
    	  mav.setViewName("redirect:/create");
      }else { // 등록 성공 : 상세 페이지로 이동
    	  mav.setViewName("redirect:/detail?bookId=" + bookId);
      }
      return mav;
   }

 

서비스 create(post)메서드 - 여기서 등록 + 파일이미지등록 두 메소드가 실행됨 

	//도서테이블(book)에 입력
	//<insert id="createPost" parameterType="bookVO">
	@Override
	public int createPost(BookVO bookVO) {
		//1)BOOK 테이블에 insert. bookId를 리턴받음
		//		bookVO의 bookId 의 멤버변수에 새로운 값이 들어있다.
		int result =  bookDao.createPost(bookVO);
		
		   bookVO.setContent(bookVO.getCont());
		   
		   String uploadFolder = "C:\\eclipse_202006\\workspace\\springProj\\src\\main\\webapp\\resources\\upload";
		   
		   //make Folder 시작
		   File uploadPath = new File(uploadFolder,LprodController.getFolder());
		   log.info("upload Path : "+uploadPath);
		   
		   //만약 년 월 일 폴더가 없다면 생성
		   if(uploadPath.exists()==false) {
			   uploadPath.mkdir();
		   }
		   //make Folder 끝
		   
		   
		   //bookVO : AttachVO = 1 : N 
		   // List<AttachVO> attachVOList; 에 데이터 넣기 시작
		   List<AttachVO> voList = new ArrayList<AttachVO>();
		   
		   MultipartFile[] mulripartFiles = bookVO.getUploadfile();
		   
		   //multipartFile : 파일객체1개
		   for(MultipartFile mulripartFile : mulripartFiles) {
			   AttachVO vo = new AttachVO();
			   //실제 파일명
			   String uploadFileName = mulripartFile.getOriginalFilename();
			   
			   log.info("--------------------");
			   log.info("filename : "+mulripartFile.getOriginalFilename());
			   log.info("filesize : "+mulripartFile.getSize());
			   log.info("contentType : "+mulripartFile.getContentType());
			   
			   
			   //UUID처리 시작 (파일이름)
			   UUID uuid = UUID.randomUUID();
			   uploadFileName = uuid.toString() + "_" + uploadFileName;
			   //UUID처리 끝
			   
			   //File객체 설계(복사할 경로, 파일명)
			   File savaFile = new File(uploadPath,uploadFileName);
			   
			   try {
				//파일 복사, 파일 객체를 복사한다(대상경로 및 파일명으로)   
				   mulripartFile.transferTo(savaFile);
				   
				   //이미지인가?
				   if(LprodController.checkImageType(savaFile)) {
					   FileOutputStream thumbnail = new FileOutputStream(
							   new File(uploadPath, "s_"+uploadFileName)
							   );
					   //썸네일 생성
					   Thumbnailator.createThumbnail(mulripartFile.getInputStream(),thumbnail,100,100);
					   thumbnail.close();
				   }
			   }catch(IllegalStateException e) {
				   log.error(e.getMessage());
			   }catch(IOException e) {
				   log.error(e.getMessage());
			   }
			   //2023/01/30/asdfa_개똥이.jpg
			   String filename= "/" + LprodController.getFolder().replace("\\","/")+"/"+uploadFileName;
			   vo.setFilename(filename);
			   Long l = mulripartFile.getSize();
			   vo.setFilesize(l.intValue());
			   
				//2023/01/30/s_asdfa_개똥이.jpg
				String thumbFileName =  "/" + LprodController.getFolder().replace("\\","/")+"/"+"s_"+uploadFileName;
				vo.setThumbnail(thumbFileName);
			   
				//전사적 아이디
				vo.setEtpId(bookVO.getBookId()+"");
				voList.add(vo);
		   }
			
		   //ATTACH 테이블에 INSERT 하기위한 최종목적
		   bookVO.setAttachVOList(voList);
		   
		// List<AttachVO> attachVOList; 에 데이터 넣기 끝
		   
		   //2)bookDAO의 createPostAttach(List<AttachVO> attachVOList)메소드 호출 
		   this.bookDao.createPostAttach(bookVO.getAttachVOList());

		   return result;
	
	}

 

DAO

	public int createPost(BookVO bookVO) {
		//.insert("namesapce값.id값",파라미터)
		//book_SQL.xml 파일의 namespace가 book이고, id가 insert인
		//태그를 찾아 그 안에 들어있는 sql을 실행함
		//this : BookDao, 생략 가능
		//insert, update, delete는 반영된 건수가 return함
		//insert성공 : 1이상, 실패면 0
		
		log.info("bookVO : "+bookVO.toString());
		int result = this.sqlSessionTemplate.insert("book.createPost",bookVO);
		int bookId = 0;
		if(result>0) { //insert성공
			bookId = bookVO.getBookId(); // 맨처음 ->1 
		}else { //insert실패
			bookId = 0;
		}
		
		return bookId;
	}
    
    	public int createPostAttach(List<AttachVO> attachVOList){
		return this.sqlSessionTemplate.update("book.createPostAttach",attachVOList);
	}

 

BOOK MAPPER

  <resultMap type="bookVO" id="bookMap">
  	<result property="bookId" column="BOOK_ID"/>
  	<result property="title" column="TITLE"/>
  	<result property="category" column="CATEGORY"/>
  	<result property="price" column="PRICE"/>
  	<result property="insertDate" column="INSERT_DATE"/>
  	<result property="content" column="CONTENT"/>
  <collection property="attachVOList" resultMap="attachMap"></collection>
  </resultMap>
  
  <resultMap type="attachVO" id="attachMap">
  	<result property="etpId" column="ETP_ID" />
  	<result property="seq" column="SEQ" />
  	<result property="filename" column="FILENAME" />
  	<result property="filesize" column="FILESIZE" />
  	<result property="thumbnail" column="THUMBNAIL" />
  	<result property="regdate" column="REGDATE" />
  </resultMap>
  
  
    	 <insert id="createPost" parameterType="bookVO">
	  	 <!--  key를 높이면 rok이 된다 ... -->
	  	 <selectKey resultType="int" order="BEFORE" keyProperty="bookId">
		  	 SELECT NVL(MAX(BOOK_ID),0)+1 FROM BOOK
	  	 </selectKey>
	  	 insert into book(BOOK_ID, TITLE, CATEGORY, PRICE, INSERT_DATE, CONTENT)
		 values ( #{bookId},#{title},#{category},#{price},sysdate,#{cont})
  	 </insert>
  
  
    	   	<!-- 다중 insert시 update 태그를 사용
  		 드루와 : List<AttachVO> attachVOList
  		 가자 : insert, update, delete의 경우 resultType은 생략
  		  -->
  	<update id="createPostAttach" parameterType="java.util.List">
  		<!-- index : 반복 시 index값. 0부터 시작 -->
  		<selectKey resultType="int" order="BEFORE" keyProperty="seq">
  			SELECT NVL(MAX(SEQ),0)+1 FROM ATTACH
  		</selectKey>
  	
  		<foreach collection="list" item="attachVO" 
  			open="INSERT ALL" close="SELECT * FROM DUAL" separator=" "
  			index="idx" >
  			INTO ATTACH(SEQ, FILENAME, FILESIZE, THUMBNAIL, REGDATE, ETP_ID)
   			 VALUES(#{idx}+#{seq},#{attachVO.filename},#{attachVO.filesize},#{attachVO.thumbnail},sysdate,#{attachVO.etpId})
  		</foreach>
  	</update>
  	</update>
Comments