ํด๋น ๊ธ์ Robert C.Martin ํด๋ฆฐ ์ฝ๋ ๋ผ๋ ์ฑ ์ ์ฝ๊ณ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌ ๋ฐ ํ๊ณ ํ๋ ๊ธ ์ ๋๋ค. ์์ธํ ์ฌํญ์ YES 24 ํด๋ฆฐ ์ฝ๋ ์์ ํ์ธํด์ฃผ์ธ์.
ํด๋ฆฐ ์ฝ๋ - ์ ์์ผ ์ํํธ์จ์ด ์ฅ์ธ ์ ์ (Uncle Bob)
- ์ํค๋ถ์ค
 - ์ง์์ด: Robert C.Martin (Uncle Bob)
 - ์ฎ๊ธด์ด: ๋ฐ์ฌํธ, ์ดํด์
 

์ด๋ฒ ์ฅ์์ ์ด์ผ๊ธฐํ๊ณ ์ ํ๋ ๊ฒ
์ฝ๋๋ ์๊ตฌ์ฌํญ์ ์์ธํ๊ฒ ํํํ๋ ์๋จ.
- ์ฐ๋ฆฌ์ ์ฝ๋์์ ์๊ตฌ์ฌํญ์ ๋๋ฌ๋ด์ผ ํ๋ค.
 
๋์ ์ฝ๋๋?
- ๋์ ์ฝ๋๊ฐ ๋์ค๋ ์ด์ 
- ๋จ์ง ๋์๊ฐ๋ค๋ ์ฌ์ค์ ์๋ํจ
 - ์ฐ๋ ๊ธฐ ์ฝ๋๊ฐ ๋ณด์ด๋ฉด ๋์๋ค๋ ์ฌ์ค์ ์ธ์งํ๊ณ ์ธ์ ๊ฐ ๊ณ ์น๋ฆฌ๋ผ ํ๊ณ ์ง๋๊ฐ
 
 - ๋์ ์ฝ๋๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋จ
- ๋์ ์ฝ๋๋ ์ผ์ ์ ๋ง์ถ๊ธฐ ์ํด ์ซ๊ฒจ ๋์ ์ฝ๋๋ฅผ ์์ฐ
 - ๋ชจ๋ ๊ฐ๋ฐ์๋ ๋์ ์ฝ๋๊ฐ ํด๊ฐ ๋๋ค๋ ๊ฒ์ ์ธ์งํ๊ณ ์์
 
 - ๊ฒฐ๊ตญ ๋์ ์ฝ๋๊ฐ ์ฆ๊ฐํ  ์๋ก ์์ฐ์ฑ์ด ์ ํ๋จ
- ๋์ ์ฝ๋๋ฅผ ๊ณ ์น๊ธฐ ์ํด ๋์ ์ฝ๋๋ฅผ ์์ฐ
 - ๊นจ์ง ์ ๋ฆฌ์ฐฝ ์ด๋ก ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊นจ์ง ์ ๋ฆฌ์ฐฝ์ด ๋ ๊นจ์ ธ๋ ์ ๊ฒฝ์ ์ฐ์ง ์์
 
 
๊นจ๋ํ ์ฝ๋๋ฅผ ์ ์งํ๊ธฐ ์ํ ํ๋๋?
- ์ผ์  ํ๊ณ, ๋น๊ฐ๋ฐ ํ์ ์๋ฐ ํ๊ณ ๋์ง ๋ง ๊ฒ
- ์ผ์  ์กฐ์จ์ ์คํจํ ๊ฒ๋ ๋์ ์ฝ๋๋ฅผ ์์ฐํ๋ ๊ทผ๋ณธ์  ์์ธ์ด ๋จ.
 - ๊ฒฐ๊ตญ ์ข์ ์ฝ๋๋ฅผ ์ฌ์ํ๋ ๊ฒ ์ญ์ง ์ฐ๋ฆฌ ๊ฐ๋ฐ์์ ๋ชซ
- ⇒ 
์ผ์ ์ ๋ถ๊ฐํญ๋ ฅ์ด๋ผ ์๊ฐํ์๋๋ฐ ์๊ฐํด๋ณด๋ ์ด ์ญ์ ๋์ ๊ฒฐ์  
 - ⇒ 
 - ์ ๋ฌธ์ฑ์ ๊ฐ์ง ๊ฒ
 
 
๊นจ๋ํ ์ฝ๋๋?
- ์ข์ ๊ฐ๋ฐ์๋ค์ด ์ ์ํ ๊นจ๋ํ ์ฝ๋
- ํ ๋ฒ์ ํ ๊ฐ์ง์ ์ง์คํ๋ค.
 - ํ ๊ฐ์ง๋ฅผ ์ ๋๋ก ํ๋ค.
 - ๋ ผ๋ฆฌ๊ฐ ๊ฐ๋จํด์ผ ๋ฒ๊ทธ๊ฐ ์จ์ด ๋ค์ง ๋ชปํ๋ค.
 - ์ค๊ณ์์ ์๋๋ฅผ ์จ๊ธฐ์ง ์์์ผ ํ๋ค.
 - ํ๋๋ง ์ ๊ณตํ๋ค.
 - ๋ฌธํ์  ์ด์ด์ผ ํ๋ค.
 - ๋จ์ ๋ช ๋ฃํด์ผ ํ๋ค.
 
 
์ฐ๋ฆฌ๋ ์ ์๋ค.
- ์ฐ๋ฆฌ๋ ์ฝ๋๋ฅผ ์ง๊ณ ๋๊ตฐ๊ฐ๋ ์ฝ๋๋ฅผ ์ฝ์ ๊ฒ์ด๋ค.
 - ๋ ์์ ์ ์ํตํ๋ ๊ฒ ์ญ์ ์ฐ๋ฆฌ์ ์ฑ ์์ด๋ค.
 
๋์ ํด์๊ณผ ํ๊ณ
๋ ์ค์ค๋ก๊ฐ ํด๋ฆฐํ ์ฝ๋๋ฅผ ์ง๋ด๊ธฐ ์ํด์ ๋ง์ ๋ ธ๋ ฅ์ ํ๊ณ ์๋ค๊ณ ์๊ฐํ๋ค.
1์ฅ์ ์ฐฌ์ฐฌํ ์ฝ๊ณ ๋ค๋ฅผ ๋์ด์ผ๋ณด๋ฉด ํด๋ฆฐํ ์ฒํ๋ ค ๋ ธ๋ ฅํ๋ ์ฝ๋๋ฅผ ๋ง์ด ์งฐ๋๊ฒ ๊ฐ๋ค.
๋ค์ ์ฃผ์๊ณผ ๊ด๋ จ๋ ์ด์ผ๊ธฐ๊ฐ ๋์ค์ง๋ง ์๋ฏธ์๋ ์ฃผ์๋ถํฐ ์์ํด์ ๊ฐ์ฅ ํฐ ๊ฒ์ ํ ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง ์ผ์ ํ๋ ค๋ ๊ฒฝํฅ์ด ์ฝ๋ ๊ณณ๊ณณ์ ์จ์ด์๊ธฐ ๋๋ฌธ์ ํ ๊ฐ์ง๋ฅผ ๋ช ํํ ํ์ง ๋ชปํ๋๊ฒ ๊ฐ๋ค.
์ธ์ ๊ฐ ๊ณ ์น๋ฆฌ๋ผ

์์ ์ฝ๋๋ ์ ๋์๊ฐ๋ค๋ ์๋๊ฐ์ผ๋ก ์ธํด์ ์ธ์ ๊ฐ ๊ณ ์น๋ฆฌ๋ผ ํ๋ฉฐ ์ ๋ ๊ณ ์น์ง ์์๋ ๋์ ๊ณผ๊ฑฐ๋ฅผ ๋ณผ ์ ์๋ค..
ํ ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๋ฅผ ๊ทธ๋ฅ ํ๋ค.
/**
 * ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฌธ์ ์ ์ ๋ต์ ์ ์ฅํ๋ค.
 *
 * @param userId : ์์ฒญ์ ๋ณด๋ธ ์ฌ์ฉ์์ userId
 * @param quizId : ์์ฒญ์ ํฌํจ๋ ํด์ฆ์ quizId
 * @param request : ์ฌ์ฉ์์ ์ ๋ต ๋ฐ์ดํฐ
 * @param tokenUserId : ์์ฒญ์ ๋ณด๋ธ ์ฌ์ฉ์์ userId
 */
public void solveEvaluationQuiz(Long userId,
                                Long evaluationId,
                                Long quizId,
                                SolveQuizRequestData request,
                                Long tokenUserId) {
    if(!userId.equals(tokenUserId)) { // ์ ์ถํ๋ userId ์ ์ ์ฅํ๋ ค๋ userId ๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ
        throw new AuthenticationFailedException();
    }
    boolean isMember = evaluationUserRepository.existsByEvaluationIdAndUserId(evaluationId, userId);
    if(!isMember) {
        throw new AuthenticationFailedException();
    }
    boolean evaluationExist = evaluationRepository.existsById(evaluationId);
    if(!evaluationExist) {
        throw new NotFoundException("ํ
์คํธ " + evaluationId);
    }
    User user = userRepository.findById(tokenUserId).orElseThrow(
            () -> new NotFoundException("์ฌ์ฉ์ ๋ฒํธ " + tokenUserId));
    EvaluationQuiz evaluationQuiz = evaluationQuizRepository.findById(quizId).orElseThrow(
            () -> new NotFoundException("ํด์ฆ ๋ฒํธ " + quizId));
    Optional<QuizSubmit> submit = quizSubmitRepository.findByQuizIdAndUserId(quizId, userId);
    String answer = request.getAnswer();
    QuizSubmit quizSubmit;
    if(submit.isEmpty()) { // ๊ธฐ์กด์ ์ ์ถํ ์ ๋ต์ด ์๋ค๋ฉด ์๋กญ๊ฒ Submit ์ ์ ์ถ
         quizSubmit = QuizSubmit.builder()
                .answer(answer)
                .evaluationQuiz(evaluationQuiz)
                .user(user)
                .build();
    } else { // ๊ธฐ์กด์ ์ ์ถํ ์ ๋ต์ด ์๋ค๋ฉด ๊ทธ ์ ๋ต์ ์
๋ฐ์ดํธ
        quizSubmit = submit.get();
        quizSubmit.updateAnswer(answer);
    }
    quizSubmitRepository.save(quizSubmit);
}
์ด๋ ์ด์ ์ ํ๋ ํ๋ก์ ํธ์ ์๋น์ค ์ฝ๋๋ฅผ ์ ์ ๊ฐ์ ธ์จ ๊ฒ์ด๋ค.
solveEvaluationQuiz ๋ผ๋ ๋ฉ์๋๋ ๋๋์ฒด๊ฐ ๋ฌด์จ ์ผ์ ํ๋ ค๋ ๊ฒ์ธ์ง ์ ์ ์์ด๋ณด์ธ๋ค.
ํ ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง ์ผ์ ํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ์ค์ง์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์ด ๊ฐ์ถ์ด์ ธ ์์๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ์ฝ๋์ 2/3 ์ด validation ํ๋๋ฐ ์งํ๋๊ณ ์๊ณ ์ค์ง์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ์ ์ผ ์๋์ 6 ~ 8 ์ค ๋ฟ์ด ๋์ง ์๋ ๊ฒ์ ์ ์ ์๋ค.
										
									
										
									
										
									
										
									
๋๊ธ