본문 바로가기
개발/일지

20.05.02.(토) NearBuy 댓글, 대댓글

by EPdev 2020. 5. 2.
728x90

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

대댓글을 저장할 때 sequence 값을 매번 +1 해줘야할 일이 있었다.

문제는 같은 부모를 가진 대댓글 중에서 seq 최대값을 구하고 이 값에 +1을 해준 결과값을 insert 해야하는 상황이다.

 

그래서 insert 문 안에 seq의 최대값을 구하기 위한 select 문을 넣어주었다.

게시글번호와 부모댓글을 이용해 해당 대댓글을 추려내고, 이 대댓글 중 MAX(sequence)를 구해낸 다음 +1 을 붙여줬다.

쿼리문은 아래와 같다.

INSERT INTO comments(phonenum, postnum, comment, parent, sequence) VALUES
  (:phoneNum, :postNum, :comment, :parent,
  (SELECT max(sequence)+1 FROM comments c WHERE postnum = :postNum AND parent = :parent))

 

한가지 문제점이 있었는데

"Table 'comments' is specified twice, both as a target for 'INSERT' and as a separate source for data" 이런 오류가 발생했다.

뜻은 "쿼리 안에 comments 라는 테이블이 두번 들어갔다. 하나는 INSERT용, 하나는 데이터 분리용"이라는 말이다.

어떻게 해결해야하는지 찾아보니, 테이블에 별명을 붙여주면 된다는 게 답이었다.

그래서 위의 쿼리문을 보면 SELECT문에 comments는 뒤에 c가 붙은걸 알 수 있다. 

이걸 검색하면서 본건데 다른 사람들은 comments 뒤에 ALIAS_FOR_SUBQUERY 이런식으로 별명을 붙이는 것도 보았다.

어차피 목적은 테이블 명이 겹치지 않게 하는 것이니 크게 의미는 없다고 본다.

 

반전이 좀 있다...

위의 쿼리대로 작업을 했었는데, 문제가 다시 발생했다.

댓글을 남기는 경우는 세 가지 인데 1. 댓글, 2. 댓글의 답글(대댓글), 3. 답글의 답글(대대댓글) 이다.

근데 위의 쿼리대로 하면 내 코드 상에서 2번을 남길 수 없는 오류가 있었다. 내 코드는 댓글을 남길 때

얘가 부모댓글이 있는지 없는지를 확인하고 그 경우에 따라서 그냥 댓글인지 대댓글인지를 나눠준다.

근데 2번의 경우는 부모댓글이 없지만 대댓글인 상황이므로 문제가 발생했다.

 

결국 해결을 부모댓글 유무에 더해서 seq가 1을 넘는지 아닌지를 추가했다.(뭔가 복잡해졌다...)

어찌됐거나 해결은 되었으나,, 굳이 이렇게 어렵게 해야하나.. 싶다. seq 값도 결국 프론트(안드로이드)에 넘겨주고

댓글을 남길 때 다시 서버에도 보내주는 방법으로 하고 있다.

그러다보니 굳이 select 문으로 또 seq를 찾아줄 필요 없이 그냥 프론트에서 통신받은 seq에 +1을 해주면 된다.

그래서 나오는 쿼리문은 아래.

INSERT INTO comments(phonenum, postnum, comment, parent, sequence) VALUES
      (:phoneNum, :postNum, :comment, :parent, :seq)

(위의 seq는 이미 +1이 된 상황이다.)

 

또 하나의 문제... 리사이클러뷰 뷰홀더의 꼬임

지금 방법은 리사이클러뷰 아이템이 댓글인지 대댓글인지를 seq 값으로 확인하고 1보다 크면

대댓글이므로 왼쪽에 공백을 더 주어 눈으로 대댓글임을 알 수 있게 만들어 놨다.

근데 문제는 댓글/대댓글을 남기면서 리사이클러뷰를 갱신해줄 때

기존 댓글들도 대댓글처럼 공백이 생기는 경우가 있다.

검색을 좀 해보니 리사이클러뷰 특성상 뷰홀더를 재사용하다보니 그 셋팅이 꼬이는 것이라고 한다.

다른 사람들도 좀 겪는 문제인데.. 해결방법이 다르다.

이건 좀 더 고민해봐야겠다. 전에도 비슷한 문제가 있었던 걸로 기억하는데..

현재는 뷰홀더 하나로 사용하면서 공백이 필요하면 뜯어다가 공백주고 다시 붙이는데

이를 아예 뷰홀더 두개로 만들면 좀 나아지려나 모르겠다...

여튼 리사이클러뷰 뷰홀더의 꼬임이 있는 상태..

728x90

댓글