본문 바로가기
프로젝트/자바 빈과 JSP만을 사용한 게시판 만들기

19장 댓글 처리

by IT여행자 2020. 5. 10.
728x90

이제 마지막으로 댓글 처리를 해 보도록 하겠습니다. 전체적인 프로그램의 흐름이나 처리 내용은 게시판 입력과 거의 동일합니다. 단지, 다른점이 하나 있다면 댓글이 저장될 때 자신의 원본글의 serial 번호를 pSerial 컬럼에 저장해야 한다는 것입니다. 그렇게 저장되어야 계층형 쿼리를 사용하여 목록을 나열할 때 이상이 없이 나열 됩니다.

 

이점을 염두해 두고 프로세스를 이해해 주시기 바랍니다.

 

댓글 처리 프로세스

1. 사용자가 상세보기(view.jsp) 페이지에서 댓글 달기 버튼을 클릭합니다.

 

2. 자바스크립트(board.js)에 의해서 댓글폼 화면이 실행됩니다.

 

// 댓글 버튼 클릭시
if($id('btnRepl') != null){
	let btn = $id('btnRepl');
	btn.onclick = function(){
		let frm = $id('frmInput');
		frm.action = url + 'repl.jsp'; 
		frm.submit();
	}
}

 

3. 댓글 달기(repl.jsp)에서 댓글 저장 버튼을 클릭합니다.

...
<div id='btnZone'>
	<input type='button' value='저장' id='btnReplR' />
    ...
</div>
...

4. 댓글 저장 버튼이 클릭되면 file_upload.js 스크립트에서 파일을 업로드할 정보와 저장할 내용을 가지고 result.jsp 페이지를 호출합니다. 이부분은 입력, 수정, 삭제 부분과 동일합니다. 단지, 다른점은 파라미터 job=replR이 전달되는 것입니다.

 

<script>
	upload.start('frmInput' , 'btnAttach', 'btnReplR', 'attachList', 
				'./board/result.jsp?job=replR')
</script>

 

5. result.jsp 에서 생성된 BoardController는 job=replR을 전달받기 때문에 이해 해당하는 BoardDao의 repl() 메서드를 호출하여 댓글 저장 작업을 하게 됩니다.

 

public class BoardController {
	...
	public BoardController(HttpServletRequest req, HttpServletResponse resp) {
		this.req = req;
		this.resp = resp;
		dao = new BoardDao();
		
		String job = "";
		//요청 정보에 따른 url 얻어오기
		job = req.getParameter("job");
		if(job != null) {
			switch(job) {
			...
			case "replR"     : replR();break;
			}
		}
	}
    
   	public void replR() {
		String msg = dao.repl(req);
		req.setAttribute("msg", msg);
	}
    ...
}

 

6. BoardDao의 repl()메서드에서는 댓글을 테이블에 저장하고, 첨부파일과 첨부파일 정보를 첨부파일 테이블에 저장한 후 그 결과를 다시 result.jsp에 전달하는 것으로 댓글의 처리 과정이 종료됩니다.

 

public class BoardDao {
	...
	public String repl(HttpServletRequest req) {
		String msg = "댓글이 작성되었습니다.";
		BoardVo vo = null;
		List<AttVo> list = null;
		int cnt = 0;
		
		try {
			
			FileUpload upload = new FileUpload(req);
			upload.uploading();
			vo = (BoardVo) req.getAttribute("vo");
			list = (List<AttVo>)req.getAttribute("attList");
			
			conn.setAutoCommit(false);
			
			
			sql = " insert into board(serial, mdate, pserial, worker, pwd, subject, content, hit) "
				+ " values(seq_board.nextval, sysdate, ?, ?, ?, ?, ?, 0 ) ";
			ps = conn.prepareStatement(sql);
			ps.setInt(1,  vo.getSerial());
			ps.setString(2,  vo.getWorker());
			ps.setString(3,  vo.getPwd());
			ps.setString(4,  vo.getSubject());
			ps.setString(5,  vo.getContent());
			cnt = ps.executeUpdate();
			
			if(cnt<1) throw new Exception("댓글 저장중 오류 발생");
			
			//첨부파일 정보 저장
			for(AttVo att : list) {
				sql = " insert into boardAtt(serial, pserial, oriAttFile, attFile) "
					+ " values(seq_boardAtt.nextval, seq_board.currval, ?, ?) ";
				ps = conn.prepareStatement(sql);
				ps.setString(1,  att.getOriAttFile());
				ps.setString(2,  att.getAttFile());
				
				cnt = ps.executeUpdate();
				if(cnt<1) throw new Exception("첨부파일 정보 저장중 오류 발생");
			}
					
			conn.commit();

			
		}catch(Exception ex) {
			ex.printStackTrace();
			msg =  ex.toString();
			
			if(list !=null && list.size()>0) {
				deleteFile(list);
			}
			
			conn.rollback();
		}finally {
			req.setAttribute("msg", msg);
			return msg;
		}
	}
	...
}    

이것으로 댓글 처리에 대한 포스팅을 마치도록 하겠습니다.

 

[관련 동영상-게시물 댓글 달기(묵음)]