Skip to content

Commit

Permalink
Merge pull request #96 from Kid-Bean/refactor/ldy/performance
Browse files Browse the repository at this point in the history
refactor: 낙관적 락을 이용한 데드락 관리
  • Loading branch information
leedy3838 authored Jul 28, 2024
2 parents 2efd34f + fdba01c commit 91eb203
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 21 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package soongsil.kidbean.server.imagequiz.application;

import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import soongsil.kidbean.server.imagequiz.dto.response.ImageQuizSolveScoreResponse;
import soongsil.kidbean.server.quizsolve.dto.request.QuizSolvedRequest;

@RequiredArgsConstructor
@Component
public class ImageQuizServiceFacade {

private final ImageQuizService imageQuizService;
private final MemberScoreUpdateStrategy memberScoreUpdateStrategy;

public ImageQuizSolveScoreResponse solveImageQuizzes(
List<QuizSolvedRequest> quizSolvedRequestList, Long memberId
) {
ImageQuizSolveScoreResponse score =
imageQuizService.solveImageQuizzes(quizSolvedRequestList, memberId);

if (score.score() != 0) {
memberScoreUpdateStrategy.updateUserScore(score.score(), memberId);
}

return score;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import soongsil.kidbean.server.auth.dto.AuthUser;
import soongsil.kidbean.server.global.dto.ResponseTemplate;
import soongsil.kidbean.server.imagequiz.application.ImageQuizService;
import soongsil.kidbean.server.imagequiz.application.MemberScoreUpdateStrategy;
import soongsil.kidbean.server.imagequiz.application.ImageQuizServiceFacade;
import soongsil.kidbean.server.quizsolve.dto.request.QuizSolvedListRequest;
import soongsil.kidbean.server.imagequiz.dto.request.ImageQuizUpdateRequest;
import soongsil.kidbean.server.imagequiz.dto.request.ImageQuizUploadRequest;
Expand All @@ -41,7 +41,7 @@
public class ImageQuizController {

private final ImageQuizService imageQuizService;
private final MemberScoreUpdateStrategy memberScoreUpdateStrategy;
private final ImageQuizServiceFacade imageQuizServiceFacade;

@Operation(summary = "추가한 ImageQuiz 문제 상세 정보 가져오기", description = "ImageQuiz 상세 정보 가져오기")
@GetMapping("/member/{quizId}")
Expand Down Expand Up @@ -90,11 +90,7 @@ public ResponseEntity<ResponseTemplate<Object>> solveImageQuizzes(
@Valid @RequestBody QuizSolvedListRequest request) {

ImageQuizSolveScoreResponse score =
imageQuizService.solveImageQuizzes(request.quizSolvedRequestList(), user.memberId());

if (score.score() != 0) {
memberScoreUpdateStrategy.updateUserScore(score.score(), user.memberId());
}
imageQuizServiceFacade.solveImageQuizzes(request.quizSolvedRequestList(), user.memberId());

return ResponseEntity
.status(HttpStatus.OK)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,15 @@
import soongsil.kidbean.server.member.domain.Member;
import soongsil.kidbean.server.imagequiz.domain.ImageQuiz;
import soongsil.kidbean.server.quizsolve.domain.QuizSolved;
import soongsil.kidbean.server.wordquiz.domain.WordQuiz;

@Repository
public interface QuizSolvedRepository extends JpaRepository<QuizSolved, Long> {

boolean existsByImageQuizAndMember(ImageQuiz imageQuiz, Member member);

boolean existsByWordQuizAndMember(WordQuiz wordQuiz, Member member);

List<QuizSolved> findAllByMemberAndIsCorrectAndImageQuizIsNotNull(Member member, boolean isCorrect);

List<QuizSolved> findAllByMemberAndIsCorrectTrue(Member member);

List<QuizSolved> findAllByMemberAndWordQuizNotNull(Member member);

boolean existsByImageQuizAndMemberAndIsCorrect(ImageQuiz imageQuiz, Member member, boolean isCorrect);

boolean existsByWordQuizAndMemberAndIsCorrect(WordQuiz wordQuiz, Member member, boolean isCorrect);

List<QuizSolved> findAllByImageQuizAndIsCorrectTrue(ImageQuiz imageQuiz);
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ void setUp() {
@DisplayName("ImageQuiz 풀기 테스트 - 동시성(데드락)")
void solveImageQuizConcurrent() throws Exception {
//given
int loopCnt = 2;
int loopCnt = 100;

ExecutorService executorService = Executors.newFixedThreadPool(loopCnt);
CountDownLatch latch = new CountDownLatch(loopCnt);
Expand Down
8 changes: 4 additions & 4 deletions src/test/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ spring:
active: test

datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb;MODE=MySQL;
username: sa
password:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/kidbeantestdb
username: root
password: test

jpa:
hibernate:
Expand Down

0 comments on commit 91eb203

Please sign in to comment.