30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
sql 줄바꿈
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 완전 강의 내용은 아닌데... sql 자동 줄바꿈 format_sql: true하면 되는 거 아닌가요...? 왜 저는 안 될까요?
- 미해결실전! Querydsl
Querydsl select coalesce enum
users.authority 는 enum 입니다. queryFactory .select(users.authority.coalesce(UserAuthority.None) ~ authority 값이 null 이면 None 값을 넣어서 값을 반환하고 싶습니다. 근데 No enum constant ~ 하면서 에러가 나네요 아마 select 할 때 authority 가 null 값인데 enum 에는 null 이 없어서 그런거 같은데요 어떻게 해결할 수 있을까요??
- 미해결실전! Querydsl
Dto inner class에서의 사용..
안녕하세요 토이프로젝트에서 저는 Dto 양이 많아져서 Dto inner class 를 사용하고있는데 @QueryProjection 선언이 안됩니다 순수한 DTO에서만 사용하고, DTO inner class 내부에서는 사용 못 하나요?? public class ReviewDto { @Getter @Setter @ToString @QueryProjection public static class ReviewsForAdminSearch { private Long id; private String clubName; private Integer yearMonthNum; private String badge; private String bookName; } }
- 미해결실전! Querydsl
queryDsl vs @Query
안녕하센요 @Query를 사용해서 쿼리 사용하는것과 QueryDsl의 어떤 차이가 있는지 성능상 어떤면이 좋은지 알고 싶습니다
- 미해결실전! Querydsl
연관관계 없는 엔티티 외부 조인과 각각의 테이블 조회 2번 해서 비교하는 것에대한 질문 드립니다.
안녕하세요 늘 좋은 강의와 댓글 달아주셔서 감사드립니다. 이해하기 쉽도록 케이스를 적었습니다 1. 토론리뷰 테이블과 마일리지 테이블이 연관관계 없이 존재한다고 가정2. 토론리뷰 테이블의 id가 마일리지 fkey 컬럼에 존재할 경우 마일리지 지급 상태 O 이라는 가정입니다 ^^.. 저 같은 경우는 연관관계가 없을때 외부 조인 사용하는 경우는 여러 쿼리를 날리는 것이 아닌 한 번에 처리 해서 속도 향상을 위해서 연관관계가 없는 외부 조인을 사용한다고 이해했습니다 (왜냐하면 토론리뷰 조회 쿼리와, 마일리지 전체 조회 쿼리를 가져와서 id = fkey 비교하는것보다 연산 속도가 빠를거라고 추측..) 그런데 Tuple 타입으로 변환되는 외부 조인을 사용할 경우는 service와 controller까지 넘어가지 않도록 repository내에서 값을 변환, 처리한 다음 넘기라고 하셨는데 그렇게 될 경우 Repository에서 값을 빼내기 위해 for문을 돌아야하거나, 어쩔수없이 Controller로 데이터를 넘겼다면 프론트 단으로 데이터를 보낸 다음, 프론트에서 for문을 돌아 회원 id가 있는 경우와 마일리지의 fkey가 존재하는 경우를 조회해서 마일리지 지급 유무를 체크할 수 밖에 없지 않나 ?? 라는 생각이 듭니다...ㅠㅠㅠ 결국은 for문을 사용해야해서 속도적으로 어떤 이점이 있을까 라는 생각이 들어 질문하게 되었습니다. 이렇게 연관관계가 맺어져있지 않을 경우는 타입이 Tuple일 수 밖에 없는데 이렇때 어떤 방식으로 접근하는게 올바른 방법일지 질문드립니다 감사합니다!! 혹은 .. Tuple 타입 데이터를 어떻게 다뤄야 할까요..??? ㅠ
- 미해결실전! Querydsl
@QueryProjection 추가 후 빌드시 에러
안녕하세요 강의 완강 후 차근차근 프로젝트에 적용해보고있는데요 QueryProjection 어노테이션을 추가하면 빌드 실패가 되고 있는데 어떤 부분을 찾아봐야할까요? 감사합니다
- 미해결실전! Querydsl
subquery를 여러개 사용을 할려고 합니다.
아래와 같이 게시판 테이블과 게시판의 코맨트 테이블과 게시판의 좋아요 테이블의 3개의 테이블로 구성이 되어 있습니다. 여기서 게시판의 아이디와 게시판의 아이디 별로 코맨트의 갯수와 카운트의 갯수를 뽑아와서 코맨트 갯수 + 카운트 갯수의 순으로 게시판을 정렬을 할려고 하는데 querydsl에서 아래와 같이 서브쿼리를 사용을 하면 오류가 나는데.. 이럴 경우에는 어떤 식으로 해결을 하면 좋을까요? queryFactory.select(board.id, JPAExpressions.select(boardComment.count()) .from(boardComment) .where(boardComment.boardId.eq(board.id)) + JPAExpressions.select(boardLike.count()) .from(boardLike) .where(boardLike.board.id.eq(board.id)) ) .from(board) .fetch();
- 미해결실전! Querydsl
다대다 Projeciton
영한님 안녕하세요 혹시 저번에 강의하셨던 것 중에 order -orderItem -Item 식으로 다대다 연결관계 테이블이 있었는데 만약에 Order를 조회하는데 거기에 포함되는 Item을 전부가져오려면 Projection을 어떻게하면될까요? 밤새 찾아보고 시도해봤는데 모르겠네요 답변해주시면 감사하겠습니다 ㅠㅠ
- 미해결실전! Querydsl
QueryDsl 메소드에 대한 질문있습니다.
이해를 돕기위해 코드 첨삭합니다. 대략적인 코드의 내용은 유저가 시험을 풀고 유저가 푼 문제를 긁어와서 그 문제들의 한 필드(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 ---------------------------------------------------------------------------------------- @Override public 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. 위 코드에서 지양해야 하는점이있는지.. 피드백주시면 감사하겠습니다..
- 미해결실전! Querydsl
벌크 연산 후 영속성 컨텍스트 초기화에 대해 질문이 있습니다.
말씀해주신대로 이미 영속화 되어있는 상태에서 벌크연산이을 해도 디비로 작업하고 영속성 컨텍스트와 달라져 초기화를 하라고 말씀해주셨는데요, 영속화되있는 상태에서 select를 해도 쿼리가 나가는것이 querydsl일 경우인것이고 JPA에서는 객체를 통해 가져오면 이미 캐시되어있는 데이터를 가져와 디비 쿼리도 치지 않는다고 이해해도 될까요?
- 미해결실전! Querydsl
quertdsl에서 projection을 이용해 @onetoMany dto를 내리고싶을때
프로젝션을 이용한 결과 반환을 배웠는데요, 보통 양방향일 경우 1:n 관계는 조인해서 같이 반환하고 싶을때 fetchjoin()만 이용했다가 디비상으로는 1:n 이지만 단방향인 경우에 querydsl의 projection을 이용해서 dto를 내릴순 없을까요 ? https://bbuljj.github.io/querydsl/2021/05/17/jpa-querydsl-projection-list.html 이런 예제들처럼 양방향 1:n에 대한 예제는 많이 보이는데 단방향인 경우에는 예제가 없는거같아서... 여러 시도를 해봤는데 막히고 있어 궁금합니다 jooq 같은 라이브러리를 써야하는지, querydsl로는 해결방법이 없을까요? 예를 들면 .. TeamDto { String teamName; List<MemberDTO> members; } 이런 구조를 querydsl로 바로 표현할순 없는지..
- 미해결실전! Querydsl
{0},{1},{2}에 의미를 잘 모르겟습니다.
String result = queryFactory .select(Expressions.stringTemplate("function('replace', {0}, {1}, {2})", member.username, "member", "M")) .from(member) .fetchFirst(); 1분에 강사님께서 {0},{1},{2} {}안에 있는걸 0번 1번 2번이라고 말씀하셨는데 파라미터의 무엇을 넣어주는건가요?
- 미해결실전! Querydsl
queryDsl 조회 후 service 에서 다시 N+1 호출 발생
안녕하세요. 영한님. 좋은 강의 덕분에 실무에서 잘 사용하고 있습니다. 감사합니다. 강의를 통해 습득한 queryDsl 을 실무에 적용하면서 이해가 안되는 상황이 생겨서 질문하려고 합니다. queryDsl 을 이용해서 아래처럼 promotion, promotionContent 를 조회 하고 promotion != null 경우 promotionContent 과 oneToMany 양방향 연관관계인 artBoardLink 를 조회해서 promotionContent 에 참조해주고 있습니다. 쿼리는 분명히 아래 코드 실행 시점에 의도한대로 실행이 되는데요. 디버깅을 하거나 조회된 artBoardLink 를 service 레이어에서 접근을 하게 되면 N+1 쿼리가 실행이 됩니다. 임시로 @BatchSize(size=20) 으로 N+1 쿼리 실행 횟수는 줄였지만 완벽한 해결 방법은 아닌거 같아서 질문드리러 왔습니다. 호출하는 service 레이어의 메소드에 @Transactional(readOnly=true) 도 사용중인데 ㅠ_ㅠ 분명 queryDsl 코드 실행 시점에 의도한 select 쿼리가 호출이 되는데 왜 service 레이어에서 artBoardLink 접근 시 다시 쿼리가 발생하는건가요? 해당 이슈에 대한 조언도 부탁드릴수 있을까요?
- 미해결실전! Querydsl
Querydsl select 쿼리를 이용한 join절 구성 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]QuerydslRepositorySupport를 이용해 페이징 쿼리를 작성중에 있습니다. select 쿼리에서 left join을 사용하고 있습니다. left join 절에 이미 구성하였던 select 쿼리를 넣고 on 절의 조건을 통해 쿼리를 구성하고 싶습니다. .leftjoin() 절내에 select 쿼리를 넣으면 된다고 생각했는데 leftjoin의 alias 명을 어떻게 정의해야 할지 몰라 문의 드립니다. 예) SELECT * FROM Test t1 LEFT JOIN (SELECT name FROM Test2 ) t2 ON t1.id = t2.id위와 같은 형태의 샘플 네이티브 쿼리를 querydsl을 이용해 처리하고 싶습니다. 참고할 만한 가이드가 있는지 문의 드립니다. 감사합니다.
- 미해결실전! Querydsl
멀티쓰레드 환경에서 동시성 문제 발생 하지 않나요?!! 라는거에 대해서.
EntityManger 나 JPAQueryFactory 주입 받을때 "멀티쓰레드 환경에서 동시성 문제 발생하지 않나요? 라고 궁금증이 생길수도 있습니다" 이 궁금증 자체가 왜 생기는지가 궁금합니다! 영한님께서 왜 발생하지 않는지에 대해서는 이해가 갔는데 이것이 문젭니다..
- 미해결실전! Querydsl
5:38초 질문입니다!
5:38 초 부근 member 접근 할때 get 을 쓰면 안된다고 테스트니까 그냥 진행하신다고 하셨는데 이게 어떤의미인지 설명 가능할까요? 한 entity 에 대해서 직접적으로 접근 하기 보다는 dto 같은 전달 객체를 이용해서 가지고 와야 된다. 뭐 이런 뜻인건지 좀더 설명을 듣고 싶어 질문 올립니다!
- 미해결실전! Querydsl
mysql JOIN UPDATE 관련 질문 드립니다 !
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 안녕하세요 영한님 join update 관련해서 질문드려요 https://www.inflearn.com/questions/24128 위 글을 참고 해서 where 절의 서브쿼리를 사용해서 join update를 사용하였는데요. You can't specify target table '테이블명' for update in FROM clause 라는 에러가 나서 구글링을 해보니 mysql 에서 같은 테이블에서 서브쿼리로 값을 끌어오려고 해서 나는 에러라고 하더라구요. 그래서 from 절을 한번 더 감싸는 방식으로 해결한다고 하는데 그럼 제 생각으로는 from절에 한번 더 서브쿼리를 넣어야 할 것 같은데 from 절에는 서브쿼리를 넣지 못하지 않나요? 우선 네이티브 쿼리로 처리해두긴했는데 다른 해결방법이 있나 궁금해서 질문드립니다. 늘 감사합니다.
- 미해결실전! Querydsl
몇가지 질문드립니다...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 기초, JPA1,JPA2까지 모두 수강하였지만, 제가 JPA에 대해 실무경험이 없다보니 몇가지 궁금한점이 있어서 문의드립니다... 보통 JPQL, queryDSL를 사용할 수 있을때 JPQL에서 사용하다가 동적으로 사용하기 힘들때만 queryDSL를 보통 사용하나요? 정확히 어느경우에 JPQL를 사용하고 어느 경우에 queryDSL를 사용하면 좋을지 궁금합니다.... 감사합니다..
- 미해결실전! Querydsl
JPAQueryFactory 질문
아래 첨부한 사진 처럼 JPAQueryFactory 에 @Autowired 로 빈등록을 해주었는데 에러가 나왔고 어노테이션을 빼고 영한님께서 하신 필드로 선언을 하니까 테스트가 정상 작동하였습니다. 무슨 이유인지 , 빈등록을 하지 않는 이유가 궁금합니다! @AutowiredEntityManager em;@AutowiredJPAQueryFactory queryFactory;@BeforeEachpublic void testEntity() { queryFactory = new JPAQueryFactory(em);
- 미해결실전! Querydsl
Querydsl 설정 과 빌드 질문 입니다.
영한님 강의에 나오는 other 에 compilequerydsl 을 컴파일 시키면 빌드가 성공하여 성공적으로 Q클래스가 만들어집니다. 그런데 커멘드창에서 gradlew build 를 하면 아래와 같은 에러 메세지가 나옵니다. 결국 배포를 하게 되면 build 를 해야하는데 어떻게 해결 해야할까요? 아래에 에러메세지 와 build.gradle 설정파일 첨부하였습니다 <ERROR 메세지> * What went wrong: Execution failed for task ':compileQuerydsl'. > Compilation failed; see the compiler error output for details. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. build.gradle buildscript { ext { queryDslVersion = "5.0.0" }}plugins { id 'org.springframework.boot' version '2.7.1' id 'io.spring.dependency-management' version '1.0.11.RELEASE' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java'}group = 'study'version = '0.0.1-SNAPSHOT'sourceCompatibility = '11'configurations { compileOnly { extendsFrom annotationProcessor }}repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' //querydsl 추가 implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" implementation "com.querydsl:querydsl-apt:${queryDslVersion}" //binding parameter 편하게 보기 //운영 할때에는 성능테스트 해보고 추가 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test'}tasks.named('test') { useJUnitPlatform()}//querydsl 추가 시작def querydslDir = "$buildDir/generated/querydsl"querydsl { jpa = true querydslSourcesDir = querydslDir}sourceSets { main.java.srcDir querydslDir}compileQuerydsl{ options.annotationProcessorPath = configurations.querydsl}configurations { compileOnly { extendsFrom annotationProcessor } querydsl.extendsFrom compileClasspath}//querydsl 추가 끝