컴퓨터 공학 전공 자체 생성 문제 또는 자격증 기출 문제를 풀 수 있는 사이트

다양한 문제 유형의 확장성과 유지보수를 고려한 유연한 설계
- 전공 객관식 문제를 카테고리로 조회
@Query("SELECT DISTINCT nq FROM MajorMultipleChoiceQuestion nq "
+ "LEFT JOIN FETCH nq.questionChoices "
+ "WHERE nq.questionCategory IN :questionCategories ")
List<MajorMultipleChoiceQuestion> findAllByQuestionCategoriesFetchChoices(
@Param("questionCategories") List<QuestionCategory> questionCategories
);- 자격증 객관식 문제를 카테고리로 조회
@Query("SELECT DISTINCT lnq FROM LicenseMultipleChoiceQuestion lnq "
+ "LEFT JOIN FETCH lnq.questionChoices "
+ "WHERE lnq.questionCategory IN :questionCategories ")
List<LicenseMultipleChoiceQuestion> findAllByQuestionCategoriesFetchChoices(
@Param("questionCategories") List<QuestionCategory> questionCategories);- 문제를 조회하는 공통된 조건 (조회할 테이블에 Where 조건을 적용)
publicinterfaceSelectWhereCategoriesAndLevels<TextendsQuestion> {
defaultJPAQuery<T> selectWhereQuestionCategories(List<QuestionCategory> questionCategories) {
returngetQuestions()
.where(
whereCategories(
getQuestionQClass(),
questionCategories)
);
}
//구현체에서 Select할 문제 테이블을 설정JPAQuery<T> getQuestions();- 실제 구현체에서는 조회할 테이블만을 설정해준다.
@OverridepublicJPAQuery<LicenseMultipleChoiceQuestion> getQuestions() {
returnjpaQueryFactory.selectFrom(
QLicenseMultipleChoiceQuestion.licenseMultipleChoiceQuestion);
}- Repository에서 검색 조건을 정의하는 인터페이스를 상속하여
문제의 종류마다 어떤 조건으로 검색될 수 있는지도 쉽게 알 수 있음
@RepositorypublicclassLicenseMultipleChoiceQuestionDslRepositoryextendsQueryDslJpaQueryMaker<LicenseMultipleChoiceQuestion>
implementsSelectWhereCategoriesAndLevels<LicenseMultipleChoiceQuestion>,
�SelectWhereContent~~(추가될수있는검색조건)- 객관식 문제의 공통된 행동 정의
publicinterfaceChoiceBehavior {
List<? extendsQuestionChoice> getQuestionChoices();
}publicclassLicenseMultipleChoiceQuestionextendsQuestionimplementsChoiceBehavior@OneToMany(mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval = true)
privateList<LicenseQuestionChoice> questionChoices;
//구현체에서 각각 LicenseQuestionChoice, MajorQuestionChoice를 반환하도록 구현@OverridepublicList<LicenseQuestionChoice> getQuestionChoices() {
returnquestionChoices;
}- 객관식 문제의 공통된 Response Dto에서의 사용
publicstatic <QextendsQuestion & ChoiceBehavior> ResponseMultipleChoiceQuestionDtofrom(Qquestion) {
List<ResponseQuestionChoiceDto> questionChoices = question.getQuestionChoices()
.stream()
...
}확장성 높은 설계로 인하여 빠르게 다양한 유형의 문제를 추가 할 수 있었으며
배포 한 달만에 약 18000회 API 요청 수신

