본문 바로가기
개발/일지

20.05.06.(수) NearBuy 댓글, 대댓글

by EPdev 2020. 5. 6.
728x90

당근마켓을 모티브로 해서 안드로이드 앱 NearBuy 개발중.

무한댓글을 불러오는 sql 구문

SELECT *
FROM comments
ORDER BY IF(ISNULL(parent), num, parent), sequence

SELECT *   // 모두 뽑아와라

FROM comments  // comments 라는 테이블에서

ORDER BY IF(ISNULL(parent), num, parent), sequence

// 크게 두 가지 기준으로 정렬을 하는데 1. parent 컬럼이 null이면 num 순서로, null이 아니면 parent 순서로..  2. sequence 순서

또한 마지막 줄은 mysql 의 경우 아래처럼도 사용할 수도 있다.(ms-sql, oracle 은 다르다)

ORDER BY IFNULL(parent, num), sequence

위의 구문은 정렬을 위한 간략한 설명이었고,

나의 경우는 아래와 같이 사용하였다.

SELECT *, (SELECT image FROM userlist u WHERE u.phonenum = c.phonenum) image,
                            (SELECT nickname FROM userlist u WHERE u.phonenum = c.phonenum) nickname FROM comments c
                            WHERE postnum = :postnum ORDER BY IF(ISNULL(parent), num, parent), sequence

사용자의 이미지와 닉네임을 뽑아와야했었다.

join을 사용하는 방법도 있을 것이다. 나중에 테스트를 해봐야겠다.

:postnum 은 PDO를 사용하다보니 나오는 변수다.(참고)

** 추후에 페이지네이션도 추가해야한다.

 

리사이클러뷰 꼬임 해결

지난 주에 대댓글의 경우 Margin left를 java 단에서 주어서 댓글과 구분되게 끔 하려고 하던 중..

리사이클러뷰에서 자꾸 꼬임이 발생하는 문제가 있었다. 새로 댓글을 작성하면 갑자기 모두 대댓글처럼 보인다거나 하는 문제였다.

뷰홀더를 두개 만들어서 댓글과 대댓글에 따라 다른 xml을 붙여주는 방법도 있긴 하다만 (채팅처럼..)

댓글과 대댓글의 차이는 단순히 위치의 차이기 때문에 같은 xml을 변형해서 사용하고 싶었다.

 

리사이클러뷰에 대해 이런 저런 자료들을 많이 찾아본 결과..

뷰홀더에 if문을 걸어줄 때, 재활용이 되다보니까 데이터가 중첩돼서 이런 문제가 발생할 수 있다고 하는 자료를 봤다.

그래서 if문이 아닌 if else 문으로 정확히 값을 지정해주었다.

 

기존에 margin left를 주는 부분은 아래와 같다.

if ( item.getSequence() > 1){
     // 자바단에서 레이아웃을 수정하기 위한 작업
     ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) holder.userImg.getLayoutParams();
     layoutParams.leftMargin = 100;      // 100 pixel
     holder.userImg.setLayoutParams(layoutParams);    // 이미지뷰에 다시 파라미터값을 셋 해줌.
}

변경한 부분은 아래와 같다.

if ( item.getSequence() > 1){
    // 자바단에서 레이아웃을 수정하기 위한 작업
    // 대댓글의 경우에는 왼쪽 마진을 100픽셀 준다.
    
    ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) holder.userImg.getLayoutParams();
    layoutParams.leftMargin = 100;      // 100 pixel
    holder.userImg.setLayoutParams(layoutParams);    // 이미지뷰에 다시 파라미터값을 셋 해줌.
    
} else {
    // 뷰홀더에서 데이터 꼬임 문제가 나타나서 만들어준 부분
    // 댓글의 경우에는 왼쪽 마진을 없애준다.
    
    ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) holder.userImg.getLayoutParams();
    layoutParams.leftMargin = 0;      // 0 pixel
    holder.userImg.setLayoutParams(layoutParams);    // 이미지뷰에 다시 파라미터값을 셋 해줌.
}

크게 달라진 점은 없다. 뷰홀더가 재활용될 때 댓글일 때는 마진을 다시 0으로 확정해주는 것 뿐이다.

뷰홀더를 활용하는데 종종 발생하는 문제라고 하니 참고!

 

댓글 수정/삭제에 관한 고민...

다른 앱들을 살펴보니 댓글을 수정하는 부분이 대게 없었다. (삭제만 존재함)

스마트폰 플랫폼 특성 상 댓글을 엄청 길게 적을 일이 없다고 판단한 모양이다.

생각해보니 댓글 수정을 어떻게 구현할 것인가도 문제가 좀 있었다.

Alertdailog를 띄워야하나? 아님 activity를 새로 띄워야하나?

뭐 이런 것 때문에 수정기능을 지원하지 않고 그냥 삭제시키고 다시 작성하라는 듯 하다.

따라서, 나도 수정 기능은 넣지 않고 삭제만 가능하게 했다.

그리고 댓글도 완전히 삭제되는 것이 아니라 '삭제된 댓글입니다.' 라는 문구를 남기려고 한다.

다른 앱들을 조사해보니 계정정보/등록시간 등은 유지되고 댓글 내용만 삭제된 댓글이라고 안내가 된다.

이말은, sql문을 delete문을 쓰는게 아니라 사실상 update문을 쓰는 것이다.

또 한가지 고려사항은.. delete 컬럼을 넣어서 내용은 유지하고 보여줄 때만 삭제된 내용이라고 전시하는 부분도 있었다.

이는 서버측에서 데이터를 가지고 있겠다는 것인데.. 아직 그 필요성을 잘 모르겠다.

어차피 보여주지 않을 데이터라면 그냥 없애도 되지 않는가?? 여튼 이건 더 알아볼 필요가 있겠고

나는 내용 모두를 update해서 기존 내용이 유지되지 않게끔 했다.

 

댓글을 카운트 하는 모든 부분도 아래처럼 수정해주면서.. 댓글/대댓글 편을 마무리했다.

SELECT *,
    (SELECT COUNT(num) FROM comments c WHERE c.postnum = p.no) AS commentNum
    FROM post p WHERE no = :no

 

** 아 물론... 댓글 페이지네이션을 해야한다. 이미 게시글 페이지네이션에서 했던 거라 어렵진 않겠지?

728x90

댓글