인프런 커뮤니티 질문&답변
좋아요 기능 정합성 보장 방법
작성
·
15
0
학습 관련 질문을 최대한 상세히 남겨주세요!
고민 과정도 같이 나열해주셔도 좋습니다.
먼저 유사한 질문이 있었는지 검색해보세요.
인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
좋아요에 대한 정합성을 (article_id, user_id) 유니크 인덱스로 보장하는 것은 DB의 역할이라고 생각합니다.
그렇다면, 다수의 동시 요청이나 사용자의 반복 클릭(예: 좋아요 버튼을 연속으로 누르는 경우) 상황에서 불필요한 DB 부하와 예외 발생을 줄이기 위해 애플리케이션 단에서는 어떤 방식으로 이를 보완하고 처리하는 것이 적절한가요?
좋아요에 대한 정합성을 (article_id, user_id) 유니크 인덱스로 보장하는 것은 DB의 역할이라고 생각합니다.
다만, 다수의 동시 요청이나 사용자의 반복 클릭(예: 좋아요 버튼을 연속으로 누르는 경우) 상황에서는 애플리케이션 단의 단순한 선행 검증만으로는 이를 제어하기 어렵다고 느꼈습니다.
예를 들어, 아래와 같은 코드에서는 다음과 같은 경쟁 상태(race condition)가 발생할 수 있습니다.
T1: exists → false
T2: exists → false
T1: insert
T2: insert ❌ (유니크 제약 위반)
if (!likeRepository.exists(postId, userId)) {
likeRepository.save(...);
}
이처럼 애플리케이션 레벨의 exists → insert 패턴이 동시성 문제를 해결하지 못하는 상황에서
DB 예외에만 의존하지 않고 불필요한 중복 요청과 예외 발생을 줄이기 위해 애플리케이션 단에서는 어떤 방식으로 이를 보완하는 것이 바람직하다고 보시는지 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 근것님.
현재 질문은 “좋아요 기능에서의 정합성 보장”에 대한 것입니다. 데이터베이스에 유니크 인덱스를 두어 (article_id, user_id) 조합을 통해 정합성을 보장할 수 있지만, 다수의 동시 요청이나 사용자 반복 클릭에 대해 애플리케이션 레벨에서 어떻게 최적화할 수 있는지에 대한 부분을 고민하신 것 같습니다.
애플리케이션 레벨에서의 동시성 문제 해결 방안
분산 잠금(Distributed Lock) 사용:
- Redis나 Zookeeper를 사용하여 특정 레코드에 대한 임의의 잠금을 설정함으로써 동시성 문제를 어느 정도 해결할 수 있습니다. 이러한 잠금은 중복된 요청을 하나의 요청으로 간주하고 나머지는 대기시키거나 거부할 수 있습니다.
- Redis나 Zookeeper를 사용하여 특정 레코드에 대한 임의의 잠금을 설정함으로써 동시성 문제를 어느 정도 해결할 수 있습니다. 이러한 잠금은 중복된 요청을 하나의 요청으로 간주하고 나머지는 대기시키거나 거부할 수 있습니다.
Rate Limiting:
- API 게이트웨이 레벨에서 특정 유저에 대해 요청 빈도를 제한하는 방법도 있습니다. 일정 시간 내에 허용된 요청 수를 초과하는 사용자 요청은 제한시켜, 불필요한 중복 요청을 줄일 수 있습니다.
- API 게이트웨이 레벨에서 특정 유저에 대해 요청 빈도를 제한하는 방법도 있습니다. 일정 시간 내에 허용된 요청 수를 초과하는 사용자 요청은 제한시켜, 불필요한 중복 요청을 줄일 수 있습니다.
Optimistic Locking (낙관적 잠금):
- JPA의 Versioning을 이용하여 특정 엔티티의 버전을 체크하고 업데이트하는 중간에 다른 스레드에 의해 변경이 되지 않도록 보장할 수 있습니다.
- JPA의 Versioning을 이용하여 특정 엔티티의 버전을 체크하고 업데이트하는 중간에 다른 스레드에 의해 변경이 되지 않도록 보장할 수 있습니다.
Pseudo-Unique Key 생성:
- 예를 들어, 특정 이벤트 전후의 시간 간격을 기준으로 한 임시 유니크 키를 발급하고 이를 통해 중복 클릭을 감지하고 방지할 수 있습니다.
- 예를 들어, 특정 이벤트 전후의 시간 간격을 기준으로 한 임시 유니크 키를 발급하고 이를 통해 중복 클릭을 감지하고 방지할 수 있습니다.
프론트엔드 레벨에서의 UX 개선:
- 사용자가 버튼을 클릭했을 때, 일시적으로 비활성화하고 처리 완료 시 다시 활성화하는 방법으로 중복 클릭을 방지할 수 있습니다.
- 사용자가 버튼을 클릭했을 때, 일시적으로 비활성화하고 처리 완료 시 다시 활성화하는 방법으로 중복 클릭을 방지할 수 있습니다.
이러한 방법을 통해 애플리케이션 레벨에서 추가적인 보호를 통해 불필요한 DB 부하와 예외 발생을 최소화할 수 있겠습니다.
유사한 문제 및 해결책을 다루고 있는 게시물들이 있어 도움이 될 것입니다:
- 좋아요 기능 구현 시의 데이터베이스 유니크 제약 조건 활용 방법 (게시글 제목)
- 멀티 서버 환경에서의 데이터 동기화 및 캐싱 전략에 관한 질문 (게시글 제목)
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천합니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





