강의

멘토링

로드맵

Inflearn brand logo image

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

amoa님의 프로필 이미지
amoa

작성한 질문수

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

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

조회수 어뷰징 방지 질문

해결된 질문

작성

·

63

0

안녕하세요~

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

 

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

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

  • SETNX (key=유저+게시글, value=1, TTL=10분)

 

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

 

감사합니다!

답변 2

0

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

amoa님, 안녕하세요!

 

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

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

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

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

0

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

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

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

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

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

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

결론

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

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

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

amoa님의 프로필 이미지
amoa

작성한 질문수

질문하기