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 본문

프로젝트/EFUB Eday

E-day 프로젝트 - 퀴즈 내용 보기 API

Hannah0226 2023. 7. 20. 21:01

구현해야할 것!

- 남은 D-day별로 url을 나누어 해당 날의 dDay, 주제, 질문, 답 선택 리스트를 응답해야한다


ERD

 

API 명세서

  • 퀴즈 내용 보기
  • method: GET
  • URL: /quiz/{d_day}
  • Request Body: 없음
  • Success Response
{
    "dDay" : 1,
    "topic" : "이화 소식",
    "quizContent" : "이화여대 공식 색상은 __색이다",
    "optionList" : [
			{"optionId": 1, "content": "하얀색"},
			{"optionId": 2, "content": "초록색"},
			{"optionId": 3, "content": "분홍색"}
	]
}

작성한 API

1. Quiz.java

  • 퀴즈 엔티티 클래스
@Entity
@Getter
@NoArgsConstructor
public class Quiz {

    // 퀴즈 ID
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "quiz_id")
    private Long id;

    // 퀴즈 내용
    @Column(nullable = false)
    private String content;

    // 퀴즈 설명
    @Column(nullable = false)
    private String description;

    // 퀴즈 이미지 URL
    @Column(name = "image_url")
    private String imageUrl;

    // 퀴즈와 연관된 D-day 정보
    @OneToOne
    @JoinColumn(name = "d_day_id", nullable = false)
    private Subject subject;

    // 퀴즈의 선택지 리스트
    @OneToMany(mappedBy = "quiz")
    private List<Options> optionsList;

    @Builder
    public Quiz(String content, String description, String imageUrl, Subject subject, List<Options> optionsList){
        this.content=content;
        this.description=description;
        this.imageUrl=imageUrl;
        this.subject=subject;
        this.optionsList=optionsList;
    }
}

2. Options.java

  • 옵션 엔티티 클래스
@Entity
@Getter
@NoArgsConstructor
public class Options {

    // 선택지 ID
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "option_id")
    private Long id;

    // 선택지 내용
    @Column(nullable = false)
    private String content;

    // 선택지가 정답인지 여부
    @Column(nullable = false)
    private Boolean isAnswer;

    // 선택지 번호
    @Column(nullable = false)
    private int optionNumber;

    // 선택지와 연관된 퀴즈
    @ManyToOne
    @JoinColumn(name = "quiz_id")
    private Quiz quiz;

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

3. QuizRepository.java

  • 퀴즈 엔티티에 대한 데이터베이스 작업을 처리하는 레포지토리 인터페이스
    • 주어진 Dday에 해당하는 퀴즈를 조회한다.
public interface QuizRepository extends JpaRepository<Quiz, Long> {
    Optional<Quiz> findBySubject_Dday(Dday dday);
}

4. QuizService.java

  • 퀴즈 내용 조회 메서드
    • 해당 Dday에 대한 퀴즈를 조회해 반환하고, 해당 날짜가 없으면 오류메세지를 출력한다.
@Service
@Transactional
@RequiredArgsConstructor
public class QuizService {
    private final QuizRepository quizRepository;

    // 퀴즈 내용 조회
    @Transactional(readOnly = true)
    public Quiz findQuiz(int d_day) {
        Dday dday = Dday.fromRemainingDays(d_day);
        return quizRepository.findBySubject_Dday(dday)
                .orElseThrow(() -> new IllegalArgumentException("퀴즈를 찾을 수 없습니다."));
    }
}

5. QuizController

  • 퀴즈 내용 조회 메서드
    • QuizService를 통해 주어진 d_day에 해당하는 퀴즈를 조회하고, 퀴즈 정보를 dto로 변환하여 반환한다.
@RestController
@RequestMapping("/quiz/{d_day}")
@RequiredArgsConstructor
public class QuizController {
	private final QuizService quizService;

	//퀴즈 내용 조회
	@GetMapping
	@ResponseStatus(value = HttpStatus.OK)
	public QuizResponseDto findQuiz(@PathVariable int d_day) {
		Quiz quiz = quizService.findQuiz(d_day);
		return QuizResponseDto.from(quiz);
	}
}

6. OptionsResponseDto

  • 선택지 조회 요청에 대한 응답데이터를 담는 DTO
    • Options 엔티티 객체를 받아 해당 옵션의 선지들을 OptionResponseDto로 변환하여 반환한다.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class OptionsResponseDto {
    private String content;

    private OptionsResponseDto(String content){
        this.content = content;
    }

    public static OptionsResponseDto from(Options options){
        return new OptionsResponseDto(
                options.getContent()
        );
    }
}

7. QuizResponseDto

  • 퀴즈 요청에 대한 응답 데이터를 담는 DTO
    • Quiz 엔티티 객체를 받아 해당 정보를 QuizResponseDto로 변환하여 반환한다.
    • 이때 선택지 리스트는 OptionResponseDto 리스트로 변환해 가져오고, 변환된 정보로 QuizResponseDto 객체를 생성하여 반환한다.
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class QuizResponseDto {
    private int dday;
    private String topic;
    private String quizContent;
    private List<OptionsResponseDto> optionList;

    public QuizResponseDto(int dday, String topic, String quizContent, List<OptionsResponseDto> optionList){
        this.dday = dday;
        this.topic = topic;
        this.quizContent = quizContent;
        this.optionList = optionList;
    }

    public static QuizResponseDto from(Quiz quiz){
        List<OptionsResponseDto> optionList = quiz.getOptionsList()
                .stream()
                .map(OptionsResponseDto::from)
                .collect(Collectors.toList());
        
        return new QuizResponseDto(
                quiz.getSubject().getDday(),
                quiz.getSubject().getHeadline(),
                quiz.getContent(),
                optionList
        );
    }
}

Postman 실행 결과