Springboot [mybatis (테이블 LEFT JOIN)]
현재 마이페이지를 만들고 있는데 마이페이지에 보여질 항목은
1. 나의 찜목록
2. 판매중인 차량 (자신이 올린 글의 조회수, 댓글수)
위와 같이 크게 나누어 보았다.
판매중인 차량의 상태를 직관적으로 빠르게 파악하기 위하여 조회수 및 댓글 수를 보여주도록 하였다.
자신이 올린 글의 조회수는 Car테이블의 readCount 컬럼이 있기때문에 이를 이용하여 쉽게 보여줄 수 있지만
글의 comment수는 Car테이블 자체로만 보면 보여줄 수 없기때문에 방법을 생각하다가
글 관련 정보인 Car 테이블과 댓글관련 테이블인 Comment 테이블을 join을 하여 보여주도록 하였다.
두개의 테이블을 그룹화하여 COUNT를 하면 글에 해당하는 댓글 수를 불러 올 수있다.
LEFT JOIN을 사용하여야 하는데 LEST JOIN이란 왼쪽 테이블에서 모든 값을 오른쪽 테이블에서
왼쪽테이블과 일치되는 값만 반환해준다.
INNER JOIN은 두 테이블에 공통으로 존재하는 값만 반환하는 것에서 둘의 차이가 있다.
Select a.carId, a.mid, a.subCarName, a.readCount, COUNT(b.carId) as commentCount, a.thumb, a.isDel
FROM Car a
Left join Comment b
ON a.carId = b.carId
Where a.mid =1 GROUP BY a.carId
Select절에서는 보여줄 필요한 데이터들을 컬럼들로 적고
FROM절에는 a(car테이블),b(comment테이블)을 LEFT join을 시키고,
기본키의 값을 a테이블의 carId, b테이블의 carId로 설정한다.
WHERE절세어 a테이블의 mid가 1인 조건을 달고 a.carId로 그룹화를 시킨다.
쿼리의 결과는 아래와 같이 나오는데
commentCount컬럼이 댓글의 수이다.
차례대로 1번(carId)글에는 3개, 7번 0개, 8번 0개, 11번 0개의 댓글이 확인 되었다.
이를 mapper에 적용시키면 쿼리는 다음과 같다.
mid는 front단에서 받아와서 파라미터로 사용할 예정이다.
mypage이기때문에 해당 mid의 회원에 관한 게시글을 불러와야 하기 때문이다.
다음으로 CarDTO객체를 결과타입으로 받을 것이기때문에 commentCount변수를 CarDTO에 추가해주어야 한다.
그후 Controller, Service, DAO에 메서드 추가를 한 모습이다.
위의 메서드를 모두 만들고 POSTMAN으로 API요청을 해보았다.
PathVariable인 mid는 1로 지정하고 요청을 보냈다.
결과로는 앞서 dbeaver에서 나온 데이터 결과와 같으면 성공이다.
위와 같이 정상적으로 carId가 1, mid가1, commentCount가 3인 data를 불러오는데에 성공하였다.
그외에 carId가 7, 8, 11인 게시글의 데이터도 정상적로 받아왔다!
이것으로 vue.js에서 데이터를 불러와서 게시글의 댓글수 까지 화면에 보여주는데까지 성공하였다.