Programming language/Javascript,jQuery

[JQuery+Ajax]좋아요 기능 구현 - (2)

  • -
반응형

어제 좋아요 기능 구현에 대해 포스팅을 했었다.

기능 구현까지는 되기는 했다. 하지만 문제가 있다고 말했었는데..


문제는 테이블의 INSERT였다.

좋아요 테이블을 만들어 사용을 했기 때문에 반드시 Row가 있어야 했다.

(기능이 정상적으로 작동한 것은 테스트용으로 몇 개의 Row를 임의로 입력해줬기 때문이다)

지금 생각해보면 당연한 일이었는데 그 때는 왜그랬을까..


어쨌든 Row를 추가시켜줘야했다.

그럼 어떤 상황에서 추가를 시켜주면 좋을까 생각을 했다.

회원가입 시? 아니면 게시글을 조회할 때? 좋아요를 눌렀을 때?

회원가입 시는 적절하지 못했다. 왜냐하면 좋아요 테이블에는 게시글의 번호를 가져오기 때문에..

여러 테스트 끝에 게시글 조회 시가 가장 적절하다고 판단했다.

게시글을 조회할 때 회원 번호와 해당 게시글 번호를 hashMap으로 읽어들여 데이터가 존재하는지 여부를 비교하면 되기 때문이었다.


게시글을 조회하게 되면 아래 Controller를 타게 된다.

(@ResponseBody는 뷰 페이지를 응답하지 않고 리턴값을 반환하겠다는 의미)

JSONObject를 생성 후 데이터를 집어 넣고 JSON코드로 변환하여 리턴하였다. 왜냐하면 리턴받은 데이터를 통해 다른 

작업들을 하기 위해서였다.

예를 들어, 회원의 이미지(xxx.jpg) 이름을 갖고 Storage폴더에서 찾아서 프론트단에 출력시키거나

좋아요 체크값을 갖고 jsp에서는 스크립트를 통해 이미지를 구분시켰다. 

체크값이 0이면 빈하트, 1이면 하트


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@ResponseBody
  @RequestMapping(value="/board/read.do", method=RequestMethod.GET, produces="text/plain;charset=UTF-8")
  public String read(@RequestParam(value="boardno"int boardno, HttpSession session){
    int mno = (Integer)session.getAttribute("mno");
    int reply_cnt = replytoProc.reply_cnt_up(boardno);
    
    JSONObject obj = new JSONObject();
    
    HashMap<String, Object> hashMap = new HashMap<String, Object>();
    hashMap.put("boardno", boardno);
    hashMap.put("mno", mno); 
    
    if(liketoProc.countbyLike(hashMap)==0) {
      liketoProc.create(hashMap);
    }
    
    LiketoVO liketoVO = liketoProc.read(hashMap);
    BoardVO boardVO = boardProc.read(boardno);
    MemberVO memberVO = memberProc.read(mno);
    
    obj.put("boardno", boardno);
    obj.put("categoryno", boardVO.getCategoryno());
    obj.put("mno", mno);
    obj.put("mimg", memberVO.getMimg());
    obj.put("mnick", memberVO.getMnick());
    obj.put("title", boardVO.getTitle());
    obj.put("content", boardVO.getContent());
    obj.put("rdate", boardVO.getRdate().substring(016));
    obj.put("like_check", liketoVO.getLike_check());    // 회원별 좋아요 체크값
    obj.put("like_cnt", boardVO.getLike_cnt());
    obj.put("reply_cnt", reply_cnt);
    obj.put("word", boardVO.getWord());
    
    return obj.toJSONString();    
  }
cs


+read 쿼리

1
2
3
4
5
6
  <select id="read" resultType="BoardVO" parameterType="int">
   SELECT boardno,
           categoryno, mno, title, content, thumb, file1, size1, cnt, rdate, grpno, like_cnt, word
   FROM board
   WHERE boardno=#{boardno}
  </select>
cs



아래 쿼리를 통해 넘어온 데이터가 0인지 아닌지로 판단하게 된다.


1
2
3
4
5
6
<select id="countbyLike" resultType="int" parameterType="HashMap">
   SELECT COUNT(likeno) as cnt
   FROM liketo
   WHERE boardno=#{boardno} AND mno=#{mno}
</select>
 
cs


만약 0이라면 아래 쿼리를 돌려 Row를 INSERT시켜준다.


1
2
3
4
5
6
<insert id="create" parameterType="HashMap">
   INSERT INTO liketo(likeno, boardno, mno, like_check) 
   VALUES ((SELECT NVL(MAX(likeno), 0) + 1 as likeno FROM liketo),
                #{boardno}, #{mno}, 0)
</insert>
 
cs


그럼 정상적으로 좋아요 기능을 사용할 수 있다.

이렇게 좋아요 기능을 구현했다.

당시에는 기능 구현을 목적으로 했기 때문에 상관없었지만 만약에 많은 사용자들이 게시글 조회를 하게 되면 좋아요 테이블은 데이터가 폭주하지 않을까 의문이 든다..

아직 한참 멀은 것 같다.


반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.