Ajax์ ๋ฐฐ์ ๋ค๋ฉด ์ค์ ๋ก ์ด๋ป๊ฒ ์ฐ์ด๋์ง ์ดํดํ๋์ง ๊ถ๊ธํ์ ๊ฒ์
๋๋ค.
๋น์ ์ด ์ธ์คํ๊ทธ๋จ์์ ๋๊ตฐ๊ฐ์ ๊ฒ์๊ธ์ ํํธ๋ฅผ ๋๋ฅธ๋ค๋ฉด ๊ทธ ๊ฒ์๊ธ์๋ ๋์ ์์ด๋๋ก ์ข์์๊ฐ ํ๋๊ฐ ์ถ๊ฐ๋๊ณ , ๋ค์ ํํธ๋ฅผ ๋๋ฅด๋ฉด ๋์ ์์ด๋๊ฐ ์ข์์๋ฅผ ๋๋ฅธ ์ฌ๋ ๋ชฉ๋ก์์ ์ง์์ง๊ณ ์ข์์ ๊ฐ์๊ฐ ํ๋ ์ค์ด๋ค๊ฒ ๋ฉ๋๋ค.
์ข์์๋ฅผ ๋๋ฅธ๋ค๊ณ , ํ์ด์ง ์ ์ฒด๊ฐ ๋ค์๋ก๋๋์ง ์์ต๋๋ค. ์ผ๋ถ๋ง ๋ฐ๋๊ฒ ๋๋ Ajax์ ์๋ฆฌ๊ฐ ๋ฐ์๋ฌ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด๋ฒ๊ธ์์๋ ๊ฐ๋จํ๊ฒ ๊ตฌํ๋ฐฉ๋ฒ๊ณผ ์๋ฆฌ๋ฅผ ์ค๋ช
ํ ๊ฒ์ธ๋ฐ ๋ง์ฝ์ ์ง์ ํด๋ณด๊ณ ์ถ๋ค๋ฉด ์๋ ๋งํฌ๋ก ๋ค์ด๊ฐ์ ์ ์ฒด ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค!
๊ฒ์ํ ์ ์ฒด์ฝ๋ github
create table tb_like(
li_idx int auto_increment primary key,
li_userid varchar(20) not null,
li_boardidx int not null,
foreign key (li_boardidx) references tb_board(b_idx) on update cascade
);
3๊ฐ์ง ์ ๋ ๋ณ์๊ฐ ํ์ํฉ๋๋ค.
1. ์ข์์ ํ๋ํ๋์ ๋ํ ๊ธฐ์ค์ด ๋๋ li_idx
2. ์ข์์๋ฅผ ๋๋ฅธ ์ฌ๋ li_userid
3. ์ข์์๋ฅผ ๋๋ฅธ ๊ฒ์๋ฌผ li_boardidx
foreign key (li_boardidx) references tb_board(b_idx) on update cascade ์ด๋ถ๋ถ์ ์ค์ํฉ๋๋ค
๊ฒ์๊ธํ
์ด๋ธ(tb_board)์ ๊ฒ์๋ฌผ idx(b_idx)๋ฅผ li_boardidx์ foreign keykey๋ก ์ค์ ํด์ฃผ๊ณ , ON UPDATE CASCADE๋ฅผ ํตํด ์ฐธ์กฐํ๊ณ ์๋ ๋ค๋ฅธ ํ
์ด๋ธ์ ์ปฌ๋ผ๋ ๊ฐ์ด UPDATE ํ๊ฒ ๋ค๋ ์ ์ฝ ์กฐ๊ฑด์ ๊ฑธ์ด์ค๋๋ค.
์์ ์ด ๊ฐ๊ณ ์๋ ํ
์ด๋ธ์ ๋ง๊ฒ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
์ข์์ ๊ธฐ๋ฅ์ ํ์ํ ๋ถ๋ถ๋ง ์ ๊ณ ์๋ตํด ๋์์ต๋๋ค. ๋ง์ฝ ์ ์ฒด ์ฝ๋๊ฐ ํ์ํ๋ค๋ฉด, github๋ฅผ ๋ค์ด๋ฐ์ webcontent > board > view.jsp๋ฅผ ๋ณด์๋ฉด ๋ฉ๋๋ค!
<%
//... ์๋ต
//์๋จ์ ๋ณ์ 2๊ฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
//... ์๋ต
Boolean isLike=false; //๐1.๋ณ์์ถ๊ฐ ์ข์์ํ ๊ธ์ธ๊ฐ?
int b_like = 0; //๐2.boardํ
์ด๋ธ like๋ณ์์ถ๊ฐ
// mysql board ๋ด์ฉ ์ ์ฒด๋ฅผ ๋ถ๋ฌ์ต๋๋ค. ๋ถ๋ฌ์ฌ๋ ๋ด๊ฐ ์ข์ํ ๊ฒ์๋ฌผ์ธ์ง ํ์ธํด์ผํ๋๊น์!
try{
conn = Dbconn.getConnection();
// ... ์๋ต
if(conn != null){
sql = "select b_userid,b_name,b_title,b_hit,b_regdate,b_like,b_content from tb_board where b_idx=?;";
pstmt= conn.prepareStatement(sql);
pstmt.setString(1,b_idx);
rs= pstmt.executeQuery();
//๐3. ์ ์ฒด ๋ด์ฉ์ ๊ฐ์ ธ์ฌ ๋ ์ข์์ํ ๊ฒ์๊ธ์ธ์ง ํ์ธํ๊ธฐ
if(rs.next()){
sql="select li_idx from tb_like where li_boardidx=? and li_userid=?";
pstmt= conn.prepareStatement(sql);
pstmt.setString(1,b_idx);//์ด๊ธ์ ํน์ ์ข์์ ํ๋?(get์ผ๋ก ๋ฐ์๊ฐ)
pstmt.setString(2,userid);//์ง๊ธ ๋ก๊ทธ์ธํ์ฌ๋์ด?(์ธ์
๊ฐ)
ResultSet rs_like= pstmt.executeQuery();
if(rs_like.next()){
//๐3. select์ ๊ฒฐ๊ณผ ๊ฐ์ด ์๋ค๋ฉด ์ข์์ํ ๊ฒ์๊ธ์ด๋ค. => isLike=true;
isLike =true;
}
//์ข์์๋ ๊ด๊ณ์์ด ํ์ํ ๊ฒ์๊ธ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค
b_title = rs.getString("b_title");
b_userid = rs.getString("b_userid");
b_name = rs.getString("b_name");
b_regdate = rs.getString("b_regdate");
b_content = rs.getString("b_content");
b_hit = rs.getInt("b_hit");
b_like = rs.getInt("b_like");
}
}
}catch(Exception e){
e.printStackTrace();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>๊ธ๋ณด๊ธฐ</title>
<script>
//๐4. like() ํจ์: ํํธ ๋๋ฅผ๋ title on <-> title off ํ๋ฉด์ Ajax์ ์ด์ฉํด mysql DB์ like+1 or like-1ํด์ค๋๋ค.
function like(){
const isHeart = document.querySelector("img[title=on]");
if(isHeart){
document.getElementById('heart').setAttribute('src','./like_off.png');
document.getElementById('heart').setAttribute('title','off');
}else{
document.getElementById('heart').setAttribute('src','./like_on.png');
document.getElementById('heart').setAttribute('title','on');
}
//์ฌ์ง๊ฒฝ๋ก๋ ๋ณธ์ธ์๊ฒ ๋ง๊ฒ ์์ ์ด ํ์ํฉ๋๋ค.
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState == XMLHttpRequest.DONE && xhr.status ==200){
document.getElementById('like').innerHTML = xhr.responseText;
}
}
xhr.open('get','like_ok.jsp?b_idx=<%=b_idx%>',true);
xhr.send();
}
</script>
</head>
<body>
<h2>๊ธ๋ณด๊ธฐ</h2>
<table>
<tr><th>์ ๋ชฉ</th><td><%=b_title%></td></tr>
<tr><th>๋ ์ง</th><td><%=b_regdate%></td></tr>
<tr><th>์์ฑ์</th><td><%=b_userid%>(<%=b_name%>)</td></tr>
<tr><th>์กฐํ์</th><td><span id="hit"><%=b_hit %></span></td></tr>
<!-- ๐4.์ข์์ ํํธ ์ด๋ฏธ์ง ์ถ๊ฐํ๊ณ onclick๋์์ ๋ like() ํจ์ ํธ์ถ!-->
<tr>
<th>์ข์์</th><td> <%if(isLike){%><img id="heart" src="./like_on.png" alt="์ข์์" onclick="like()">
<%}else{%><img id="heart" src="./like_off.png" alt="์ข์์" onclick="like()"><%}%> <span id="like"><%=b_like %></span></td>
</tr>
<tr><th>๋ด์ฉ</th><td><%=b_content %></td></tr>
<!-- ๋ท๋ด์ฉ ์๋ต -->
์ด์ like_ok.jsp ํ์ผ์ ๋ง๋ค๊ณ Ajax์ ์ฒ๋ฆฌํด์ค ์ฝ๋๋ฅผ ์ง๋ณผ๊ฒ๋๋ค.
์ฝ๋๊ฐ ๊ธธ์ง ์์ ๋ชจ๋ ๊ฐ์ ธ์์ต๋๋ค!
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../include/sessioncheck.jsp"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "com.koreait.db.Dbconn" %>
<%
String b_idx= request.getParameter("b_idx");
String userid = (String)session.getAttribute("userid");
request.setCharacterEncoding("UTF-8");
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
conn = Dbconn.getConnection();
if(conn != null){
int b_like=0;
String sql = "select li_idx from tb_like where li_boardidx=? and li_userid=? ";
pstmt= conn.prepareStatement(sql);
pstmt.setString(1,b_idx);
pstmt.setString(2,userid);
rs= pstmt.executeQuery();
if(rs.next()){
sql="update tb_board set b_like = b_like-1 where b_idx=?";
pstmt= conn.prepareStatement(sql);
pstmt.setString(1,b_idx);
pstmt.executeUpdate();
sql="delete from tb_like where li_boardidx=? and li_userid =?;";
pstmt= conn.prepareStatement(sql);
pstmt.setString(1,b_idx);
pstmt.setString(2,userid);
pstmt.executeUpdate();
}else{
sql="update tb_board set b_like = b_like+1 where b_idx=?";
pstmt= conn.prepareStatement(sql);
pstmt.setString(1,b_idx);
pstmt.executeUpdate();
sql="insert into tb_like(li_userid, li_boardidx) values (?,?)";
pstmt= conn.prepareStatement(sql);
pstmt.setString(1,userid);
pstmt.setString(2,b_idx);
pstmt.executeUpdate();
}
sql="select b_like from tb_board where b_idx=?";
pstmt= conn.prepareStatement(sql);
pstmt.setString(1,b_idx);
rs= pstmt.executeQuery();
if(rs.next()){
b_like = rs.getInt("b_like");
out.println(b_like);
}
if(pstmt != null) conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
%>
Ajax์ ์จ๋ณด๋ฉด, ์๋ก๊ณ ์นจ์ด ๋์ง์๊ณ ๋ฐ๋ก ๊ทธ ๋ถ๋ถ๋ง ์์ ์ด ๋๊ธฐ๋๋ฌธ์ ์ฌ์ฉ์๋ก ํ์ฌ๊ธ ๋ถํธํ ๋๋์ ๋์ด์ฃผ๊ณ , ์ ์ฒด๋ฅผ ๋ก๋ํ ํ์๊ฐ ์์ผ๋ ์๋ฒ๊ฐ ์ฒ๋ฆฌํด์ผํ๋ ์์ ์ค์ฌ์ฃผ์ฃ ! ์์ฆ์ Ajax๋ณด๋ค๋ fetch์ promise๋ฅผ ๊ฒฐํฉํ ๊ฒ์ ๋ ๋ง์ด ์ด๋ค๊ณ ํ์ง๋ง, ๊ฐ๋จํ ์์ ์ ํ ๋๋ ๋์์ง ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๊ธฐํ๊ฐ ๋๋ค๋ฉด fetch์ promise๋ฅผ ์ด์ฉํด์ ์ผ๋ถ๋ง ๋ฐ๊พธ๋ ๊ฒ์ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค! ๊ฐ์ฌํฉ๋๋ค!