클라우드 융합 Full-stack 웹 개발자 양성과정/Servlet, JSP

Servlet/JSP - 일반게시글 작성3(파일첨부테이블), 상세페이지, 게시글 수정

thesunset 2022. 11. 17. 18:18

1. 일반게시글 작성3(파일첨부테이블)

<com.kh.board.controller>BoardInsertController

2) 값뽑기 : 카테고리번호, 제목, 내용, 게시글을 작성한 회원번호를 Board객체로 가공

String userNo = multiRequest.getParameter("userNo");
String category = multiRequest.getParameter("category");
String boardTitle = multiRequest.getParameter("title");
String boardContent = multiRequest.getParameter("content");

3-1) 가공 => 첫번째 insert문에 해당

Board b = new Board();

b.setCategory(category);
b.setBoardTitle(boardTitle);
b.setBoardContent(boardContent);
b.setBoardWriter(userNo);

3-2) 가공 => 두번째 insert => 선택적(첨부파일이 있을 경우에만 insert)

case1 : 하나의 게시글에 하나의 첨부파일(테이블로 따로 뺄 필요 없음)

case2 : 하나의 게시글에 여러개의 첨부파일(파일저장테이블을 따로 만들어야 함)

=> 파일정보를 저장할 VO클래스 만들기

<com.kh.board.model.vo>Attachment

package com.kh.board.model.vo;

import java.sql.Date;

public class Attachment {

private int fileNo;
private int refBno;
private String originName;
private String changeName;
private String filePath;
private Date uploadDate;
private int fileLevel;
private String status;

public Attachment() {
    super();
}
public Attachment(int fileNo, int refBno, String originName, String changeName, String filePath, Date uploadDate,
        int fileLevel, String status) {
    super();
    this.fileNo = fileNo;
    this.refBno = refBno;
    this.originName = originName;
    this.changeName = changeName;
    this.filePath = filePath;
    this.uploadDate = uploadDate;
    this.fileLevel = fileLevel;
    this.status = status;
}
public int getFileNo() {
    return fileNo;
}
public void setFileNo(int fileNo) {
    this.fileNo = fileNo;
}
public int getRefBno() {
    return refBno;
}
public void setRefBno(int refBno) {
    this.refBno = refBno;
}
public String getOriginName() {
    return originName;
}
public void setOriginName(String originName) {
    this.originName = originName;
}
public String getChangeName() {
    return changeName;
}
public void setChangeName(String changeName) {
    this.changeName = changeName;
}
public String getFilePath() {
    return filePath;
}
public void setFilePath(String filePath) {
    this.filePath = filePath;
}
public Date getUploadDate() {
    return uploadDate;
}
public void setUploadDate(Date uploadDate) {
    this.uploadDate = uploadDate;
}
public int getFileLevel() {
    return fileLevel;
}
public void setFileLevel(int fileLevel) {
    this.fileLevel = fileLevel;
}
public String getStatus() {
    return status;
}
public void setStatus(String status) {
    this.status = status;
}

@Override
public String toString() {
    return "Attachment [fileNo=" + fileNo + ", refBno=" + refBno + ", originName=" + originName + ", changeName="
            + changeName + ", filePath=" + filePath + ", uploadDate=" + uploadDate + ", fileLevel=" + fileLevel
            + ", status=" + status + "]";
}

}

<com.kh.board.controller>BoardInsertController

- Attachment 객체 초기화

Attachment at = null;

- 첨부파일의 유무 여부를 아는 방법
multiRequest.getOriginalFileName("키값")
첨부파일이 있으면 "원본파일명" / 첨부파일이 없으면 null리턴

if(multiRequest.getOriginalFileName("upfile") != null) {

첨부파일이 존재함 => attechment vo로 가공
①원본파일명 set

at = new Attachment();
at.setOriginName(multiRequest.getOriginalFileName("upfile"));

② 수정파일명 set : multiRequest.getFilesystemName("키값");

at.setChangeName(multiRequest.getFilesystemName("upfile"));

③ 파일경로 

at.setFilePath("resources/board_upfiles");

4) Service에 요청

int result = new BoardService().insertBoard(b, at);

5) 응답화면 지정

- 성공 시  list.bo?cpage=1로 url지정

if(result > 0) { 
		request.getSession().setAttribute("alertMsg", "게시글 등록에 성공하였습니다.");
        	response.sendRedirect(request.getContextPath()+"/list.bo?cpage=1"); 
                //이 url로 다시 재요청 보내도록 (url에 대한 응답을 다시 받음)
                }

- 실패 시,

만약에 첨부파일이 있었다면, resources폴더에 board_upfiles폴더에 이미 업로드 된 파일을 굳이 서버에 보관할 필요 X

=> 파일을 삭제해주어야 함 delete() 호출

else { 
    if(at != null) {
        new File(savePath + at.getChangeName()).delete(); //파일 객체 생성후 사용 가능
            }
        request.setAttribute("arrorMsg", "게시글 작성 실패");
        request.getRequestDispatcher("views/common/errorPage.jsp").forward(request, response); //위임하기
    }

<com.kh.board.model.service>BoardService

Board테이블에 INSERT 반드시 해야함 (필수)
첨부파일은 존재할 경우에만 ATTACHMENT테이블에 INSERT
1) BOARD테이블에 INSERT

public int insertBoard(Board b, Attachment at) {

  	 Connection conn = getConnection();
        int result1 = new BoardDao().insertBoard(conn, b);

<com.kh.board.model.dao>BoardDao

public int insertBoard(Connection conn, Board b) {

    int result = 0;
    PreparedStatement pstmt = null;

    String sql = prop.getProperty("insertBoard");

    try {
        pstmt = conn.prepareStatement(sql);

        pstmt.setInt(1, Integer.parseInt(b.getCategory()));
        pstmt.setString(2, b.getBoardTitle() );
        pstmt.setString(3, b.getBoardContent() );
        pstmt.setInt(4, Integer.parseInt(b.getBoardWriter()));

        result = pstmt.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        close(pstmt);
    }
    return result;
}

<com.kh.board.model.service>BoardService

2) ATTACHMENT테이블에 INSERT

int result2 = 1; //첨부파일이 없을 수도 있기 때문에 (첨부파일 실패하면 다시 0으로 초기화되기때문에 rollback처리 가능)
if(at != null) {
    result2 = new BoardDao().insertAttachment(conn, at);
} //else구문을 필요하지 않음

** 반드시 result2는 초기화를 1로 해주어야 함

<com.kh.board.model.dao>BoardDao

public int insertAttachment(Connection conn, Attachment at) {

    int result = 0;
    PreparedStatement pstmt = null;

    String sql = prop.getProperty("insertAttachment");

    try {
        pstmt = conn.prepareStatement(sql);

        pstmt.setString(1, at.getOriginName());
        pstmt.setString(2, at.getChangeName());
        pstmt.setString(3, at.getFilePath());

        result = pstmt.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        close(pstmt);
    }
    return result;
}

<쿼리문>

- insertBoard

<entry key="insertBoard">
INSERT 
INTO
    BOARD
    (
    BOARD_NO,
    BOARD_TYPE,
    CATEGORY_NO,
    BOARD_TITLE,
    BOARD_CONTENT,
    BOARD_WRITER
    )
VALUES
    (
    SEQ_BNO.NEXTVAL,
    1,
    ?,
    ?,
    ?,
    ?
    )
</entry>

- insertAttachment 

<entry key="insertAttachment">
INSERT 
INTO
    ATTACHMENT
     (
       FILE_NO,
       REF_BNO,
       ORIGIN_NAME,
       CHANGE_NAME,
       FILE_PATH
    )
VALUES
    (
    SEQ_FNO.NEXTVAL,
    SEQ_BNO.CURRVAL,
    ?,
    ?,
    ?
    )
</entry>

INSERT하기 전 INSERT하고 있는 BOARDNO(REF_BNO)을 넣어야 함 (아직 게시글이 생성되지 않았기 때문에)

SEQ_BNO.CURRVAL => 마지막으로 NEXTVAL을 성공한 시퀀스 번호 

2. 상세페이지

<boardListView.jsp>

<script>
$(function(){

    $('.list-area>tbody>tr').click(function(){
        location.href = '<%=contextPath%>/detail.bo?bno=' + $(this).children().eq(0).text();
    });

});
</script>

tr요소를 클릭하면 그 게시글의 상세페이지로 요청 => 구분하기 위해서 boardNo가 필요함(GET방식으로 넘겨주기)

<com.kh.board.controller>BoardDetailController

1) GET 방식 => 인코딩 X

2) 값 추출

int boardNo = Integer.parseInt(request.getParameter("bno"));

3) 가공 => 하나이므로 처리 X

4-1) 조회수 증가 

* BoardService를 자주 사용할 예정이기에 변수를 빼놓기

BoardService bService = new BoardService();

int result = bService.increaseCount(boardNo);

if(result>0) {

=> if문 안에 들어왔다(조회수가 증가했다) == 조회를 성공 

4-2) 상세페이지 요청(조회수증가성공)

(1) board조회

Board b = bService.selectBoard(boardNo);

(2) attachment조회

Attachment at = bService.selectAttachment(boardNo);

(3) 조회한 b, at Attribute에 담기

request.setAttribute("b", b);
request.setAttribute("at", at);

(4) 화면 => forwarding

request.getRequestDispatcher("views/board/boardDetailView.jsp").forward(request, response);

4-3) 조회수 증가 실패 == 조회실패

else {
    request.setAttribute("alertMsg", "게시글 조회에 실패하였습니다.");
    request.getRequestDispatcher("views/common/errorPage.jsp").forward(request, response);
}

<com.kh.board.model.service>BoardService

* 총 3개의 service 

- increaseCount

public int increaseCount(int boardNo) {

    Connection conn = getConnection();

    int result = new BoardDao().increaseCount(conn, boardNo);

    if(result>0) {
        commit(conn);
    }else {
        rollback(conn);
    }
    return result;
}

- selectBoard

public Board selectBoard(int boardNo) {

    Connection conn = getConnection();

    Board b = new BoardDao().selectBoard(conn, boardNo);

    close(conn);

    return b;

}

- selectAttachment

public Attachment selectAttachment(int boardNo) {
	
		Connection conn = getConnection();
		
		Attachment at = new BoardDao().selectAttachment(conn, boardNo);
		
		close(conn);
		
		return at;
	}

<com.kh.board.model.Dao>BoardDao

- increaseCount

public int increaseCount(Connection conn, int boardNo) {
    int result = 0; 

    PreparedStatement pstmt = null; //원래는 PreparedStatement pstmt;라고 변수를 선언하는게 맞음(참조자료형은 기본값이 null)

    String sql = prop.getProperty("increaseCount");

    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, boardNo);

        result = pstmt.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        close(pstmt);
    }

    return result;
}

- selectBoard

public Board selectBoard(Connection conn, int boardNo) {

    ResultSet rset = null;
    PreparedStatement pstmt = null;
    Board b = null; 

    String sql = prop.getProperty("selectBoard");

    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, boardNo);

        rset = pstmt.executeQuery();
    if(rset.next()){
        b = new Board();
        b.setBoardNo(rset.getInt("BOARD_NO"));
        b.setCategory(rset.getString("CATEGORY_NAME"));
        b.setBoardTitle(rset.getString("BOARD_TITLE"));
        b.setBoardWriter(rset.getString("USER_ID"));
        b.setCreateDate(rset.getDate("CREATE_DATE"));
        b.setBoardContent(rset.getString("BOARD_CONTENT"));
    }


    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        close(rset);
        close(pstmt);
    }
    return b;
	}

- selectAttachment

public Attachment selectAttachment(Connection conn, int boardNo) {

    Attachment at = null;
    ResultSet rset = null;
    PreparedStatement pstmt = null;

    String sql = prop.getProperty("selectAttachment");

    try {
        pstmt = conn.prepareStatement(sql);

        pstmt.setInt(1, boardNo);

        rset = pstmt.executeQuery();

        if(rset.next()) {
            at = new Attachment();
            at.setFileNo(rset.getInt("FILE_NO"));
            at.setOriginName(rset.getString("ORIGIN_NAME"));
            at.setChangeName(rset.getString("CHANGE_NAME"));
            at.setFilePath(rset.getString("FILE_PATH"));
        }

    } catch (SQLException e) {
        e.printStackTrace();
    } finally{
        close(rset);
        close(pstmt);
    }
    return at;
}

<boardDetailView.jsp>

- 사용자에게 보여줄 상세페이지 화면 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import ="com.kh.board.model.vo.*" %>   
<%
	Board b = (Board)request.getAttribute("b");
	//게시글 번호, 카테고리명, 제목, 내용, 작성자 아이디, 작성일
	Attachment at = (Attachment)request.getAttribute("at");
	//파일번호, 원본명, 수정명, 저장경로 
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>일반게시판 상세보기</title>
<style>
	.outer{
		width: 1000px;
		margin: auto;
		background-color:  #88A201;
		margin-top: 5px;
		color: white;
	}

	#detail-area{
		text-align: center;
		border: 1px solid wheat;
	}
	a{
		text-decoration: none;
		color: skyblue;
	}
</style>
</head>
<body>

	<%@ include file = "../common/menubar.jsp" %>

	<div class="outer">
	
		<br>
		<h2 align="center">일반게시판 상세보기</h2>
		<br>
		
		<table align="center" id="detail-area" border="1">
            <tr>
                <th width="70">카테고리</th>
                <td width="100"><%=b.getCategory() %></td>
				<th width="70">제목</th>
				<td width="380"><%=b.getBoardTitle() %></td>

            </tr>
            <tr>
				<th>작성자</th>
				<td><%=b.getBoardWriter() %></td>
				<td>작성일</td>
				<td><%=b.getCreateDate() %></td>
			</tr>
            <tr>
                <th>내용</th>
                <td colspan="3">
					<p style="height: 200px;"><%=b.getBoardContent() %></p>
				</td>
            </tr>
            <tr>
                <th>첨부파일</th>
                <td colspan="3">
					<%if(at==null){ %>
					<!--  첨부파일 X -->
							첨부파일이 없습니다.
					<%} else{ %>
					<!--  첨부파일 O -->
					<a download="<%=at.getOriginName() %>" href="<%=contextPath%>/<%=at.getFilePath()%>/<%=at.getChangeName() %>"><%=at.getOriginName() %></a>
							<%} %>
				</td>
            </tr>
        </table>
		<br><br>
	</div>

</body>
</html>

* 사용자가 첨부한 파일을 download할 수 있도록 하려면 태그 속성에  'download'속성추가

+/ 원본명으로 다운로드되게 하고 싶으면 속성지정해주기

 

3. 게시글 수정하기

로그인한 사용자고 현재 이게시글의 작성자일 경우에만 수정하기 버튼을 활성화

<boardDetailView.jsp>

<div align="center">
    <a class="btn btn-sm btn-secondary" href="<%=contextPath%>/list.bo?cpage=1">목록</a>
    <%if(loginUser != null && loginUser.getUserId().equals(b.getBoardWriter())){ %>
    <a class="btn btn-sm btn-warning" href="<%=contextPath%>/updateForm.bo?bno=<%=b.getBoardNo()%>">수정</a>
    <%} %>
<br><br>
</div>

<com.kh.board.controller>BoardUpdateFormController

수정은 사용자가 기존에 입력한 값들이 페이지 내에 존재해야 수정이 가능함

=> 즉, 원래 데이터부터 조회를 해야한다.

1) 우선적으로 해야 할 일 : 카테고리 전체 조회해오기

ArrayList<Category> list = new BoardService().selectCategory();

2) 해당 글 번호 뽑기 

int boardNo = Integer.parseInt(request.getParameter("bno"));

3-1) 글번호에 해당하는 Board테이블 행조회

Board b = new BoardService().selectBoard(boardNo);

3-2) 글번호에 해당하는 Attechment테이블의 행 조회

Attachment at = new BoardService().selectAttachment(boardNo);

4) 값 담기

request.setAttribute("list", list);
request.setAttribute("at", at);
request.setAttribute("b", b);

5) 화면조회(수정)

request.getRequestDispatcher("views/board/boardUpdateForm.jsp").forward(request, response);

<BoardUpdateForm>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList, com.kh.board.model.vo.*" %>    
<%
	ArrayList<Category> list = (ArrayList<Category>)request.getAttribute("list");
	Board b = (Board)request.getAttribute("b");
	Attachment at = (Attachment)request.getAttribute("at");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>일반 게시글 수정</title>
<style>
	body{
		box-sizing: border-box;
	}
	.outer{
		width: 1000px;
		margin: auto;
		background-color:  #88A201;
		margin-top: 5px;
		color: white;
	}
	
	#update-form input, #update-form textarea{
		width: 100%;
		box-sizing: border-box;
	}
	#update-form>table{
		border: 1px solid wheat;
	}
</style>
</head>
<body>
	<%@ include file="../common/menubar.jsp" %>
	
	<div class="outer">
		<br>
		<h2 align="center">일반 게시글 수정</h2>
		<br>

		<form action="<%=contextPath%>/update.bo" method="post" id="update-form" enctype="multipart/form-data">
		<!-- 제목, 내용, 카테고리, 제출버튼, 첨부파일 -->
		
		<input type="hidden" value="<%=b.getBoardNo()%>" name="boardNo">
		
			<table align="center">
            <tr>
                <th width="150">카테고리</th>
                <td width="600">
                    <select name="category">
                        <% for(Category c : list){ %>
                            <option value="<%= c.getCategoryNo()%>"><%= c.getCategoryName()%></option>
                        <%}%>

                    </select>
                    <script>
                        $(function(){
                            $('#update-form option').each(function(){
                                if($(this).text()=='<%=b.getCategory()%>'){
                                    $(this).attr('selected', 'true');
                                }
                            })
                        })
                    </script>

                </td>
            </tr>
            <tr>
                <th>제목</th>
                <td><input type="text" name="title" required value="<%=b.getBoardTitle()%>"></td>
            </tr>
            <tr>
                <th>내용</th>
                <td>
                    <textarea name="content" style="resize: none;" rows="10" required><%=b.getBoardContent() %></textarea>
                </td>
            </tr>
            <tr>
                <th>첨부파일</th>
                <!-- 기존파일이 존재했다면 원본파일명을 보여주자 aaa.jpg -->
                <td><input type="file" name="reUpfile">
                <% if(at != null){ %>
                    <%=at.getOriginName()%>
                <input type="hidden" name="originFileNo" value=<%=at.getFileNo()%>>
                <input type="hidden" name="originFileName" value=<%=at.getChangeName()%>>
                <%} %>						
                </td>
            </tr>
        </table>

        <br>
        <div align="center">
            <button type="submit">수정</button>
            <button type="reset">취소</button>
        </div>
				
    </form>
	</div>
	
</body>
</html>

1) 카테고리를 사용자가 이전에 지정했던 값을 기본값으로 놓기 

=> jQuery이용하기

* each메소드, attr(), 속성상태변경

$(function(){
    $('#update-form option').each(function(){
        if($(this).text()=='<%=b.getCategory()%>'){
            $(this).attr('selected', 'true');
        }
    })
})

2) 기존파일이 존재했다면 파일명 보여주기 

<% if(at != null){ %>
    <%=at.getOriginName()%>
<input type="hidden" name="originFileNo" value=<%=at.getFileNo()%>>
<input type="hidden" name="originFileName" value=<%=at.getChangeName()%>>
<%} %>

- 새로 만든 파일 : name == reUpFile

- 기존 파일 : originFileNo과 originFileName

originFileNo과 originFileName을 hidden으로 가져가기(but, 파일이존재할 때만 ! 왜냐면 없는데 가져가면 NullPointException발생할 수 있음

 

1) POST => 인코딩

request.setCharacterEncoding("UTF-8");

2-1) 값뽑기 전에 => 파일이 전송될 것인가를 먼저 파악

if(ServletFileUpload.isMultipartContent(request)) {

=> multipart/form-data로 잘 전달되었을 때만 내용을 수행되게 끔 조건

 

파일업로드 => 2가지 설정

① 전송파일 용량 제한 int maxSize => 10Mbyte

int maxSize = 1024*1024*10;

② 전달된 파일을 저장시킬 폴더의 물리적인 경로를 알아내기(String savePath)

String savePath = request.getSession().getServletContext().getRealPath("/resources/board_upfiles");

저장된 파일명 수정 후 서버에 업로드
Multipart 객체를 생성함으로써 서버에 파일이 업로드 
request로 값을 뽑을 수 없기 때문에 multipartRequest로 이관 함 (내가 지정한 이름값과 인코딩방식으로 이름변경 후 )

***이부분 다시 한 번보기 

MultipartRequest multiRequest = new MultipartRequest(request, savePath, maxSize, "UTF-8", new MyFileRenamePolicy());

- UPDATE BOARD : 공통적으로 수행해야하는 SQL

2-2) 값뽑기 request => multiRequest

int boardNo = Integer.parseInt(multiRequest.getParameter("boardNo"));
String category = multiRequest.getParameter("category");
String title = multiRequest.getParameter("title");
String content = multiRequest.getParameter("content");

3-1) VO = BOARD관련

Board b = new Board();
b.setBoardNo(boardNo);
b.setBoardTitle(title);
b.setBoardContent(content);
b.setCategory(category);

3-2) VO = Attachment

Attachment at = null;

실제 첨부파일이 있을 경우에만 => 객체생성

없으면 => null

 

- 새로운 첨부파일 명을 반환해주는 메소드(getter)를 이용해서 첨부파일이 있는 지 확인

if(multiRequest.getOriginalFileName("reUpfile") != null) {

if문 내에 들어오면 기존 파일이 존재한다는 의미, 기존파일이 가지고 있던 파일 번호를 attachment객체에 담을 것

at.setFileNo(Integer.parseInt(multiRequest.getParameter("originFileNo")));

- 새로운 파일에 대한 정보 담기 

at = new Attachment();
at.setOriginName(multiRequest.getOriginalFileName("reUpfile"));
at.setChangeName(multiRequest.getFilesystemName("reUpfile"));
at.setFilePath("resources/board_upfiles");

- case 1) 첨부파일이 있을 경우 + 원본파일도 있을 경우 DELETE

if(multiRequest.getParameter("originFileNo")!=null) {

= 중첩 if문

> step 1 : 기존파일이 가지고 있던 파일 번호를 attachment객체에 담을 것

at.setFileNo(Integer.parseInt(multiRequest.getParameter("originFileNo")));

> step 2 : 기존에 서버에 존재하던 첨부파일을 삭제 = new File(savePath + 기존의 파일이름).delete();

new File(savePath + multiRequest.getParameter("originFileName")).delete();

case 2) 새로운 첨부파일은 있었지만 기존 파일이 없을 경우 => INSERT

+ 어떤 게시글의 첨부파일인지 boardNo (REF_BNO) 필요

at.setRefBno(boardNo);

 

4) 서비스요청

: 경우에 따라 모두 한 개의 트랜잭션으로 묶어야 함

어떤 case가 존재할 지 Service단 가기 전에 생각하면 좋음

  
 case 1) 새로운 첨부파일 X => b, null => BOARDUPDATE
 case 2) 새로운 첨부파일 O, 기존첨부파일 O => BOARD UPDATE, ATTACHMENT UPDATE
 case 3) 새로운 첨부파일 O, 기존첨부파일 X => BOARD UPDATE, ATTACHMENT INSERT

int result = new BoardService().updateBoard(b, at);

5) 결과에 따른 응답뷰 지정

- 성공 => 상세보기 페이지 이동

if(result > 0) {
	request.getSession().setAttribute("alert", "게시글이 성공적으로 수정되었습니다.");
    	response.sendRedirect(request.getContextPath() + "/detail.bo?bno=" + boardNo);

- 실패 => 에러페이지

}else {
    request.setAttribute("alertMsg", "게시글 수정 실패");
    request.getRequestDispatcher("views/common/errorPage.jsp").forward(request, response);
}

<com.kh.board.model.service>BoardService

- result1 = 첨부파일이 없을 때 (case1) 

- result2= 기존첨부파일이 있을 때(case2) / 없을 때 (case3)

public int updateBoard(Board b, Attachment at) {

    Connection conn = getConnection();

    int result1 = new BoardDao().updateBoard(b, conn);


    //ATTACHMENT TABLE과 관련된 작업
    int result2 = 1; //없을수도 있기 때문

    if(at != null) {

        if(at.getFileNo() != 0) {
        //기존 첨부파일 있었을 경우 : REF_BNO가 기본값이 1부터 이기 때문에 0(int초기값)이 아니면 기존 파일이 있다는 뜻
        result2 = new BoardDao().updateAttachment(at, conn);
        } else {
        //기존 첨부파일 없었을 경우
        result2 = new BoardDao().insertNewAttachment(conn, at);
        }//아닐경우 ATTACHMENT에 할 게 없으므로 else 구문 사용 X

    }

    if((result1*result2) > 0) {
        commit(conn);
    }else {
        rollback(conn);
    }

    close(conn);

    return (result1*result2);
}

<com.kh.board.model.Dao>BoardDao

- updateBoard

public int updateBoard(Board b, Connection conn) {

    int result = 0;
    PreparedStatement pstmt = null;

    String sql = prop.getProperty("updateBoard");

    try {
        pstmt = conn.prepareStatement(sql);

        pstmt.setInt(1,Integer.parseInt(b.getCategory()));
        pstmt.setString(2, b.getBoardTitle());
        pstmt.setString(3, b.getBoardContent());
        pstmt.setInt(4, b.getBoardNo());

        result = pstmt.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        close(pstmt);
    }
    return result;
}

- updateAttachment

public int updateAttachment(Attachment at, Connection conn) {


    int result = 0;
    PreparedStatement pstmt = null;

    String sql = prop.getProperty("updateAttachment");

    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, at.getOriginName());
        pstmt.setString(2, at.getChangeName());
        pstmt.setString(3, at.getFilePath());
        pstmt.setInt(4, at.getFileNo());

        result = pstmt.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        close(pstmt);
    }

    return result;
}

- insertNewAttachment

public int insertNewAttachment(Connection conn, Attachment at) {


    int result = 0;
    PreparedStatement pstmt = null;

    String sql = prop.getProperty("insertNewAttachment");

    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, at.getRefBno());
        pstmt.setString(2, at.getOriginName());
        pstmt.setString(3, at.getChangeName());
        pstmt.setString(4, at.getFilePath());

        result = pstmt.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        close(pstmt);
    }

    return result;
}

<쿼리문>

- updateBoard

<entry key="updateBoard">
UPDATE 
      BOARD
SET 
    CATEGORY_NO = ?,
    BOARD_TITLE = ?,
    BOARD_CONTENT = ?
WHERE 
    BOARD_NO = ?
</entry>

- updateAttachment

<entry key="updateAttachment">
UPDATE 
ATTACHMENT
SET 
    ORIGIN_NAME = ?,
    CHANGE_NAME = ?,
    FILE_PATH = ?,
    UPLOAD_DATE = SYSDATE
WHERE 
    FILE_NO = ?
</entry>

- insertNewAttachment

<entry key="insertNewAttachment">
INSERT 
INTO
    ATTACHMENT
     (
       FILE_NO,
       REF_BNO,
       ORIGIN_NAME,
       CHANGE_NAME,
       FILE_PATH
    )
VALUES
    (
    SEQ_FNO.NEXTVAL,
    ?,
    ?,
    ?,
    ?
    )
</entry>