강의

멘토링

커뮤니티

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

KMC님의 프로필 이미지
KMC

작성한 질문수

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

커서 기반 페이지네이션 과 무한 스크롤링

해결된 질문

작성

·

20

·

수정됨

0

안녕하세요 강사님

강의를 수강하는 학생입니다.

 

무한 스크롤링은 두 번째부터 보통 끝쪽 id 에 데이터를 기반으로 데이터를 불러오는 방식이

보통 커서 기반 페이지네이션과 큰 차이가 없는 건가요? (claude 나 ) 블로그 보면서 이것도 비슷한 개념인 거 같아서 질문 드립니다.

 

@Entity

@Table(

name = "post",

indexes = {

@Index(

name = "idx_post_board_created_id",

columnList = "board_id, created_at DESC, post_id DESC"

),

@Index(

name = "idx_post_created_id",

columnList = "created_at DESC, post_id DESC"

)

}

)

@Getter

@NoArgsConstructor

public class Post {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

@Column(name = "post_id")

private Long id;

@ManyToOne(fetch = FetchType.LAZY)

}

이렇게 엔티티에 인덱스를 만들어서 사용하는지 궁금합니다. 강의에서 처럼 SnowFlake도 보통 저렇게 인덱스를 만들어서 활용하는지도 궁금합니다.

답변 2

0

쿠케님의 프로필 이미지
쿠케
지식공유자

KMC님, 안녕하세요!

 

무한 스크롤링은 두 번째부터 보통 끝쪽 id 에 데이터를 기반으로 데이터를 불러오는 방식이

보통 커서 기반 페이지네이션과 큰 차이가 없는 건가요? (claude 나 ) 블로그 보면서 이것도 비슷한 개념인 거 같아서 질문 드립니다.

무한 스크롤 사용성에서 특정 기준점(강의에서는 마지막 ID)으로 다음 데이터를 불러오는 것이 커서 기반 페이지네이션입니다! 동일한 의미입니다.

무한 스크롤은 실제 사용자 입장에서의 용어이고, 내부적인 구현 관점에서는 커서 기반으로 동작합니다.

물론, 무한 스크롤이 항상 커서 기반으로 동작해야한다는 것은 아니고, offset/limit 방식으로도 무한 스크롤링을 구현할 수는 있습니다. 다만, 무한 스크롤링이라 하면 커서 기반 구현을 일반적으로 사용하긴 하네요.

 

이렇게 엔티티에 인덱스를 만들어서 사용하는지 궁금합니다. 강의에서 처럼 SnowFlake도 보통 저렇게 인덱스를 만들어서 활용하는지도 궁금합니다.

Snowflake는 그저 오름차순 수를 충돌없이 빠르게 생성하기 위한 알고리즘이고, 이러한 특성으로 인해 primary key로 사용될 뿐 인덱스와는 무관합니다.

아무튼 엔티티에 인덱스, 연관 관계 등의 애노테이션을 질문주신 것으로 이해했는데요.

그렇게 해도 되고, 안해도 됩니다. 강제될 부분도 없고 자유롭게 하면 됩니다.

하지만 조금 더 실무 관점에서 본다면, 인덱스를 코드에 애노테이션으로 정의하는 경우는 잘 없습니다.

물론, 위처럼 사용하는 사람도 있겠지만, 한번 사용되고 말 코드이고 DDL은 별도 스크립트 또는 문서로 관리하거나 db에 생성된걸 직접 보는게 일반적인 것 같네요.

연관 관계 애노테이션도 객체 간에 강결합되면 유지보수도 어렵고, 애초에 분산 환경이라면 객체 참조 자체가 어려울 수 있어서 굳이 사용하진 않네요.

저와 주변의 경우를 보면, 애초에 JPA 자체를 안쓰는 경우가 더욱 일반적이라고 생각되네요.

KMC님의 프로필 이미지
KMC
질문자

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. KMC님.

질문해주신 무한 스크롤링과 커서 기반 페이지네이션의 개념은 서로 매우 밀접하게 관련되어 있습니다. 이를 이해하기 위해 두 가지 방법을 요약해보면 좋을 것 같습니다.

무한 스크롤링과 커서 기반 페이지네이션

  • 무한 스크롤링:

    • 사용자는 스크롤을 계속 내리면서 데이터를 계속 불러옵니다.
    • 보통 노출된 마지막 항목의 ID나 시간 기준으로 다음 데이터 세트를 불러오는 방식입니다.
    • 사용자 경험이 개선되어 끊임없이 콘텐츠를 탐색할 수 있게 합니다.
  • 커서 기반 페이지네이션:

    • 보통 데이터베이스 쿼리에 WHERE 조건 (예: WHERE created_at < timestamp AND id < last_id) 등을 사용하여 데이터를 필터링합니다.
    • 각 요청 시 마지막으로 본 항목의 커서를 기준으로 데이터를 불러옵니다.
    • 페이징이 명확하여 데이터의 안정성과 일관성이 높아 언제 중간 페이지를 보더라도 동일한 데이터를 볼 수 있는 장점이 있습니다.
    • 주로 대용량 데이터에 대한 효율적인 처리가 가능하여 성능 상 이점이 클 수 있습니다.

따라서, 무한 스크롤링은 커서 기반 페이지네이션의 UX 구현 방식 중 하나로 볼 수 있습니다. 두 방식 모두 마지막 객체의 ID나 날짜 등을 기준으로 데이터를 가져오는 방식에서는 큰 차이가 없습니다.

인덱스 사용의 중요성

주어진 엔티티 클래스의 인덱스 설정은 데이터베이스의 성능을 극대화하는 데 필수적입니다. board_id, created_at DESC, post_id DESC 와 같은 인덱스는 다음과 같은 상황에서 유용합니다:

  • 검색 성능 향상: 게시글을 시간 순서대로 정렬할 때 특히 유리합니다.
  • 필터링 성능: 특정 게시판 ID에 대한 검색을 빠르게 실행합니다.

쿼리의 효율적 실행을 위해 이러한 인덱스를 잘 사용하는 것이 필요합니다. 데이터의 양이 증대할수록 인덱스의 효과는 더욱 중요해질 것입니다.

이와 같은 무한 스크롤 및 커서 페이지네이션과 관련한 문제를 다루는 기존 답변 및 관련 자료는 아래 링크를 참고하실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

KMC님의 프로필 이미지
KMC

작성한 질문수

질문하기