Skip to content

Commit

Permalink
Merge pull request #89 from Kid-Bean/refactor/ldy/performance
Browse files Browse the repository at this point in the history
refactor: 문제를 중복해서 풀어도 점수 계속 지급
  • Loading branch information
leedy3838 authored Jul 20, 2024
2 parents b098864 + e12fbb5 commit a150949
Show file tree
Hide file tree
Showing 15 changed files with 188 additions and 186 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
Member member = jwtTokenProvider.getMember(token);
AuthenticationUtil.makeAuthentication(member);

log.info("Security Context에 '{}' 인증 정보를 저장했습니다, uri: {}", member.getSocialId(), requestURI);
log.info("Security Context에 '{}' 인증 정보를 저장했습니다, uri: {}", member.getMemberId(), requestURI);
}

filterChain.doFilter(request, response);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
Expand All @@ -13,19 +12,9 @@
import soongsil.kidbean.server.auth.dto.AuthUser;
import soongsil.kidbean.server.member.domain.Member;

@RequiredArgsConstructor
@Component
public class AuthenticationUtil {

public static Authentication getAuthentication(AuthUser authUser) {

List<GrantedAuthority> grantedAuthorities = authUser.roles().stream()
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());

return new UsernamePasswordAuthenticationToken(authUser, "", grantedAuthorities);
}

public static void makeAuthentication(Member member) {
// Authentication 정보 만들기
AuthUser authUser = AuthUser.builder()
Expand All @@ -39,4 +28,12 @@ public static void makeAuthentication(Member member) {
Authentication auth = AuthenticationUtil.getAuthentication(authUser);
SecurityContextHolder.getContext().setAuthentication(auth);
}

private static Authentication getAuthentication(AuthUser authUser) {
List<GrantedAuthority> grantedAuthorities = authUser.roles().stream()
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());

return new UsernamePasswordAuthenticationToken(authUser, "", grantedAuthorities);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@
public class ImageQuizScorer implements QuizScorer {

private final QuizScoreRepository quizScoreRepository;

@Override
public Long addPerQuizScore(SolvedQuizInfo solvedQuizInfo, Member member) {
QuizScore quizScore = quizScoreRepository.findByMemberAndQuizCategory(member, solvedQuizInfo.category())
.orElseGet(() -> quizScoreRepository.save(
QuizScore.makeInitQuizScore(member, solvedQuizInfo.category())));

QuizScore updateQuizScore = quizScore.addScore(solvedQuizInfo.score())
.addCount(solvedQuizInfo.isExist());
QuizScore updateQuizScore = quizScore.addScore(solvedQuizInfo.score()).addCount();
quizScoreRepository.save(updateQuizScore);

return solvedQuizInfo.score();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@
@Service
@Transactional
@RequiredArgsConstructor
public class WordQuizScorer implements QuizScorer{
public class WordQuizScorer implements QuizScorer {

private final QuizScoreRepository quizScoreRepository;

@Override
public Long addPerQuizScore(SolvedQuizInfo solvedQuizInfo, Member member) {
QuizScore quizScore = quizScoreRepository.findByMemberAndQuizCategory(member, solvedQuizInfo.category())
.orElseGet(() -> quizScoreRepository.save(
QuizScore.makeInitQuizScore(member, solvedQuizInfo.category())));

QuizScore updateQuizScore = quizScore.addScore(solvedQuizInfo.score())
.addCount(solvedQuizInfo.isExist());
QuizScore updateQuizScore = quizScore.addScore(solvedQuizInfo.score()).addCount();
quizScoreRepository.save(updateQuizScore);

return solvedQuizInfo.score();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,43 +38,15 @@ public SolvedQuizInfo solveQuiz(QuizSolvedRequest solvedRequest, Member member)
.orElseThrow(() -> new ImageQuizNotFoundException(IMAGE_QUIZ_NOT_FOUND));
QuizSolved imageQuizSolved = solvedRequest.toQuizSolved(imageQuiz, member);

if (imageQuizSolvedExists(imageQuiz, member)) {
return solveExistingImageQuizSolved(imageQuizSolved, imageQuiz);
} else {
return solveNewImageQuiz(imageQuizSolved, imageQuiz);
}
}

private Boolean imageQuizSolvedExists(ImageQuiz imageQuiz, Member member) {
return quizSolvedRepository.existsByImageQuizAndMember(imageQuiz, member);
return solveNewImageQuiz(imageQuizSolved, imageQuiz);
}

private SolvedQuizInfo solveNewImageQuiz(QuizSolved newQuizSolved, ImageQuiz imageQuiz) {

newQuizSolved.setAnswerIsCorrect(newQuizSolved.getReply().contains(imageQuiz.getAnswer()));
quizSolvedRepository.save(newQuizSolved);

return newQuizSolved.getIsCorrect() ? new SolvedQuizInfo(imageQuiz.getQuizCategory(),
getPoint(imageQuiz.getLevel()), false) : new SolvedQuizInfo(imageQuiz.getQuizCategory(), 0L, false);
}

private SolvedQuizInfo solveExistingImageQuizSolved(QuizSolved newQuizSolved, ImageQuiz imageQuiz) {

Member member = newQuizSolved.getMember();
boolean exCorrect = quizSolvedRepository.existsByImageQuizAndMemberAndIsCorrect(imageQuiz, member, true);
//이번에 정답을 맞췄는지 확인
boolean isCorrect = newQuizSolved.getReply().contains(imageQuiz.getAnswer());

//푼 QuizSolved 등록
newQuizSolved.setAnswerIsCorrect(isCorrect);
quizSolvedRepository.save(newQuizSolved);

//이전에 오답이었고 현재 정답인 경우
if (!exCorrect && isCorrect) {
return new SolvedQuizInfo(imageQuiz.getQuizCategory(), getPoint(imageQuiz.getLevel()), true);
} else { //이전에 정답인 경우 or 둘 다 오답인 경우
return new SolvedQuizInfo(imageQuiz.getQuizCategory(), 0L, true);
}
return !newQuizSolved.getIsCorrect() ? new SolvedQuizInfo(imageQuiz.getQuizCategory(), 0L)
: new SolvedQuizInfo(imageQuiz.getQuizCategory(), getPoint(imageQuiz.getLevel()));
}

private static Long getPoint(Level level) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,44 +38,15 @@ public SolvedQuizInfo solveQuiz(QuizSolvedRequest solvedRequest, Member member)
.orElseThrow(() -> new WordQuizNotFoundException(WORD_QUIZ_NOT_FOUND));
QuizSolved wordQuizSolved = solvedRequest.toQuizSolved(wordQuiz, member);

if (wordQuizSolvedExists(wordQuiz, member)) {
return solveExistingWordQuizSolved(wordQuizSolved, wordQuiz);
} else {
return solveNewWordQuiz(wordQuizSolved, wordQuiz);
}
}

private Boolean wordQuizSolvedExists(WordQuiz wordQuiz, Member member) {
return quizSolvedRepository.existsByWordQuizAndMember(wordQuiz, member);
return solveNewWordQuiz(wordQuizSolved, wordQuiz);
}

private SolvedQuizInfo solveNewWordQuiz(QuizSolved newQuizSolved, WordQuiz wordQuiz) {

newQuizSolved.setAnswerIsCorrect(newQuizSolved.getReply().contains(wordQuiz.getAnswer()));
quizSolvedRepository.save(newQuizSolved);

return newQuizSolved.getIsCorrect() ? new SolvedQuizInfo(wordQuiz.getQuizCategory(),
getPoint(wordQuiz.getLevel()), false) : new SolvedQuizInfo(wordQuiz.getQuizCategory(), 0L, false);
}

private SolvedQuizInfo solveExistingWordQuizSolved(QuizSolved newQuizSolved, WordQuiz wordQuiz) {

Member member = newQuizSolved.getMember();
//이전에 맞았는지
boolean exCorrect = quizSolvedRepository.existsByWordQuizAndMemberAndIsCorrect(wordQuiz, member, true);
//정답을 포함하고 있는지
boolean isCorrect = newQuizSolved.getReply().contains(wordQuiz.getAnswer());

//푼 QuizSolved 등록
newQuizSolved.setAnswerIsCorrect(isCorrect);
quizSolvedRepository.save(newQuizSolved);

//이전에 오답이었고 현재 정답인 경우
if (!exCorrect && isCorrect) {
return new SolvedQuizInfo(wordQuiz.getQuizCategory(), getPoint(wordQuiz.getLevel()), true);
} else { //이전에 정답인 경우 or 둘 다 오답인 경우
return new SolvedQuizInfo(wordQuiz.getQuizCategory(), 0L, true);
}
return !newQuizSolved.getIsCorrect() ? new SolvedQuizInfo(wordQuiz.getQuizCategory(), 0L)
: new SolvedQuizInfo(wordQuiz.getQuizCategory(), getPoint(wordQuiz.getLevel()));
}

private static Long getPoint(Level level) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

public record SolvedQuizInfo(
QuizCategory category,
Long score,
boolean isExist
Long score
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public QuizSolved toQuizSolved(ImageQuiz imageQuiz, Member member) {
.imageQuiz(imageQuiz)
.reply(answer)
.member(member)
.isCorrect(answer.equals(imageQuiz.getAnswer()))
.build();
}

Expand All @@ -27,6 +28,7 @@ public QuizSolved toQuizSolved(WordQuiz wordQuiz, Member member) {
.wordQuiz(wordQuiz)
.reply(answer)
.member(member)
.isCorrect(answer.equals(wordQuiz.getAnswer()))
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,7 @@ public QuizScore(Member member, QuizCategory quizCategory, Long totalScore, Long
}

public static QuizScore makeInitQuizScore(Member member, QuizCategory quizCategory) {
return new QuizScore(
member,
quizCategory,
0L,
0L
);
return new QuizScore(member, quizCategory, 0L, 0L);
}

public void updateScore(Level beforeLevel, Level afterLevel) {
Expand All @@ -68,10 +63,8 @@ public QuizScore addScore(Long score) {
return this;
}

public QuizScore addCount(boolean isExist) {
if (!isExist) {
quizCount++;
}
public QuizScore addCount() {
quizCount++;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ void solveQuizzes() {
QuizSolvedRequest request =
new QuizSolvedRequest(WORD_QUIZ.getQuizId(), WORD_QUIZ.getAnswer());
SolvedQuizInfo solvedQuizInfo =
new SolvedQuizInfo(WORD_QUIZ.getQuizCategory(), Level.getPoint(WORD_QUIZ.getLevel()), false);
new SolvedQuizInfo(WORD_QUIZ.getQuizCategory(), Level.getPoint(WORD_QUIZ.getLevel()));

given(quizSolverFactory.getSolver(QuizType.WORD_QUIZ)).willReturn(wordQuizSolver);
given(wordQuizSolver.solveQuiz(request, MEMBER1)).willReturn(solvedQuizInfo);
Expand All @@ -76,8 +76,7 @@ void solveQuizzes2() {
QuizSolvedRequest request =
new QuizSolvedRequest(IMAGE_QUIZ_ANIMAL1.getQuizId(), IMAGE_QUIZ_ANIMAL1.getAnswer());
SolvedQuizInfo solvedQuizInfo =
new SolvedQuizInfo(IMAGE_QUIZ_ANIMAL1.getQuizCategory(), Level.getPoint(IMAGE_QUIZ_ANIMAL1.getLevel()),
false);
new SolvedQuizInfo(IMAGE_QUIZ_ANIMAL1.getQuizCategory(), Level.getPoint(IMAGE_QUIZ_ANIMAL1.getLevel()));

given(quizSolverFactory.getSolver(QuizType.IMAGE_QUIZ)).willReturn(imageQuizSolver);
given(imageQuizSolver.solveQuiz(request, MEMBER1)).willReturn(solvedQuizInfo);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,57 +30,14 @@ class ImageQuizSolverTest {
@Mock
private ImageQuizRepository imageQuizRepository;

@Test
@DisplayName("이미 푼 맞은 ImageQuiz 풀었을 때")
public void solveImageQuiz1() {
//given
QuizSolvedRequest request =
new QuizSolvedRequest(IMAGE_QUIZ_ANIMAL1.getQuizId(), IMAGE_QUIZ_ANIMAL1.getAnswer());

given(imageQuizRepository.findById(IMAGE_QUIZ_ANIMAL1.getQuizId()))
.willReturn(Optional.of(IMAGE_QUIZ_ANIMAL1));
//이전에 풀었던 문제
given(quizSolvedRepository.existsByImageQuizAndMember(IMAGE_QUIZ_ANIMAL1, MEMBER1)).willReturn(true);
given(quizSolvedRepository.existsByImageQuizAndMemberAndIsCorrect(IMAGE_QUIZ_ANIMAL1, MEMBER1, true))
.willReturn(true);

//when
SolvedQuizInfo solvedQuizInfo = imageQuizSolver.solveQuiz(request, MEMBER1);

//then
assertThat(solvedQuizInfo.score()).isEqualTo(0L);
assertThat(solvedQuizInfo.category()).isEqualTo(IMAGE_QUIZ_ANIMAL1.getQuizCategory());
}

@Test
@DisplayName("이미 푼 틀린 ImageQuiz 풀었을 때")
public void solveImageQuiz2() {
//given
QuizSolvedRequest request =
new QuizSolvedRequest(IMAGE_QUIZ_ANIMAL1.getQuizId(), IMAGE_QUIZ_ANIMAL1.getAnswer());

given(imageQuizRepository.findById(IMAGE_QUIZ_ANIMAL1.getQuizId())).willReturn(Optional.of(IMAGE_QUIZ_ANIMAL1));
given(quizSolvedRepository.existsByImageQuizAndMember(IMAGE_QUIZ_ANIMAL1, MEMBER1)).willReturn(true);
given(quizSolvedRepository.existsByImageQuizAndMemberAndIsCorrect(IMAGE_QUIZ_ANIMAL1, MEMBER1, true))
.willReturn(false);

//when
SolvedQuizInfo solvedQuizInfo = imageQuizSolver.solveQuiz(request, MEMBER1);

//then
assertThat(solvedQuizInfo.score()).isEqualTo(Level.getPoint(IMAGE_QUIZ_ANIMAL1.getLevel()));
assertThat(solvedQuizInfo.category()).isEqualTo(IMAGE_QUIZ_ANIMAL1.getQuizCategory());
}

@Test
@DisplayName("풀지 않은 ImageQuiz 풀었을 때")
public void solveImageQuiz3() {
public void solveImageQuiz() {
//given
QuizSolvedRequest request =
new QuizSolvedRequest(IMAGE_QUIZ_ANIMAL1.getQuizId(), IMAGE_QUIZ_ANIMAL1.getAnswer());

given(imageQuizRepository.findById(IMAGE_QUIZ_ANIMAL1.getQuizId())).willReturn(Optional.of(IMAGE_QUIZ_ANIMAL1));
given(quizSolvedRepository.existsByImageQuizAndMember(IMAGE_QUIZ_ANIMAL1, MEMBER1)).willReturn(false);

//when
SolvedQuizInfo solvedQuizInfo = imageQuizSolver.solveQuiz(request, MEMBER1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,47 +31,6 @@ class WordQuizSolverTest {
@Mock
private WordQuizRepository wordQuizRepository;

@Test
@DisplayName("이미 푼 맞은 WordQuiz 풀었을 때")
public void solveWordQuiz1() {
//given
QuizSolvedRequest request =
new QuizSolvedRequest(WORD_QUIZ.getQuizId(), WORD_QUIZ.getAnswer());

given(wordQuizRepository.findById(WORD_QUIZ.getQuizId())).willReturn(Optional.of(WORD_QUIZ));
//이전에 풀었던 문제
given(quizSolvedRepository.existsByWordQuizAndMember(WORD_QUIZ, MEMBER1)).willReturn(true);
given(quizSolvedRepository.existsByWordQuizAndMemberAndIsCorrect(WORD_QUIZ, MEMBER1, true))
.willReturn(true);

//when
SolvedQuizInfo solvedQuizInfo = wordQuizSolver.solveQuiz(request, MEMBER1);

//then
assertThat(solvedQuizInfo.score()).isEqualTo(0L);
assertThat(solvedQuizInfo.category()).isEqualTo(WORD_QUIZ.getQuizCategory());
}

@Test
@DisplayName("이미 푼 틀린 WordQuiz 풀었을 때")
public void solveWordQuiz2() {
//given
QuizSolvedRequest request =
new QuizSolvedRequest(WORD_QUIZ.getQuizId(), WORD_QUIZ.getAnswer());

given(wordQuizRepository.findById(WORD_QUIZ.getQuizId())).willReturn(Optional.of(WORD_QUIZ));
given(quizSolvedRepository.existsByWordQuizAndMember(WORD_QUIZ, MEMBER1)).willReturn(true);
given(quizSolvedRepository.existsByWordQuizAndMemberAndIsCorrect(WORD_QUIZ, MEMBER1, true))
.willReturn(false);

//when
SolvedQuizInfo solvedQuizInfo = wordQuizSolver.solveQuiz(request, MEMBER1);

//then
assertThat(solvedQuizInfo.score()).isEqualTo(Level.getPoint(WORD_QUIZ.getLevel()));
assertThat(solvedQuizInfo.category()).isEqualTo(WORD_QUIZ.getQuizCategory());
}

@Test
@DisplayName("풀지 않은 WordQuiz 풀었을 때")
public void solveWordQuiz() {
Expand All @@ -80,7 +39,6 @@ public void solveWordQuiz() {
new QuizSolvedRequest(WORD_QUIZ.getQuizId(), WORD_QUIZ.getAnswer());

given(wordQuizRepository.findById(WORD_QUIZ.getQuizId())).willReturn(Optional.of(WORD_QUIZ));
given(quizSolvedRepository.existsByWordQuizAndMember(WORD_QUIZ, MEMBER1)).willReturn(false);

//when
SolvedQuizInfo solvedQuizInfo = wordQuizSolver.solveQuiz(request, MEMBER1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,7 @@
import org.junit.jupiter.api.TestInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import org.springframework.util.StopWatch;
import soongsil.kidbean.server.global.application.config.AwsS3MockConfig;
import soongsil.kidbean.server.global.domain.S3Info;
import soongsil.kidbean.server.imagequiz.application.ImageQuizService;
import soongsil.kidbean.server.imagequiz.domain.ImageQuiz;
Expand All @@ -42,9 +40,8 @@
import soongsil.kidbean.server.member.repository.MemberRepository;

@Slf4j
@Import(AwsS3MockConfig.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@SpringBootTest
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ImageQuizTuningTest {

@Autowired
Expand Down
Loading

0 comments on commit a150949

Please sign in to comment.