안녕하세요! 현재 호돌맨 요절복통 개발쇼 강의를 시청하면서 토이프로젝트를 만들다가 궁금증이 생겨서 이렇게 질문드립니다. 🙇🏻🙇🏻🙇🏻🙇🏻
퀴즈
라는 기본 엔티티에 주관식
, 객관식
, 서술형
들을 JPA 상속관계(싱글테이블
)로 설정해둔 상황인데
이러한 상황에서 request
, edit
, response
클래스를 각각 자식 엔티티마다
만들어줘야하는 건지 기존 Quiz 엔티티가 사용하는 Request , Edit , Response 에 자식 엔티티들의 필드를 추가해줘야하는 건지 어느 방법으로 진행해야하는지 확실히 알 수 없어서 이렇게 질문 드립니다 🙇🏻🙇🏻🙇🏻🙇🏻🙇🏻🙇🏻🙇🏻🙇🏻🙇🏻🙇🏻🙇🏻🙇🏻
전자의 경우 컨트롤러에서 받는 파라미터가 달라서 컨트롤러 메서드 추가 → 말도 안되는 프론트엔드에서의 url 분리로 이뤄지기에 후자의 방법이 나아보이는데
만약 후자의 방법으로 할 경우 (자식 엔티티들의 필드를 추가하는 경우) 데이터 검증
을 어떻게 진행해야하는 지도 궁금합니다
ex ) 객관식 문제엔 보기 필드가 필수이기 때문에 해당 필드에 @NotBlank를 설정한다면 , 주관식이나 서술형 문제를 저장할 때 오류가 발생할 것을 보입니다.( 주관식이나, 서술형 문제엔 보기 필드 데이터가 필요 없음 )
@Entity
@Getter
@NoArgsConstructor
@DiscriminatorColumn(name = "QTYPE")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Quiz extends BaseTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "QUIZ_ID")
private Long id;
@Enumerated(EnumType.STRING)
private Category category;
private String name;
@Lob
private String answer;
@Builder
public Quiz(Category category, String name, String answer) {
this.category = category;
this.name = name;
this.answer = answer;
}
@Entity
@DiscriminatorValue("interview")
public class InterviewQuiz extends Quiz {
private String keyword;
}
@Entity
@DiscriminatorValue("multiple")
public class MultipleChoiceQuiz extends Quiz {
private String example1;
private String example2;
private String example3;
private String example4;
private String example5;
}
@Entity
@DiscriminatorValue("short")
public class ShortFormQuiz extends Quiz{
}
// QuizRequest 클래스
package com.toystudy.quiz.request;
import com.toystudy.annotation.ValidEnum;
import com.toystudy.quiz.domain.Category;
import lombok.Builder;
import lombok.Getter;
import javax.validation.constraints.NotBlank;
@Builder
@Getter
public abstract class QuizRequest {
@ValidEnum(enumClass = Category.class, message = "제대로된 카테고리가 입력되지 않았습니다.")
private Category category;
@ValidEnum(enumClass = Qtype.class, message = "문제유형이 설정되지 않았습니다.")
private Qtype qtype;
@NotBlank(message = "문제 이름이 입력되지 않았습니다.")
private String name;
@NotBlank(message = "정답이 입력되지 않았습니다.")
private String answer;
private String example1;
private String example2;
private String example3;
private String example4;
private String example5;
private String keyword;
}
// 퀴즈 저장
@PostMapping("/quizzes")
public void saveQuiz(@RequestBody @Valid QuizRequest request) {
quizService.saveQuiz(request);
}
// 퀴즈 수정
@PatchMapping("/quizzes/{quizId}")
public void updateQuiz(@PathVariable Long quizId, @RequestBody QuizEdit quizEdit) {
quizService.update(quizId,quizEdit);
}