공hannah부
E-day 프로젝트 - 퀴즈 내용 보기 API 본문
구현해야할 것!
- 남은 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 실행 결과
'프로젝트 > EFUB Eday' 카테고리의 다른 글
E-day 프로젝트 - 퀴즈 정답 확인 API(3) (0) | 2023.07.23 |
---|---|
E-day 프로젝트 - 퀴즈 정답 확인 API(2) (0) | 2023.07.22 |
E-day 프로젝트 - 퀴즈 정답 확인 API(1) (0) | 2023.07.20 |
E-day 프로젝트 - 기획안 (0) | 2023.07.20 |
Docker 실행 및 오류 정리 (0) | 2023.07.16 |