Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

E-day 프로젝트 - 퀴즈 예외처리 본문

프로젝트/EFUB Eday

E-day 프로젝트 - 퀴즈 예외처리

Hannah0226 2023. 7. 24. 19:48

해야할 것!

  • 지금까진 예외를 던지기만 하고 처리를 안했다.
  • 예외가 발생한 경우 클라이언트에게 어떤 에러인지 상태 코드랑 에러 메세지 응답으로 보내도록 수정해야한다!

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));
}