✅ 좋아요 로직
/**
* 좋아요 추가
*/
@Transactional
public void addLikeToAnswer(LikeServiceRequest request) {
createLike(request); // Like 객체 생성 및 저장
Answer answer = answerRepository.findById(request.targetId())
.orElseThrow(() -> AnswerNotFoundException.EXCEPTION);
answer.addLikeCount();// Answer의 likeCount 1증가
// 수정 반영
answerRepository.edit(answer);
}
- 먼저 Like 객체를 만들어 Like 테이블에 저장하고 관련 Answer 객체를 읽어와 해당 Answer의 like를 1증가 시켜주고 이를 반영한다.
참고로 Like 객체를 만들고 테이블에 저장하는 부분의 코드는 다음과 같다.
// Like 저장 생성 및 저장
private void createLike(LikeServiceRequest request) {
if (isAlreadyLike(request.targetId(), request.userId(), TargetType.valueOf(request.targetType()))) // 좋아요를 누른적이 있다면 예외
throw AlreadyLikedException.EXCEPTION;
Like like = Like.create(
null,
TargetType.valueOf(request.targetType()),
request.targetId(),
request.userId()
);
likeRepository.save(like);
}
// 같은 글에 좋아요를 누른적이 있는지 확인
private boolean isAlreadyLike(Long targetId, String userId, TargetType targetType) {
return likeRepository.existsByTargetIdAndUserIdAndTargetType(targetId, userId, targetType);
}
- 먼저 해당 정보로 좋아요를 누른적이 있는지 Like 테이블을 조회한다.
- 조회되는 정보가 없다면 Like 객체를 만들어 테이블에 저장한다.
간단한 좋아요 추가 로직이지만 그 안에서는 쿼리가 총 4번 발생한다.
- Like 테이블 조회(Select) - 이미 좋아요를 누른 적 있는지 확인
- Like 테이블에 저장(Insert) - 좋아요를 누른적이 없다면 해당 Like 정보 저장
- Answer 테이블 조회(Select)
- Answer 테이블 좋아요 값 수정(Update) (수정은 Dirty Check 활용)
지금부터 이 로직에서 발생하는 문제들에 대해 알아보고 해결해보도록 하겠다.
1️⃣ Like 테이블 데이터 정합성 문제
[최종 프로젝트] 좋아요 API 동시성 이슈 해결 - 1. Like 테이블 데이터 정합성 문제
1️⃣ Like 테이블 데이터 정합성 문제다음의 시나리오를 가정해보자.일단 해당 시나리오는 일반적인 상황은 아니고 특정 유저의 악성적인 요청에 해당한다.User1이 1번글에 좋아요 요청을 한다.U
jaehee1007.tistory.com
2️⃣ Answer 테이블 데이터 정합성 문제 해결
1. 비관적 락(@Lock) 적용
[최종 프로젝트] 좋아요 API 동시성 이슈 해결 - 2-1. Answer 테이블 데이터 정합성 문제 해결: 비관적
✅ Answer 테이블 데이터 정합성 문제다음의 시나리오를 보자.사용자1, 사용자2가 동시에 1번글에 좋아요 요청을 한다.(간발의 차이로 1번이 빨랐다고 가정)두 요청 모두 수정을 위해 좋아요가 0인
jaehee1007.tistory.com
2. 분산 락(Redisson) 적용
[최종 프로젝트] 좋아요 API 동시성 이슈 해결 - 2-2. Answer 테이블 데이터 정합성 문제 해결: 분산
현재 포스트는 해당 포스트에서 이어지는 내용입니다. [최종 프로젝트] 좋아요 API 동시성 이슈 해결 - 1. Like 테이블 데이터 정합성 문제1️⃣ Like 테이블 데이터 정합성 문제다음의 시나리오를
jaehee1007.tistory.com
'데브코스 > 실습 & 프로젝트' 카테고리의 다른 글
[최종 프로젝트] 좋아요 API 동시성 이슈 해결 - 2-1. Answer 테이블 데이터 정합성 문제 해결: 비관적 락(@Lock) 적용 (0) | 2024.12.31 |
---|---|
[최종 프로젝트] 좋아요 API 동시성 이슈 해결 - 1. Like 테이블 데이터 정합성 문제 (0) | 2024.12.31 |
[최종 프로젝트] 질문 생성 기능 - 5. 질문 생성 로직 개선하기(질문 생성 횟수, 데이터 불일치 개선) (0) | 2024.12.30 |
[최종 프로젝트] 질문 생성 기능 - 4. 질문 생성 로직 구현하기 (0) | 2024.12.30 |
[최종 프로젝트] 질문 생성 기능 - 3. 질문의 벡터를 저장하기 위한 Redis Vector Database & Vector Search (Spring AI) (0) | 2024.12.30 |