인프런 커뮤니티 질문&답변

인플언님의 프로필 이미지
인플언

작성한 질문수

실전! 스프링 데이터 JPA

스프링 데이터 JPA 페이징과 정렬

실무(OLTP 환경)에서는 강의에서 알려주신 오프셋 페이징을 쓰면 안되는거 맞을까요?

작성

·

419

0

실무에서 DB 를 사용한다고 하면 배치나 데이터 파이프라인 등이 아닌 OLTP 환경에서는 절대 오프셋 기반의 페이징을 쓰면 안되지 않나요?

우선 페이징 도중에 다른 클라이언트에 의해 실시간으로 데이터가 삽입/삭제가 일어나 중복된 데이터가 보여지거나 중간 데이터 누락이 발생할 수도 있기 때문에 문제가 될 것이고,

성능의 관점에서도 SQL 쿼리에서 OFFSET 문의 경우 index seek 과정에서 바로 페이지의 첫 데이터를 찾아가는것이 아니라 불필요하게 맨 처음 인덱스부터 offset 사이즈만큼 스캔한 뒤에 limit 만큼 가져오는 것이기 때문에 scalable 않지만,

커서 기반의 페이징의 경우 데이터의 양이 많아지더라도 where 절을 통해 index seek 과정에서 바로 커서에 해당하는 인덱스를 찾아가서 page size 만큼의 데이터만 스캔하면 되기 때문에 실무에서 굳이 오프셋 기반의 페이징을 쓸 이유가 없다.

라고 이해하면 맞을까요?

 

물론 페이징 대상이 되는 데이터의 수 자체가 매우 적거나 유저가 많은 페이지를 탐색하지 않는다면 큰 문제가 되지 않을 수도 있지만, 커서 기반의 페이징을 구현하는것이 특별이 어려운 것도 아니고 굳이 오프셋 기반의 페이징을 사용할 필요가 있나 궁금했습니다!

답변 2

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 인플언님

이 부분은 상황에 따른 선택인데요. 참고로 OLTP 환경에서도 오프셋 기반의 페이징을 많이 사용합니다.

성능상 커서 기반이 당연히 유리하지만, 커서 기반은 인덱스가 순서에 맞추어져 있어야 하기 때문에, 복잡한 조건에서는 사용하기 어렵습니다.

결국 여러가지 트레이드 오프를 고려해서 선택해야 합니다.

감사합니다.

0

인플언님의 프로필 이미지
인플언
질문자

영한님, 답변 감사드립니다!

 

혹시 말씀하신 복잡한 조건의 예는 어떤 것이 있을까요?

성능을 고려하면 페이징 시 사용하고자 하는 모든 정렬 기준에 따라 인덱스는 당연히 만들어야 하는것 아닌가요?

김영한님의 프로필 이미지
김영한
지식공유자

데이터베이스 인덱스 라는 것을 많이 만들면 좋겠지만, 인덱스가 많으면 해당 인덱스를 유지하는 비용도 함께 고려해야 합니다. 그래서 모든 정렬 기준에 따라 인덱스를 다 만들지 못하는 경우들도 있습니다.

예를 들어서 어드민에서 다양하고 복잡한 정렬 조건들을 사용하는 경우이지요. 어드민은 트래픽이 적기 때문에 보통 크게 문제가 되지는 않습니다. 사용자 접점의 트래픽이 많은 곳에서는 커서 기반의 최적화를 더 고려할 필요가 있습니다.

그 외에도 커서 기반 페이징을 사용할 수 없는 다양한 상황들이 있는데요. 이 부분은 커서 기반의 페이징 단점, 커서 기반의 페이징 한계 등으로 검색해보시면 원하시는 내용을 찾으실 수 있을거에요.

기본적으로 커서 기반의 페이징이 성능상 훨씬 좋고, 사용할 수 있는 상황이면 사용하는 것이 당연히 좋습니다.

감사합니다.

인플언님의 프로필 이미지
인플언
질문자

아아 그렇군요, 답변 감사합니다!

 

그런데 또 하나 궁금한 것은,

만약 오프셋 기반의 페이징을 사용하게 되면 한 명의 사용자가 페이징을 하는 동안에 또 다른 사용자가 정렬 순서 상 맨 처음 데이터를 삭제하는 경우에는 데이터가 앞으로 한 칸씩 밀려 페이징 중인 사용자는 중간에 하나의 아이템이 누락되는 경우가 발생하지 않나 싶은데요!

또한, 반대로 중간에 데이터를 삽입하는 경우에는 아이템이 중복해서 나타날 수도 있을것 같고요.

만약 한 명이 아니라 여러명의 사용자가 동시에 데이터를 삽입/삭제를 반복한다면 이런 현상이 매우 심화될것 같습니다.

아무리 어드민 툴이라고 하더라도 중간에 데이터가 누락되는 경우에는 사용성이 매우 떨어지고 사용자가 의사결정을 내리는데 혼란을 줄 수도 있을것 같은데 이런 경우는 어떻게 해결할 수 있을까요?

 

애초에 어드민 툴은 대부분 동시에 여러명이 데이터를 삽입/삭제/조회를 하는 경우가 많지 않아서 별로 문제가 되지 않는 것이라고 이해할 수 있을까요?

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 인플언님

보통 데이터의 상태값을 기반으로 정렬, 필터할 수 있는 기능을 제공하기 때문에 이 부분이 크게 문제가 되지는 않습니다.

감사합니다.

인플언님의 프로필 이미지
인플언
질문자

영한님 안녕하세요. 주말인데도 답변을 달아주셔서 정말 감사드립니다.

그런데 제가 잘 이해가 가지 않아서 그런데 혹시 간단한 예를 들어서 조금 더 설명해 주실 수 있으신가요?

감사합니다.

 

김영한님의 프로필 이미지
김영한
지식공유자

네 인플언님

예를 들어서 고객이 주문하고, 회사에서 주문을 접수해야 하는 시스템이 있다고 가정할께요.

동시에 여러명의 고객이 주문을 하더라도, 리스트에서 주문 상태에 따라서 필터링 해서 조회할 수 있는 기능이 제공되기 때문에 동시에 여러명이 데이터를 삽입하더라도 문제가 되지는 않습니다.

감사합니다.

인플언님의 프로필 이미지
인플언
질문자

네 답변 감사합니다!

인플언님의 프로필 이미지
인플언

작성한 질문수

질문하기