사용환경

  • 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로 넘어와도 아무 필터링 없이 DBnull이 저장되는 것이었다.

  • 수정한 메서드
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에 파일명 정보가 있을 때에만 업데이트가 되도록 수정했다.
  • 이렇게 하니까 그동안 고민했던 문제들이 싹 해결되었다.
  • 역시 근본적인 원인을 제거했어야…

  • 이렇게 문제 해결~!! 👏