문제

public VoteResult manageVote(User voter, Long targetId, VoteType voteType) {

	Optional<T> existing = voteRepository.findByVoterIdAndTargetId(voter.getId(), targetId);
	VoteType prevVoteType = VoteType.NONE;

	if (voteType == VoteType.NONE) {
		existing.ifPresent(voteRepository::delete);
	} else {
		if (existing.isPresent()) {
			T vote = existing.get();

			prevVoteType = vote.getVoteType();
			voteRepository.update(vote, voteType);
		} else {
			T vote = buildVote(voter, targetId, voteType);

			voteRepository.save(vote);
		}
	}

	Long upvoteCount = voteRepository.countUpvotesByTargetId(targetId);
	Long downvoteCount = voteRepository.countDownvotesByTargetId(targetId);

	return new VoteResult(voteType, prevVoteType, upvoteCount, downvoteCount);
}

튜터님 질문

박성규 튜터님

2025-06-19T16:47:32.844+09:00 WARN 25424 --- [min] [ool-4-thread-34] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1062, SQLState: 23000 2025-06-19T16:47:32.844+09:00 ERROR 25424 --- [min] [ool-4-thread-34] o.h.engine.jdbc.spi.SqlExceptionHelper : Duplicate entry '1-1' for key 'discussion_vote.unique_voter_discussion'

질문 1. 연속 추천 요청이 들어오면 여러 개의 데이터가 생길 수 있음 (동시성 제어) -> 이미 (oter_id, discussion_id)를 유니크 제약조건으로 사용 중 -> 테스트 코드 돌렸을 때 DataIntegrityViolationException 예외가 발생하기는 하지만 최종적으로는 하나의 데이터만 저장됨

굳이 리소스를 할당해가며 락 처리를 해줘야 하는가?

질문 2. 데이터가 만, 십만개 단위가 되지 않는 이상 서브 쿼리로 추천/비추천 수 조회해도 성능 상 큰 차이가 없다고 이태현 튜터님이 말씀하심 튜터님은 어떻게 생각하시는지

구현 우선순위를 낮게 둬도 괜찮나?