ํด๋น ๊ธ์ 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 ์ค ๋ฟ์ด ๋์ง ์๋ ๊ฒ์ ์ ์ ์๋ค.
๋๊ธ