⁂ MyBatis Framework/: 기본 익히기

[MyBatis3] #4-8 파일 업로드 및 댓글 게시판 만들기 : 수정 기능 넣기

김갱환 2022. 11. 11. 16:57

 

1. Model

 * 짚고 넘어갈 뽀인트

 - 코드만 잘 살피자.

 

1) product.xml

<update id="update">
    <![CDATA[
    UPDATE product
    SET product_name = #{product_name}
       ,price = #{price}
       ,description = #{description}
       ,filename = #{filename}
       ,filesize = #{filesize}
    WHERE product_code = #{product_code}
    ]]>
</update>

 

2) productDAO.java

public void update(Map<String, Object> map) {
    sqlSession.update("product.update", map);
} // insert() end

 

2. View

 * 짚고 넘어갈 뽀인트

- 상품 수정 버튼을 클릭할 시 product_update() function 호출.

- document.form1.action 을 활용하여 액션을 취한다.

 : 이는 <form action="/product/update">와 같은 기능이다. 즉, 한 폼 안에서 다양한 액션을 취할 수 있다.

 

<input type="button" value="상품수정" onclick="product_update()">
function product_update(){
    document.form1.action="/product/update";
    document.form1.submit();
} // product_update() end

 

3. Controller

 * 짚고 넘어갈 뽀인트

- update 명령어 생성.

- 기존 파일은 File 클래스를 활용하여 삭제하게 함.

- filesize=(long)product.get("FILESIZE") 코드가 오류가 났다.

 : product.get("FILESIZE")는 Map<String, Object>로 만들어진 product 객체의 값을 get() 메서드로 가져오는 것이다.

 : 여기서 FILESIZE라는 컬럼의 값을 가져올 때 Object로 가져오게 된다.

 : 그런데, Object를 long 형으로 형변환 시에는 String으로 형변환을 한번 한 후 또 다시 형 변환을 해야한다.

 : 그래서 수정된 코드는 filesize=Long.parseLong(product.get("FILESIZE").toString()); 이다.

 

@RequestMapping("/update")
public String update(@RequestParam Map<String, Object> map
                    ,@RequestParam MultipartFile img
                    ,HttpServletRequest req) {

    String filename = "-"; 
    long filesize = 0;
    String product_code = map.get("product_code").toString();
    Map<String, Object> product = productDao.detail(product_code);
    if(img != null && !img.isEmpty()) {
        filename = img.getOriginalFilename(); 
        filesize = img.getSize();
        try {
            ServletContext application = req.getSession().getServletContext();
            String path = application.getRealPath("/storage");

            // 기존 파일 삭제하기
            String oldFilename = product.get("FILENAME").toString();
            File file = new File(path+"\\"+oldFilename);
            if(file.exists()) {
                file.delete();
            } // if end

            img.transferTo(new File(path+"\\"+filename));
        } catch (Exception e) {
            System.out.print("파일 등록 실패 : ");
            e.printStackTrace(); // 에러 출력 메서드
        } // try end			
    } else {
        filename=product.get("FILENAME").toString();
        filesize=Long.parseLong(product.get("FILESIZE").toString());
        // filesize=(long)product.get("FILESIZE"); 오류
    }// if end

    map.put("filename", filename);
    map.put("filesize", filesize);
    productDao.update(map);
    return "redirect:/product/list";
} // update() end