에러해결 Log) JAVA JSP Servlet 글 내용 수정할 때 첨부파일이 사라지는 문제2
사용환경
- MacBook Air (M1, 2020) 16GB
- JDK 8
- Eclipse 2021-12
- tomcat 8.5
에러의 발생
- 무슨 버그가 수정을 해도해도 계속 나오는지… 얼렁뚱땅 돌아가는 느낌이다 🥲
- 게시글을 수정할 때 첨부파일이 사라지는 버그를 해결했다고 생각했는데 완벽히 해결되지 않았다.
- 여전히 일부 케이스에서 제대로 처리가 되지 않아
DB
상에서의 파일명이null
로 바뀌는 문제가 존재했다. - 그래서 좀 더 근본적인 원인을 떠올려 보았다… 게시글을 수정하며 파일 업로드 단계를 거치는 과정에서
DTO
생성 시 파일명이 지정되지 않아null
로 남아있는 것이DB
수정 동작 때 넘어와서 문제라면DB
에 접근하는 메서드를 수정하는 것이 빠르지 않을까…
문제 해결
- 기존에 작성했던 게시글 수정 메서드
public int modifyPost(BoardDTO dto)
{
int ret = -1;
try {
con = getCon();
// 번호로 해당 글 찾기
sql = "select * from cafe_board where num=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, dto.getNum());
rs = pstmt.executeQuery();
if (rs.next())
{
// update 동작 수행
sql = "update cafe_board set title=?, image=?, image_uid=?, file=?, file_uid=? content=? where num=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, dto.getTitle());
pstmt.setString(2, dto.getContent());
pstmt.setString(3, dto.getImage());
pstmt.setString(4, dto.getImage_uid());
pstmt.setString(5, dto.getFile());
pstmt.setString(6, dto.getFile_uid());
pstmt.setInt(7, dto.getNum());
ret = pstmt.executeUpdate();
System.out.println("DAO : 글 수정 완료");
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
closeDB();
}
return ret;
}
- 매개변수로 받은
DTO
를 그대로 받아서 바로 업데이트 동작을 수행한다. -
이러니
DTO
의 파일명 필드가null
로 넘어와도 아무 필터링 없이DB
에null
이 저장되는 것이었다. - 수정한 메서드
public int modifyPost(BoardDTO dto)
{
int ret = -1;
try {
con = getCon();
// 번호로 해당 글 찾기
sql = "select * from cafe_board where num=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, dto.getNum());
rs = pstmt.executeQuery();
if (rs.next())
{
// update 동작 수행
// 새로 수정한 글에서 파일 정보가 있으면 그걸로 수정 / 없으면 그대로 놔둠
if (dto.getImage() != null && dto.getImage_uid() != null)
{
sql = "update cafe_board set image=?, image_uid=? where num=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, dto.getImage());
pstmt.setString(2, dto.getImage_uid());
pstmt.setInt(3, dto.getNum());
pstmt.executeUpdate();
}
if (dto.getFile() != null && dto.getFile_uid() != null)
{
sql = "update cafe_board set file=?, file_uid=? where num=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, dto.getFile());
pstmt.setString(2, dto.getFile_uid());
pstmt.setInt(3, dto.getNum());
pstmt.executeUpdate();
}
sql = "update cafe_board set title=?, content=? where num=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, dto.getTitle());
pstmt.setString(2, dto.getContent());
pstmt.setInt(3, dto.getNum());
ret = pstmt.executeUpdate();
System.out.println("DAO : 글 수정 완료");
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
closeDB();
}
return ret;
}
- 전달되어 온
DTO
에 파일명 정보가 있을 때에만 업데이트가 되도록 수정했다. - 이렇게 하니까 그동안 고민했던 문제들이 싹 해결되었다.
-
역시 근본적인 원인을 제거했어야…
- 이렇게 문제 해결~!! 👏