QueryDsl 메소드에 대한 질문있습니다.
477
작성한 질문수 8
이해를 돕기위해 코드 첨삭합니다.
대략적인 코드의 내용은
유저가 시험을 풀고 유저가 푼 문제를 긁어와서 그 문제들의 한 필드(Temporary) 업데이트 즉,
제출한 시험문제 전체를 업데이트하는 그런코드입니다.
Service ------------------------------------------------------------------------------------------
@Transactional
@Override
public ExamMultiSubjectUpdateResponseDto updateExamTemporary(Long courseUserSeq,Long examSeq) {
CourseUser courseUser = courseUserRepository.findById(courseUserSeq)
.orElseThrow(() -> new RestException(HttpStatus.NOT_FOUND, "찾을 수 없는 유저-과정 입니다. courseUserSeq = " + courseUserSeq));
Exam exam = examRepository.findBySeq(examSeq)
.orElseThrow(() -> new RestException(HttpStatus.NOT_FOUND, "일치하는 시험을 찾을 수 없습니다. examSeq=" + examSeq));
//유저가 시험보기를 누른 첫 스타트 시작시간 가져오기
// (객관식 개수가 0 일수도 있고 주관식개수가 0 일수도 있기때문에 2개의 메소드진행)
timeCheckMultiple(courseUserSeq, exam);
timeCheckSubjective(courseUserSeq, exam);
//유저-과정에 등록된 유저가 객관식, 주관식에 모든 임시데이터를 가져온다.
String tYn = "Y";
List<ExamMultipleChoiceResult> multiEntityList = examMultipleChoiceResultRepository.findAllByCourseUserSeqAndTemporaryYn(courseUserSeq,tYn);
List<ExamSubjectiveResult> subjectEntityList = examSubjectiveResultRepository.findAllByCourseUserSeqAndTemporaryYn(courseUserSeq,tYn);
//시험 테이블에 등록된 주관식 객관식 개수
Integer objCnt = exam.getObjCnt();
Integer subCnt = exam.getSubCnt();
log.info("해당과정을 듣는 유저가 입력한 객관식 = {} :: 해당과정을 듣는 유저가 입력한 등록한 주관식 = {}",multiEntityList.size(),subjectEntityList.size());
// 시험 테이블에 등록된 개수들과 유저가 입력한 개수의 조건 비교
if (multiEntityList.size() + subjectEntityList.size() == objCnt+subCnt){
ExamMultiSubjectUpdateResponseDto examMultiSubjectUpdateResponseDto = examRepository.updateTemporary(multiEntityList, subjectEntityList,courseUser);
return examMultiSubjectUpdateResponseDto;
} else if (!(multiEntityList.size() + subjectEntityList.size() > 0)){
throw new RestException(HttpStatus.BAD_REQUEST,"제출해야 할 주관식,객관식 데이터가 없습니다.");
} else {
throw new RestException(HttpStatus.BAD_REQUEST,"모든 객관식, 주관식에 답을 입력해주세요.");
}
}
QueryDsl ----------------------------------------------------------------------------------------
@Overridepublic ExamMultiSubjectUpdateResponseDto updateTemporary(List<ExamMultipleChoiceResult> multiEntityList, List<ExamSubjectiveResult> subjectEntityList, CourseUser courseUser) { //유저가 체크한 문제를 임시 상태(temporaryYn)에서 제출상태로 변경 Y 면 임시 저장상태 N 이면 제출한상태 long multi = queryFactory .update(qExamMultipleChoiceResult) .set(qExamMultipleChoiceResult.temporaryYn, "N") .where(qExamMultipleChoiceResult.in(multiEntityList)) .execute(); long subject = queryFactory .update(qExamSubjectiveResult) .set(qExamSubjectiveResult.temporaryYn, "N") .where(qExamSubjectiveResult.in(subjectEntityList)) .execute(); em.flush(); em.clear(); if (multi == 0 || subject == 0){ throw new RestException(HttpStatus.BAD_REQUEST,"시험 제출에 실패하였습니다."); } //Ip주소가 프록시나 로드밸런서를 통해 호출되는 경우 로드밸런서의 IP가 나온다 //이 경우를 방지하기 위해 X-Forwarded-For 값을 확인하고 없을 경우 getRemoteAddr()을 사용한다. HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest(); String ip = ClientsUtils.getRemoteIP(req); //유저 시험 채점 테이블 기본값 세팅 (유저가 시험 제출을하면 관리자가 어떤유저가 제출한건지 알기위함.) //유저가 이미 제출했던 시험이 있는지 검증 if (!examUserRepository.existsByCourseUserSeq(courseUser.getSeq())){ examUserRepository.save(new ExamUser(courseUser,0.0,null,"Y","N",null, LocalDateTime.now(),null,ip,null)); } else { throw new RestException(HttpStatus.NOT_FOUND,"이미 제출하셨던 시험이 있습니다."); } //위 em.flush(),em.clear() 로 인해 //ExamMultiSubjectUpdateResponseDto 에 업데이트한 쿼리가 담기지않아 새로 호출 List<ExamMultipleChoiceResult> reFindMulti = examMultipleChoiceResultRepository.findAllByCourseUserSeq(courseUser.getSeq()); List<ExamSubjectiveResult> reFindSubject = examSubjectiveResultRepository.findAllByCourseUserSeq(courseUser.getSeq()); return ExamMultiSubjectUpdateResponseDto.builder() .multiEntityList(reFindMulti) .subjectEntityList(reFindSubject) .build(); }
위 코드에서 제가 궁금한 점은 1. QueryDsl 메소드안에서 위처럼 examUserRepository(DI :: 의존성주입)를 써도되는지..혹은 서비스단에서 처리하는게 맞는지.. 2. 위 코드에서 지양해야 하는점이있는지.. 피드백주시면 감사하겠습니다..
답변 1
SpringBoot 4.X에서의 Querydsl 설정
0
122
2
querydsl 오픈소스에 대한 질문
1
86
1
예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?
0
118
1
Querydsl 6.X버전에 대해서 어떻게 생각하시나요?
0
336
2
여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요
1
77
1
fetchResults()는 더이상 권장되지 않는다는데 맞나요?
0
167
1
querydsl sum() 메서드 없어요.
0
165
2
build 디렉터리 생성
0
147
2
자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?
0
119
2
현재 Querydsl에서 from절 서브쿼리를 지원하나요?
0
97
1
오타 제보 드립니다.
0
76
2
벌크 연산과 flush, clear
0
81
1
Run As Intellij 로 변경시 Q타입 import 불가
0
91
1
QHello import하기 문제 발생
0
152
2
등록된 함수 보는법(H2Dialect) 질문
0
72
2
5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의
1
203
2
[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??
1
207
1
querydsl 설정 문제
0
225
2
quey dsl 설정부분
0
160
2
count 쿼리 관련 질문입니다!
0
77
1
stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.
0
92
1
답변부탁드리겠습니다.
0
92
2
(OrderSpecifier)관련 내용 어디있을가요
0
67
1
중급문법 벌크연산에서
0
84
2





