inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

조회수 어뷰징 방지 정책 구현

조회수 어뷰징 방지 질문

해결된 질문

145

amoa

작성한 질문수 1

0

안녕하세요~

어뷰징 방지에 대한 질문을 드리고 싶습니다.

 

현재, 어뷰징 방지를 위해 분산락을 잡고 해당 유저가 특정 게시물에 대한 조회수를 10분 동안 1만 올릴 수 있도록 설계해주셨는데요.

레디스의 키-벨류 로도 충분히 위와 같은 어뷰징 방지를 설계할 수 있지 않나요?

 

만약 이 값이 이미 존재한다면 조회수를 올리지 않는 방식으로 구현해도 충분할 거 같은데, 분산락으로 이 로직을 구현하신 이유가 궁금합니다.

 

감사합니다!

java mysql spring-boot kafka redis

답변 2

0

쿠케

amoa님, 안녕하세요!

 

만약 이 값이 이미 존재한다면 조회수를 올리지 않는 방식으로 구현해도 충분할 거 같은데, 분산락으로 이 로직을 구현하신 이유가 궁금합니다.

강의에서 진행한 setIfAbsent가 내부적으로 SETNX 명령어를 사용하기 때문에 동일한 방식입니다.

두 가지가 다른 방식이 아닙니다.

분산락에 대한 구현 방식을 SETNX로 처리했다고 봐주시면 됩니다!

0

인프런 AI 인턴

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

어뷰징 방지 정책을 설계할 때, 특히 조회수 증가와 관련된 로직에서 분산락을 사용하는 이유와 Redis의 키-값 쌍을 활용하는 방법에 대해 자세히 설명해드릴게요.

Redis를 활용한 어뷰징 방지 방법

  1. Redis의 키-값을 활용한 방법:

    • SETNX 명령과 TTL을 사용하여 특정 사용자가 일정 시간 동안 특정 글에 대해 조회수를 한 번만 증가시키도록 할 수 있습니다. 예를 들어, SETNX (key=유저+게시글, value=1, TTL=10분)으로 설정하면 최초 접속 시에만 값이 설정되고, TTL이 지나기 전까지는 동일한 키 생성이 방지됩니다.
  2. 분산락을 사용하는 이유:

    • 데이터 일관성 및 충돌 방지: 분산락은 여러 서버나 인스턴스에서 동시에 같은 작업이 실행되지 않도록 보장합니다. 특정 사용자가 여러 분산 환경(예: 다양한 서버, 클라우드 인스턴스)에서 동시에 접근할 때 발생할 수 있는 동시성 문제를 해결하는데 유효합니다.
    • 복잡한 트랜잭션 관리: 분산락은 더 복잡한 트랜잭션 구조에서 데이터의 원자성을 보장하는데 유리합니다. 즉, 여러 데이터를 동시에 변경해야 하는 상황에서는 분산락이 큰 도움이 됩니다.

결론

  • Redis의 SETNXTTL을 활용하여 간단히 어뷰징을 방지할 수 있지만, 분산 환경에서의 동시성 문제나 복잡한 트랜잭션 관리가 필요할 때는 분산락을 병행하는 것이 데이터의 일관성을 유지하는 데 더 효과적일 수 있습니다.

완벽한 해결책은 아니지만, 환경에 맞게 적절한 해결책을 찾아가는 것이 중요합니다. 유사한 주제를 다룬 게시글이 있으면 참조하실 수 있도록 안내해 드리겠습니다.

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

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

0

31

1

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

0

47

2

게시글 테스트 데이터 삽입

0

50

2

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

0

104

2

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

0

97

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

110

2

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

0

97

2

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

0

156

2