공hannah부
E-day 프로젝트 - 퀴즈 예외처리 본문
해야할 것!
- 지금까진 예외를 던지기만 하고 처리를 안했다.
- 예외가 발생한 경우 클라이언트에게 어떤 에러인지 상태 코드랑 에러 메세지 응답으로 보내도록 수정해야한다!
1. 예외처리의 필요성
어플리케이션에서는 다양한 상황에서 예외가 발생할 수 있다. 사용자의 잘못된 요청, 데이터 처리 오류 드응로 인해 예외가 발생할 수 있기에 예외를 적절하게 처리해야만 어플리케이션의 안정성을 보장할 수 있다.
2. 예외처리 내용
2-1 findQuiz
- QuizService
- 입력된 'd_day'에 해당하는 퀴즈를 데이터베이스에서 조회하고, 만약 해당 날짜의 퀴즈가 존재하지 않는 경우 IllegalArgumentException 예외를 발생시켜 클라이언트에게 "해당 날짜의 퀴즈를 찾을 수 없습니다." 라는 메세지 전달
//퀴즈 내용 조회
@Transactional(readOnly = true)
public Quiz findQuiz(int d_day) {
Dday dday = Dday.fromRemainingDays(d_day);
return quizRepository.findBySubject_Dday(dday)
.orElseThrow(() -> new IllegalArgumentException("해당 날짜의 퀴즈를 찾을 수 없습니다."));
}
2-2 checkAnswer
- QuizService
- 해당 날짜의 퀴즈를 조회한 후(findQuiz 예외처리 거침) 정답 여부와 관련된 추가 작업을 수행한다.
//퀴즈 정답 확인
public boolean checkAnswer(int d_day, int optionNumber) {
Quiz quiz = findQuiz(d_day);
boolean isCorrect = quiz.isAnswerOption(optionNumber);
if (isCorrect) {
Member member = authService.getCurrentMember();
Integer subjectId = quiz.getSubject().getId();
Title title = titleRepository.findBySubjectId(subjectId)
.orElseThrow(() -> new IllegalArgumentException("해당 subject_id에 대한 타이틀을 찾을 수 없습니다."));
MemberTitle memberTitle = memberTitleRepository.findByMemberAndTitle(member, title)
.orElseThrow(() -> new IllegalArgumentException("해당 멤버 타이틀을 찾을 수 없습니다."));
MemberQuiz memberQuiz = memberQuizRepository.findByMemberAndQuiz(member, quiz)
.orElseThrow(() -> new IllegalArgumentException("해당 멤버 퀴즈를 찾을 수 없습니다."));
//member level+1
if (!memberTitle.getGetTitle()) {
member.setLevel(member.getLevel() + 1);
}
//MemberTitle의 getTitle값 true로 변경
memberTitle.setGetTitle(true);
//MemberQuiz의 isCorrect 값 true로 변경
memberQuiz.setIsCorrect(true);
}
return isCorrect;
}
- QuizController
- checkAnswer 메소드를 호출하고, 예외가 발생한 경우 상태 코드와 함께 예외 메세지들을 응답으로 전송한다.
- 정상적인 경우에는 정답 여부와 퀴즈 설명을 함께 QuizQnswerResponseDto 형태로 클라이언트에게 반환한다.
//퀴즈 정답 확인
@PostMapping
public ResponseEntity<QuizAnswerResponseDto> checkAnswer(
@PathVariable int dDay,
@RequestBody QuizRequestDto quizRequestDto
) {
boolean isCorrect;
String quizDescription = null;
try {
isCorrect = quizService.checkAnswer(dDay, quizRequestDto.getOptionNumber());
if (isCorrect) {
quizDescription = quizService.getQuizDescription(dDay);
}
} catch (IllegalArgumentException e) {
String errorMessage = e.getMessage();
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new QuizAnswerResponseDto(false, errorMessage));
}
return ResponseEntity.ok(new QuizAnswerResponseDto(isCorrect, quizDescription));
}
'프로젝트 > EFUB Eday' 카테고리의 다른 글
E-day 프로젝트 - 퀴즈 정답 확인 추가 작업 (0) | 2023.08.03 |
---|---|
E-day 프로젝트 - 퀴즈 정답 확인 API(4) (0) | 2023.07.24 |
E-day 프로젝트 - 퀴즈 정답 확인 API(3) (0) | 2023.07.23 |
E-day 프로젝트 - 퀴즈 정답 확인 API(2) (0) | 2023.07.22 |
E-day 프로젝트 - 퀴즈 정답 확인 API(1) (0) | 2023.07.20 |