inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

조회수 설계 & Redis 개발 환경 세팅

페이징 조건시 조회수 정렬 기능 질문

해결된 질문

79

soap

작성한 질문수 37

0

강사님 안녕하세요.

게시판 조회시 페이징으로 처리할때 조회수를 오름차순, 내림차순 정렬하는 기능이 있다면 현재 강의 설계 기준으로 어떻게 구현할 수 있을까요?

 

제가 생각한 방법은 다음과 같습니다.

사전 조건:

  1. 페이징 쿼리에서 RDB 백업 테이블의 조회수 기준으로 정렬

  2. 코드 레벨에서 redis 데이터 기준으로 한번 더 정렬

     

     

문제는, 2번에서 한 페이지의 데이터만 정렬이 되기 대문에 페이지를 넘어갈때 정렬이 깨지는 현상이 발생합니다 ㅠ

 

데이터 전체를 메모리에 한번에 조회하지 않고 할 수 있는 방법이 있을까요?

java mysql spring-boot kafka redis

답변 1

1

쿠케

soap님, 안녕하세요!

 

말씀하신 방법으로도 구현은 가능하지만,

조회수처럼 실시간으로 변하는 데이터에 대해서는 페이지 넘어갈때 정렬이 깨지는 현상은 당연하고 어쩔 수 없습니다.

이러한 방식은 기술로 풀어내기 보단, 서비스 정책으로 풀어내는게 유리할 것 같습니다.

실제로도 기술적으로 해결하기 어려울 때에는 정책으로 풀어내는 상황이 아주 많습니다.

만약 기술로 풀어낼 수 있다고 하더라도, 그 복잡성과 서버 비용 및 부하 대비하여 사용자에게 큰 이점이 없을 때에도 정책으로 풀어낼 수 있는 것이고요.

몇 가지 예시를 드려보겠습니다.

 

  • 항상 실시간으로 완벽하게 정렬된 상태를 만들 필요가 없도록 한다면?

그러면 "페이징 쿼리에서 RDB 백업 테이블의 조회수 기준으로 정렬"만 하면 충분할 수도 있습니다.

코드 레벨에서 redis 데이터 기준으로 실시간 정렬할 필요가 없어지게 되는 것이고요.

그러면 두 번 정렬해야 하는 부담이 줄어들게 됩니다.

정렬이 깨지는 현상을 완벽히 막아낼 순 없지만, 적어도 완전한 실시간 보다는 줄어들게 될 것이고요.

 

  • 항상 실시간으로 완벽하게 정렬된 상태를 만들 필요가 없도록 하고, 정렬 키(조회수)의 갱신 단위를 더욱 늦춘다면?

갱신 단위는 현 기준처럼 개수가 될 수도 있고, 시간이 될 수도 있습니다.

만약 10개 -> 100개로 늘린다면, 정렬 순서가 갱신되는 주기는 더욱 늘어나게 됩니다.

이 경우에도 정렬이 깨지는 현상을 완벽히 막아낼 순 없지만, 적어도 완전한 실시간 보다는 줄어들게 됩니다.

 

  • 조회수 상위 N건만 조회할 수 있도록 한다면?

여기서 말하는 N은 메모리로 한번에 불러와도 충분한 크기를 말합니다.

다음 페이지를 요청할 때, 현재 사용자가 가지고 있는 모든 데이터의 식별자를 전달합니다.

식별자는 압축 등으로 최대한 작게 유지할 수도 있는 것이고요.

애플리케이션 서버는 DB(또는 레디스)에서 N건을 모두 조회하고, 사용자에게 이미 응답된 데이터들은 필터링한 상위 pageSize 개수만큼 데이터를 반환해줍니다.

사용자에게 이미 응답된 데이터들의 정렬은 어쩔 수 없겠지만(물론 정책에 따라 클라이언트 재정렬을 할 수도 있음),

적어도 새롭게 페이지를 요청하는 시점에는 현재 정렬된 기준의 데이터들을 중복없이 노출 시켜줄 수 있습니다.

 

기술적으로 풀어내기 어렵다면, 정말로 필요한 기능인지 또는 비슷하면서도 다른(간소화된) 방법으로 풀어낼 수는 없는지도 고민해보시는 것도 좋습니다!

0

soap

감사합니다!

@Version 어노테이션이 붙은 필드는 낙관적 락이든 비관적 락이든 업데이트가 됩니다.

0

31

1

consumer에서 에러가 발생할 경우 데이터 유실 문의

0

47

2

게시글 테스트 데이터 삽입

0

50

2

정렬, 필터, 검색 등의 조건이 붙을 경우 최적화할 수 있는 방법이 무엇이 있을까요?

0

104

2

좋아요 기능 정합성 보장 방법

0

96

2

좋아요 동시성처리 최적의 선택?

1

135

2

프론트엔드 msa 환경 api 주소 통합? 과 서버끼리 통신 방식에대해

0

92

2

안녕하세요 무한스크롤 강의듣다가 질문이 있습니다.

0

59

1

조회수 조회 로직 질문

1

67

2

비로그인 유저도 어뷰징 방지 정책

1

72

2

CommentServiceTest의 테스트 로직 질문

0

54

2

무한 스크롤 방식에서 페이지 번호 방식 쿼리의 문제점 의문

1

74

2

path 쿼리 관련 질문드립니다!

0

60

2

antigravity 에디터를 쓰신다면 종료해주세요

1

123

0

프로젝트 구조

0

88

2

article_like_count api test

0

78

2

이벤트 페이로드 객체의 생성 방식이 팩토리 메서드 패턴이 아닌 빌더 패턴인 이유가 궁금합니다!.

0

104

2

[33. 좋아요 수 구현] 에서 테스트 하는 화면 동시성 문제

0

91

2

findByPath에서 articleId로도 검색을 해야 할 것 같아요.

0

92

3

jpa ddl-auto none을 하는 이유와 join 방법

0

97

2

팩터리 메소드와 response 객체 사용 이유가 궁금합니다!

0

90

2

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

0

109

2

게시글 생성 로직에서 오류 발생시 redis 게시글 수 되돌리기

0

97

2

멀티 모듈이 아닌 MSA 환경에서 common

0

156

2