2차 프로젝트(10) - 프로시저(Procedure)를 이용한 댓글 기능 구현(VO,DAO,Controller)

이애옹·2022년 10월 10일
0

2차 프로젝트

목록 보기
10/12

💬 프로시저를 이용한 댓글 기능 구현 두번째 !!!

📝 BoardReplyVO 생성하기

@Getter
@Setter
public class BoardReplyVO {
     private int no,cno,type;
     private String id,name,msg,dbday;
     private Date regdate;
}

이렇게 작성해줬다

📝 BoardReplyDAO 생성하기

@Repository
public class BoardReplyDAO {
	private Connection conn;
	//프로시저 사용을 위한 인터페이스
	//속도, 코드의 독립성, 보안성 향상
	private CallableStatement cs;
	private final String URL="jdbc:oracle:thin:@211.63.89.131:1521:XE";
	
	public BoardReplyDAO()
	{
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	public void getConnection()
	{
		try {
			conn=DriverManager.getConnection(URL,"hr","happy");
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	public void disConnection()
	{
		try {
			if(cs!=null) cs.close();
			if(conn!=null) conn.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	// 댓글 읽기
	public List<BoardReplyVO> BoardreplyListData(BoardReplyVO vo)
	{
		List<BoardReplyVO> list=new ArrayList<BoardReplyVO>();
		try {
			getConnection();
			String sql="{CALL replyListData_3(?,?)}";
			cs=conn.prepareCall(sql);
			cs.setInt(1, vo.getCno());
			// 1. Int형으로 값을 받아 왔다 => 여기서 OracleTypes.INTEGER
			// 1. String형으로 값을 받아 왔다 => 여기서 OracleTypes.VARCHAR
			cs.registerOutParameter(2, OracleTypes.CURSOR);
			cs.executeQuery();
			//값 넘어오는지 확인
			System.out.println("*Cno : "+cs.getString(2));
			ResultSet rs=(ResultSet)cs.getObject(2);
			//Cursor ==ResultSet
			while(rs.next())
			{
				BoardReplyVO rvo=new BoardReplyVO();
				rvo.setNo(rs.getInt(1));
				rvo.setCno(rs.getInt(2));
				rvo.setId(rs.getString(3));
				rvo.setName(rs.getString(4));
				rvo.setMsg(rs.getString(5));
				rvo.setDbday(rs.getString(6));
				list.add(rvo);
				
			}
			rs.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		finally {
			disConnection();
		}
		return list;
	}
	// 댓글 쓰기
	public void BoardreplyInsert(BoardReplyVO vo)
	{
		try {
			getConnection();
			String sql="{CALL replyInsert_3(?,?,?,?)}";
			cs=conn.prepareCall(sql); //프로시저 함수 호출
			cs.setInt(1, vo.getCno());
			cs.setString(2, vo.getId());
			cs.setString(3, vo.getName());
			cs.setString(4, vo.getMsg());
			cs.executeQuery();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		finally {
			disConnection();
		}
	}
	// 댓글 수정
	public void BoardreplyUpdate(BoardReplyVO vo)
	{
		try {
			getConnection();
			String sql="{CALL replyUpdate_3(?,?)}";
			cs=conn.prepareCall(sql);
			cs.setInt(1, vo.getNo());
			cs.setString(2, vo.getMsg());
			cs.executeQuery();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		finally {
			disConnection();
		}
	}
	
	// 댓글 삭제 
	public void BoardreplyDelete(int no)
	{
		try {
			getConnection();
			String sql="{CALL replyDelete_3(?)}";
			cs=conn.prepareCall(sql);
			cs.setInt(1, no);
			cs.executeQuery();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		finally {
			disConnection();
		}
	}
}

private CallableStatement cs; => 프로시저 사용을 위해 필수 호출

DAO는 프로시저 코드와 맞춰서 호출해줘야한다~~

📝 BoardReplyController 생성하기

@RestController
public class BoardReplyController {
	@Autowired
	private BoardReplyDAO dao;
	
	
	// 뷰에서 v-if를 통해서 처리하는데 ${sessionScope 이게 불가능 그래서 아이디 변수가 하나 필요함 => 아이디를 뷰에 넘겨주기 위해 
	// 수정 & 삭제 시 id를 확인하기 위함
	public String board_reply_data(List<BoardReplyVO> list,String id)
	{
		/* private int no,cno;
		  private String id,name,msg,dbday;
		  private Date regdate;
		  */
		JSONArray arr=new JSONArray();
		int k=0;
		for(BoardReplyVO rvo:list)
		{
			//값 여러개 => object
			JSONObject obj=new  JSONObject();
			obj.put("no", rvo.getNo());
			obj.put("cno", rvo.getCno());
			obj.put("id", rvo.getId());
			obj.put("name", rvo.getName());
			obj.put("msg", rvo.getMsg());
			obj.put("dbday", rvo.getDbday());
			if(k==0)
			{
				obj.put("sessionId", id);
			}
			k++;
			arr.add(obj);
			
		}
		return arr.toJSONString();
	}
	
	@GetMapping(value = "board/board_reply_list.do",produces = "text/plain;charset=utf-8")
	public String board_reply_list(int cno,HttpSession session)
	{
		//아이디 세션에서 받아오기
		String id=(String)session.getAttribute("id");
		String result="";
		BoardReplyVO vo=new BoardReplyVO();
		vo.setCno(cno);
		List<BoardReplyVO> list=dao.BoardreplyListData(vo);
		
		result=board_reply_data(list,id);
		
		return result; //넘겨주는 result 데이터가 JSON이여야 하는 것 기억해라
	}
	
	@GetMapping(value = "board/board_reply_insert.do", produces = "text/plain;charset=utf-8")
	public String reply_insert(BoardReplyVO vo,HttpSession session)
	{
		String id=(String)session.getAttribute("id");
		String name=(String)session.getAttribute("name");
		vo.setId(id);
		vo.setName(name);
		dao.BoardreplyInsert(vo);
		List<BoardReplyVO> list=dao.BoardreplyListData(vo);
		String result=board_reply_data(list,id);
		
		return result;
		
	}
	
	@GetMapping(value = "board/board_reply_delete.do", produces = "text/plain;charset=UTF-8")
	public String reply_delete(BoardReplyVO vo,HttpSession session)
	{
		String result="";
		String id=(String)session.getAttribute("id");
		
		//여기서부터 삭제
		dao.BoardreplyDelete(vo.getNo());
		//삭제 후 목록을 리턴
		List<BoardReplyVO> list=dao.BoardreplyListData(vo);
		result=board_reply_data(list,id);
		return result;
	}
	
	
	 @PostMapping(value="board/board_reply_update.do",produces = "text/html;charset=utf-8")
	   public String reply_update(BoardReplyVO vo)
	   {
		   String result="<script>location.href=\"../board/detail.do?no="+vo.getCno()+"\";</script>";
		   dao.BoardreplyUpdate(vo);
		   return result;
	   }
	
}

vue를 이용해서 댓글 기능을 구현할것이기 때문에 Sessionid 값을 한번 더 받아와야한다!!
(수정/삭제 시 ID와 비교하여 삭제)

profile
안녕하세요

0개의 댓글