💬 프로시저를 이용한 댓글 기능 구현 두번째 !!!
@Getter
@Setter
public class BoardReplyVO {
private int no,cno,type;
private String id,name,msg,dbday;
private Date regdate;
}
이렇게 작성해줬다
@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는 프로시저 코드와 맞춰서 호출해줘야한다~~
@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와 비교하여 삭제)