Search

56. 스프링부트 포토그램 구독정보 뷰 랜더링 QLRM 라이브러리로 DTO 매핑하기

구독 정보 뷰 랜더링

전에서 짰던 쿼리를 통해서 모달에 데이터를 뿌려줄거다.
if문을 추가해서 true면 1 아니면 0이 오도록 추가 수정해줬다
-- 동일 유저인지 판단 여부 SELECT u.id, u.username, u.profileImageUrl, if((SELECT 1 FROM Subscribe WHERE fromUserId = 1 AND toUserId = u.id),1,0) subscribeState, if((1=u.id),1,0) equalUserState FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2;
SQL
복사
SubscribeRepository에 이 쿼리를 넣을수는 없다
리턴되는 타입(u.id , u.username ..등등)이 Subscribe이 아니기 때문이다
그래서 SubscribeService에서 직접 네이티브 쿼리를 짤거다
private final EntityManager em; //Repository는 EntityManager를 구현해서 만들어져 있는 구현체 @Transactional(readOnly = true) public List<SubscribeDto> 구독리스트(int principalId, int pageUserId){ StringBuffer sb = new StringBuffer(); sb.append("SELECT u.id, u.username,u.profileImageUrl, "); sb.append("if((SELECT 1 FROM Subscribe WHERE fromUserId = 1 AND toUserId = u.id),1,0) subscribeState, "); sb.append("if((1=u.id),1,0) equalUserState "); sb.append("FROM User u INNER JOIN Subscribe s "); sb.append("ON u.id = s.toUserId "); sb.append("WHERE s.fromUserId = 2 "); //세미클론 첨부하면 안됨. return null; }
Java
복사
꼭 뒤에 한칸씩 띄어줘야한다. 안그러면은 다음줄 쿼리문하고 붙어서 실행되기 때문에 띄어쓰기하는 습관을 가져주자.
import javax.persistence.Query; @Transactional(readOnly = true) public List<SubscribeDto> 구독리스트(int principalId, int pageUserId){ //쿼리 준비 StringBuffer sb = new StringBuffer(); sb.append("SELECT u.id, u.username,u.profileImageUrl, "); sb.append("if((SELECT 1 FROM Subscribe WHERE fromUserId = ? AND toUserId = u.id),1,0) subscribeState, "); sb.append("if((?=u.id),1,0) equalUserState "); sb.append("FROM User u INNER JOIN Subscribe s "); sb.append("ON u.id = s.toUserId "); sb.append("WHERE s.fromUserId = ? "); //세미클론 첨부하면 안됨. //1. 물음표 principalId //2. 물음표 principalId //3. 마지막 물음표 페이지아이디 //쿼리 완성 Query query = em.createNativeQuery(sb.toString()) .setParameter(1, principalId) .setParameter(2, principalId) .setParameter(3, pageUserId); return null; }
Java
복사
쿼리 실행까지 추가해줄건데
단건으로 가져올때는 밑에 유니크리절트쓰면 되고 지금 우린 list로 가져올거기 때문에 상단껄로 쓰면 된다.
//쿼리 실행 JpaResultMapper result = new JpaResultMapper(); List<SubscribeDto> subscribeDtos = result.list(query, SubscribeDto.class); return subscribeDtos;
Java
복사
JpaResultMapper라는건 import 한걸 보면은
import org.qlrm.mapper.JpaResultMapper;
Java
복사
qlrm이라는건데 이건 스프링부트에서 제공하는 라이브러리가 아니라
pom.xml 에
<!-- qlrm --> <dependency> <groupId>org.qlrm</groupId> <artifactId>qlrm</artifactId> <version>2.1.1</version> </dependency>
Java
복사
등록해서 사용하고 있는거다.
qlrm은 데이터베이스에서 리절트된 결과를 자바클래스에 매핑해주는 라이브러리다.
@Transactional(readOnly = true) public List<SubscribeDto> 구독리스트(int principalId, int pageUserId){ //쿼리 준비 StringBuffer sb = new StringBuffer(); sb.append("SELECT u.id, u.username,u.profileImageUrl, "); sb.append("if((SELECT 1 FROM Subscribe WHERE fromUserId = ? AND toUserId = u.id),1,0) subscribeState, "); sb.append("if((?=u.id),1,0) equalUserState "); sb.append("FROM User u INNER JOIN Subscribe s "); sb.append("ON u.id = s.toUserId "); sb.append("WHERE s.fromUserId = ? "); //세미클론 첨부하면 안됨. //1. 물음표 principalId //2. 물음표 principalId //3. 마지막 물음표 페이지아이디 //쿼리 완성 Query query = em.createNativeQuery(sb.toString()) .setParameter(1, principalId) .setParameter(2, principalId) .setParameter(3, pageUserId); //쿼리 실행(qlrm 라이브러리 필요 -> DTO에 DB 결과를 매핑하기 위해서) JpaResultMapper result = new JpaResultMapper(); List<SubscribeDto> subscribeDtos = result.list(query, SubscribeDto.class); return subscribeDtos; }
Java
복사
포스트맨에서 테스트를 해보자
ssar로 먼저 포스트맨에서 로그인하고
이제 이 정보를 리턴받아서 모달에 뿌려주면 된다

*참고