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 프로젝트 - 퀴즈 정답 확인 API(1) 본문

프로젝트/EFUB Eday

E-day 프로젝트 - 퀴즈 정답 확인 API(1)

Hannah0226 2023. 7. 20. 21:24

구현해야 할 것!

- 옵션을 선택해 Request를 보내면 해당 옵션이 정답일시 true와 문제의 해설을 반환하고, 정답이 아닐 시 false와 null값을 보내기


API 명세서

  • 퀴즈 정답을 확인하는 api
  • URI: /quiz/{d_day}
  • RequestBody
{
    "optionId" : 2
}
  • Success Response
{
	"isAnswer" : true,
	"quizDescripiton" : "이화여자대학교의 대표 색상은 초록색, 즉 이화그린이에요! 1908년에 배꽃의 녹색 잎새를 상징하는 학교색으로 지정되었다고 합니다:)"
}
{
	"isAnswer" : false,
	"quizDescription": null
}

퀴즈 선지 번호 Column 추가 (정답 비교용)

API를 작성하기 전에 request 받은 optionId가 정답인지 아닌지 비교할 퀴즈 선지 번호 Column을 추가해 주어야 한다.

해당 엔티티는 INT 타입으로 하며, 각 퀴즈별로 옵션에  1부터 3까지 번호를 부여해 response 받는 숫자와 비교한다.

 

ERD (퀴즈선지번호 / OptionNumber 추가)

Options ERD

 

quiz_option DB

DB에 들어갈 내용


Options 엔티티

  • optionNumber 추가
@Entity
@Getter
@NoArgsConstructor
@Table(name = "quiz_option")
public class Option {

	//... (생략)

	@Column(nullable = false)
	private Integer optionNumber;

	@Builder
	public Option(String content, Boolean isAnswer, Quiz quiz, int optionNumber) {
		this.content = content;
		this.isAnswer = isAnswer;
		this.quiz = quiz;
		this.optionNumber = optionNumber;
	}
}

QuizService

  • DB에 저장되어 있는 optionNumber를 사용해 request에서 받은 option_id와 비교하여 해당 옵션의 isAnswer(정답여부)를 반환한다.
//퀴즈 정답 확인
public boolean checkAnswer(int d_day, int option_id){
	Quiz quiz = findQuiz(d_day);

	for (Options option : quiz.getOptionsList()) {
		if (option.getOptionNumber() == option_id) {
			return option.getIsAnswer();
		}
	}
}

작성한 퀴즈 정답 확인 API

1. QuizService

  • 퀴즈 정답 확인 메서드
    • 주어진 d_day에 해당하는 퀴즈를 조회 한 후, 퀴즈 선택지들을 순회하며 해당 퀴즈DB에 저장되어 있는 OptionNumber(퀴즈 선택지 번호)와 request에서 받은 option_id가 일치하는 선택지를 찾는다.
    • 일치한다면 isAnswer(정답 여부)를 반환하고, 잘못된 선택지 id인 경우 예외를 발생시킨다.
  • 퀴즈 설명 가져오기 메소드
    • 주어진 d_day에 해당하는 퀴즈를 조회한 후, 퀴즈의 설명을 반환한다.
//퀴즈 정답 확인
public boolean checkAnswer(int d_day, int option_id){
	Quiz quiz = findQuiz(d_day);

	for (Options option : quiz.getOptionsList()) {
		if (option.getOptionNumber() == option_id) {
			return option.getIsAnswer();
		}
	}
	throw new IllegalArgumentException("올바르지 않은 optionId입니다.");
}

// 퀴즈 설명 가져오기
public String getQuizDescription(int d_day) {
    Quiz quiz = findQuiz(d_day);
    return quiz.getDescription();
}

2. QuizController

  • 퀴즈 정답 확인 메서드
    • 주어진 d_day와 선택한 선택지 id를 통해 퀴즈 정답을 확인하고 정답인 경우, 퀴즈 설명을 가져온다.
    • 그 후, 퀴즈 정답 여부와 퀴즈 설명을 포함하는 응답 dto를 생성하여 반환한다.
// 퀴즈 정답 확인
@PostMapping
public QuizAnswerResponseDto checkAnswer(
        @PathVariable int d_day,
        @RequestBody QuizRequestDto quizRequestDto
) {
    boolean isCorrect = quizService.checkAnswer(d_day, quizRequestDto.getOptionId());
    String quizDescription = null;
    if (isCorrect) {
        quizDescription = quizService.getQuizDescription(d_day);
    }
    QuizAnswerResponseDto responseDto = new QuizAnswerResponseDto(isCorrect, quizDescription);
    return responseDto;
}

3. QuizRequestDto

  • 퀴즈 정답 확인 요청에 대한 요청 데이터를 담는 DTO
@Getter
@Setter
@NoArgsConstructor
public class QuizRequestDto {
    private int optionId; // 선택한 선택지의 ID
}

4. QuizAnswerResponseDto

  • 퀴즈 정답 확인 요청에 대한 응답 데이터를 담는 DTO
@Getter
@Setter
@NoArgsConstructor
public class QuizAnswerResponseDto {
    private boolean isAnswer;
    private String quizDescription;

    public QuizAnswerResponseDto(boolean isAnswer, String quizDescription) {
        this.isAnswer = isAnswer;
        this.quizDescription = quizDescription;
    }
}

Postman 실행 결과