Repository에 네이티브 쿼리를 이용해 구독정보를 만든다.
dto에는 구독수, 구독상태를 만들어 준다.
UserService에선 SubscribeRepository를 주입받는다.
기능 구현은 js에 ajax형태로 함수를 만들고 jsp에서 id하고 obj를 넘겨서 만든다.
dto 만들어 주고 UserApiController에 구독정보를 가지고 올 준비를 하고 SubscribeService도 만들어 놓는다.
MariaDB는 int를 Integer로 받아야 오류가 없음
** 어려움 주의
유저정보 + 구독했는지 여부 + 동일인인지 판단
스칼라 서브쿼리 : 셀렉트절에 셀렉트 하나 더 나오는것
-- 조인(user.id = subscirbe.toUserId)
SELECT u.id, u.username, u.profileImageUrl
FROM user u
INNER JOIN subscribe s
ON u.id = s.toUserId
WHERE s.fromUserId = 2;
-- 로그인(1), 화면(1,3)
SELECT true FROM subscribe WHERE fromUserId = 1 AND toUserId = 1;
SELECT true FROM subscribe WHERE fromUserId = 1 AND toUserId = 3;
-- 가상 칼럼을 추가
SELECT u.id, u.username, u.profileImageUrl, 1 subscribeState
FROM user u INNER JOIN subscribe s
ON u.id = s.toUserId
WHERE s.fromUserId = 2;
-- 스칼라 서브 쿼리
SELECT u.id, u.username, u.profileImageUrl,
(SELECT COUNT(*) FROM user) subscribeState
FROM user u
INNER JOIN subscribe s
ON u.id = s.toUserId
WHERE s.fromUserId = 2;
-- 구독여부 완성 쿼리
SELECT u.id, u.username, u.profileImageUrl,
(SELECT true FROM subscribe WHERE fromUserId = 1 AND toUserId = u.id) subscribeState
FROM user u
INNER JOIN subscribe s
ON u.id = s.toUserId
WHERE s.fromUserId = 2;
-- 동일 유저인지 판단 추가
SELECT u.id, u.username, u.profileImageUrl,
(SELECT true FROM subscribe WHERE fromUserId = 1 AND toUserId = u.id) subscribeState,
(1 = u.id) equalsUserState
FROM user u
INNER JOIN subscribe s
ON u.id = s.toUserId
WHERE s.fromUserId = 2;
쿼리 실력을 늘리기 위해선 하나하나씩 생각해 가며 순서대로 만들어 봐야함. 실무에서는 수천 줄 쿼리가 만들어 질 수도 있음
SubscribeRepository에서는 Subscribe타입이 아니기 때문에 만들어 놓은 쿼리를 사용할 수 없다. 그러므로 SubscribeService에서 직접 네이티브 쿼리로 짠다.
qlrm : 데이터베이스에 result된 결과를 자바클래스에 매핑해 주는 라이브러리
리턴받을 결과가 모델의 결과가 아닌 새로운 조합의 dto면 jpaRepository 못씀. qlrm을 써야함