📌 기초데이터베이스 시간에 배우는 내용이라서 복습하는 시간을 가졌고, 페이지네이션부분에 대한 공부를 추가로 하였다
✏️ Right Join이란?
오른쪽 테이블의 모든 값이 출력되는 조인
✏️ Left Join이란?
왼쪽 테이블의 모든 값이 출력되는 조인
좌측 테이블 데이터에 추가로 우측 정보를 조인하는 문법이다
✏️ Inner Join
양측 모두에 존재하는 것만 결과로 만든다 하지만 Left 조인은 좌측테이블 중 조인 불가능한 것들도 모두 결과로 만든다. 이때 조인이 불가능한 우측테이블 값은 Null로 채워진다
📌 해시태그를 통한 책의 검색
select * from book where id in
(select book_id from book_hash_tag
where hash_tag_id = (select id from hashtag where name = 'UMC'));
📌 좋아요 개수 순으로 목록 조회
select * from book as b
where book.id = book_likes.id AND
join (select count(*) as like_count
from book_likes
group by book_id) as likes on b.id = likes.book_id
order by likes.like_count desc;
멋사 축제 사이트할 때 주점 목록을 넘겨주는 것을 구현한 적이 있는데, 그렇게 많은 데이터를 다뤄보는 것이 처음이기도 했고 타임 어택 프로젝트기도 해서 페이징에 대해 생각도 못하고 그냥 그대로 넘겨줬었는데, 통신할때 프론트 측에서 최적화가 어렵다는 요청이 들어왔었다. 그제서야 페이지네이션에 대한 내용이 생각이 났었는데 홍대 축제까지 얼마 안남았었기 때문에 프론트 측에서 최대한 최적화를 하려고 노력했었는데 굉장히 죄송했었다. 이번 umc 스터디에서 페이징에 대해 공부해보는 겸 기본 코드를 리팩토링 해보는 시간도 가져보았다.
select *
from book
order by likes desc
limit 10 offset 0;
위와 같이 limit을 통해 한 페이지에서 보여줄 데이터의 개수를 정하고 offset으로 몇 개를 건너뛸지를 정한다
select *
from book
order by likes desc
limit y offset(x-1) * y
하지만 1페이지에서 2페이지로 가는 순간 책이 실시간 추가가 된다면 2페이지에서 1페이지에서 본 것들을 또 보게 될 단점이 존재한다
cursor로 무언가를 가르켜 페이징을 하는 방법이다. 여기서 커서는 마지막으로 조회한 콘텐츠이다
조금 더 실용적으로 접근하기 위해 spring data jpa에서 pagination을 구현하는 방법이 없을까 해서 구글링 한 결과 pageable이란 라이브러리가 있다는 것을 알게 되었다
개발자가 직접 구현해서 사용할 수 있으나 jpa에서는 이를 편하게 사용할 수 있도록 Pageable 이라는 객체를 제공한다
public interface UserRepository extends JpaRepository<Job, Long> {
List<User> findByLastName(String lastName, Pageable pageable);
}
@Controller
public class UserController {
@GetMapping("/users")
public List<UserResponse> findByLastName(@RequestParam String lastName,Pageable pageable) {//생략}
위와 같은 방식으로 Pageable 객체를 인수로 넘겨줌으로써 JpaRepository로 부터 원하는 Page만큼의 User목록을 반환받을 수있다
GET /users?lastName=kim&page=3&size=10&sort=id,DESC
내 예전 코드(우웩)
@GetMapping("/pubs/{department}")
public PubResponseDto getPubsByDepartment(@PathVariable String department) {
User user = authentiatedUserUtils.getCurrentUser();
return pubService.getPubByDepartment(department,user);
}
적용
@GetMapping("/pubs")
public PubResponseDto getPubsByDepartment(@RequestParam String department,Pageable pageable) {
User user = authentiatedUserUtils.getCurrentUser();
return pubService.getPubByDepartment(department,user);
}
public interface PubRepository extends JpaRepository<Pub,Long> {
List<Pub> findByDepartment(String department,Pageable);
}
실제로 적용할때 이 블로그 포스팅 참고하자!
https://www.baeldung.com/spring-data-jpa-pagination-sorting