월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
Q클래스 import 불가 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강사님이랑 서포터즈님들 강의 질문만으로도 바쁘신데 강의와 관련 없는 질문해서 죄송합니다.제가 지금 사이드 프로젝트를 진행중입니다. 그런데 querydsl을 사용하는 중 문제가 생겼습니다.혹시 제 코드를 구글 드라이브에 올리면 한번 봐주실 수 있나요? 만약 괜찮으시다면 url 올리면서 문제 상황 자세히 설명드리겠습니다.
- 미해결실전! Querydsl
JPAQueryFactory 에러
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]김영한님 강의대로 spring 3.x.x버전으로 제대로 실행을 했는데 사진처럼 에러가 발생하네요... 인텔리제이에서 file->invalidate cache-> invalidate and restart했는데도 안되네요. 제 jdk는 17입니다. 추가로 저는 Q클래스가 build/calssess안에서 생성이되고 강의와 달리 generated에는 Q클래스가 아닌 QHello.java로 생성이됩니다.plugins {id 'java'id 'org.springframework.boot' version '3.2.2'id 'io.spring.dependency-management' version '1.1.4'}group = 'midas'version = '0.0.1-SNAPSHOT'java {sourceCompatibility = '17'}configurations {compileOnly {extendsFrom annotationProcessor}}repositories {mavenCentral()}dependencies {implementation 'org.springframework.boot:spring-boot-starter-data-jpa'implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'implementation 'org.springframework.boot:spring-boot-starter-security'implementation 'org.springframework.boot:spring-boot-starter-validation'implementation 'org.springframework.boot:spring-boot-starter-data-redis'implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'implementation 'org.springframework.boot:spring-boot-starter-mail'implementation 'io.jsonwebtoken:jjwt-api:0.12.5'implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'implementation 'org.jetbrains:annotations:24.0.0'implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"annotationProcessor "jakarta.annotation:jakarta.annotation-api"annotationProcessor "jakarta.persistence:jakarta.persistence-api"runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.5'runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.5'implementation 'org.springframework.boot:spring-boot-starter-web'compileOnly 'org.projectlombok:lombok'runtimeOnly 'com.mysql:mysql-connector-j'annotationProcessor 'org.projectlombok:lombok'testImplementation 'org.springframework.boot:spring-boot-starter-test'testImplementation 'org.springframework.security:spring-security-test'}tasks.named('test') {useJUnitPlatform()}clean {delete file('src/main/generated')}
- 미해결실전! Querydsl
Q클래스 안보여요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]plugins { id 'java' id 'org.springframework.boot' version '3.2.4' id 'io.spring.dependency-management' version '1.1.4'}group = 'com.example'version = '0.0.1-SNAPSHOT'java { sourceCompatibility = '17'}configurations { compileOnly { extendsFrom annotationProcessor}}repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' testImplementation 'org.projectlombok:lombok:1.18.26' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test'}tasks.named('test') { useJUnitPlatform()}clean { delete file('src/main/generated')}clean 이후 build를 누르니 사진처럼 main패키지까지만 나오네요
- 미해결실전! Querydsl
하나의 앤티티에 일대다 매핑을 2개 이상 일 때 한꺼번에 조회하면 데이터가 뻥튀기 됩니다.
안녕하세요.제가 겪고 있는 문제에 관해서 질문드리고 싶습니다.A 라는 앤티티가 B 와 C 를 패치 조인 전략을 사용해서 일대다 양방향을 하고 있는 상황입니다.query .selectFrom(A) .leftJoin(A.B, B).fetchJoin() .leftJoin(A.C, C).fetchJoin() .where(A.id.eq(AId)) .fetchOne()위와 같이 B 와 C 를 모두 패치 조인해서 한꺼번에 조회하게 되면 B 의 데이터가 C 의 개수 만큼 뻥튀기 되는 상황이 발생합니다.이를 어떻게 해결할 수 있는지 궁금합니다.저는 각각의 앤티티를 따로 따로 조회해서 A 에 할당해준다는 방법을 떠올렸는데 이렇게 하면 A 에 setter method 를 만들어야 해서 좋은 패턴이 아니라는 생각이 들었습니다.
- 미해결실전! Querydsl
jpa와 스프링DB는 별도인건가요 ?
현재 김영한 강사님의 김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵 은 모두 수강한 상황입니다.별도로 스프링 완전 정복 로드맵을 따라가고 있는데, 로드맵상에 스프링db 강의 1,2편을 수강할지 말지 고민이 됩니다.일단 커리큘럼 상으로는 겹쳐지는 부분이 많아보여서요. 이에 대해 답변해주신다면 저에게 많은 도움이 될 거 같습니다.
- 미해결실전! Querydsl
QuerydslApplicationTests 오류 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. QuerydslApplicationTests 실행시 아래와 같은 에러가 발생합니다. HELLO_SEQ가 없다는 오류인것 같은데요H2 DB에 이걸 만들어야 한다는 의미인가요?강의 내용에는 없는 것 같아서 질문드립니다. 확인 부탁드립니다.감사합니다.
- 해결됨실전! Querydsl
Test에서 QHello.java를 못찾아요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 있는데 다 해봐도 안돼요3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네[질문 내용] springboot 3버전으로 해결 방법을 다 써봤는데 안되어서 문의드립니다.setting -> Annotaion Processorsbuild.gradleplugins { id 'java' id 'org.springframework.boot' version '3.2.4' id 'io.spring.dependency-management' version '1.1.4' } group = 'study' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') } 폴더 확인 bbuild.gradle 설정도 잘해서 build 폴더에 잘 생겼는데 Test에서 import를 못해요
- 해결됨실전! Querydsl
수업들으며 곰곰히 생각하다가 제가 생각한게 맞는지 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]동적쿼리 - builder 사용편 강의를 들으며return query .select(new QMemberTeamDto( member.id.as("memberId"), member.username, member.age, member.team.id.as("teamId"), team.name.as("teamName"))) .from(member) .leftJoin(member.team, team) .where(builder) .fetch();이 쿼리를 따라 치고 생각해보았습니다.원래 jpa라면 member객체를 조회해와서 member.getTeam()이나 팀 객체에 액세스 할때 지연로딩이 일어난다고 학습하였습니다.위 쿼리에서 fetch 조인을 사용하지 않았는데 어떻게 쿼리가 한방에 조회가 됐나 갑자기 의문이 들었습니다.제가 도출해낸 결과는 반환값이 dto이고 team 객체와 join해서 필요한 값만(team 포함) select 하기때문에 teamId, teamName까지 한방쿼리로 조회가 되는건가요?
- 미해결실전! Querydsl
토이 프로젝트를 진행하다 궁금한게 생겨서 질문드립니다
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Projection 을 사용해서 2~3번의 query 를 통해 필요한 데이터만 받아오는것과 fetch join 을 통해서 한번에 3개의 entity 전체를 받아 오는 방법중 어떤방식이 적절한지 고민되서 질문드립니다. fetch join 을 통해 쓰지않는 데이터를 받아오더라도 query가 여러번 나가는거보다 성능적으로 좋은가요?
- 미해결실전! Querydsl
MemberJpaRepositoryTest 클래스에서 MemberJpaRepository 클래스 주입 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]MemberJPARepository 클래스를 build/generated 패키지에 생성하고 테스트 클래스의 테스트를 돌리게 되면 @Autowired MemberJpaRepository memberJpaRepository; ^ symbol: class MemberJpaRepository location: class MemberJpaRepositoryTest이렇게 주입 관련한 에러가 뜹니다. 왜 이런건가요?
- 해결됨실전! Querydsl
3.2버전 gradle 설정에 대한 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.이게 현재 프로젝트 이고plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' } group = 'study' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') } //querydsl 추가 시작 def querydslDir = file('build/generated/querydsl') querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } 현재 gradle설정인데 Querydsl 설정과 검증 부분에서 막혔어요클린해서 q파일 지우고 테스트 코드 런하면 아래 에러가 나타나고error: Attempt to recreate a file for type study.querydsl.entity.QHello 이후에 q파일이 생성 된 후에는 error: Could not find class file for 'study.querydsl.entity.Hello'. 에러가 반복되네요.. https://www.inflearn.com/questions/1086099 다른분들 설정파일 따라해도 안됩니다..
- 미해결실전! Querydsl
alias를 사용한 QClass 생성 관련 질문입니다.
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] @Test void QClassAliasTest() { List<Team> result1 = commonQuery().where(builderByMemberName1()).fetch(); List<Team> result2 = commonQuery().where(builderByMemberName2()).fetch(); } private JPAQuery<Team> commonQuery() { QMember member = new QMember("member"); QTeam team = QTeam.team; return query.selectFrom(team).leftJoin(team.members, member).fetchJoin(); } private BooleanExpression builderByMemberName1() { QMember member = new QMember("member"); return member.username.eq("1"); } private BooleanExpression builderByMemberName2() { QMember member = new QMember("memberTest"); return member.username.eq("1"); } 위의 코드를 실행했을 때builderByMemberName2()를 사용한 경우는 [Could not interpret path expression 'memberTest.username'] 예외가 발생하는데commonQuery의 member와 builderByMemberName1의 member는 hashCode까지 동일해서 코드가 문제없이 실행되더라구요. 출력된 sql문도 하나의 테이블을 잘 사용하고 있구요.alias를 동일하게 주면 new 키워드를 사용하더라도 새로운 객체가 생성되는 게 아니라 기존에 있던, alias가 동일한 객체를 사용하게 되는 건가요?
- 해결됨실전! Querydsl
테스트에서 QHello 클래스를 임포트 하여 사용할 수 없습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 자료에 있는 대로 build.gradle을 작성하고 q 파일까지 생성이 되었습니다 그런데 main 폴더 아래 클래스에서는 QHello를 잘 사용할 수 있지만 테스트 클래스인 QuerydslApplicationTests에서는 사용할 수가 없습니다. 구글 드라이브에 파일을 압축해서 올렸습니다. 혹시 한번 봐주실 수 있나요? 아래는 구글 드라이브 링크입니다https://drive.google.com/file/d/1e5goKq_r3g5SeaWa2xHAmBJ_7tmmIxt_/view?usp=sharing
- 미해결실전! Querydsl
영한님의 솔직한 모습
훌륭함을 넘어 위대하다고 생각됩니다 솔직히 저는 그동안 프로그래밍에 대한 관심보단 인생에서 스스로 어려운 상황을 뚫어오신 분들을 동경심을 이어왔던 것 같습니다 그런 온라인 멘토들의 겉모습을 따라하는 걸 넘어 의존하고 사회적으로 연결되고 싶은 마음에 코딩이라는 수단에 시간과 자원을 쏟아온 것 같은데요 그동안 쏟아온 것에 비해 막상 코딩 이나 기술 자체에 대해 관심가지고 즐거운 마음을 가진지는 얼마 되지 않은 것 같아 부끄럽습니다 분수에 넘쳐보일지 모르지만 어느새 저에게는 사회적으론 '왔을 때보다 좋은 곳으로' 라는 목표. 개인적으론 앞으로 꾸준히 영한님을 돈쭐낼 수 있을만큼 성장하기 라는 목표가 생겼습니다 너무 쉽게 들떠서 일을 그르치거나 실수가 잦다는게 약점이지만 얼마나 꾸준함을 이어갈지 지켜봐주시면 감사하겠습니다 거북이마음 화이팅 화이팅
- 미해결실전! Querydsl
QueryDSL 환경 설정 질문
안녕하세요, QueryDSL 환경 설정 관련하여 질문드립니다.사진과 같이 QueryDSL 관련한 라이브러리들을 받기 위해 설정했는데요. build.gradle 새로고침을 아무리해도Gradle -> Tasks -> other -> compileQuerydsl에서 compileQuerydsl이 보이지 않습니다. 문제가 뭘까요?
- 해결됨실전! Querydsl
Querydsl 조회 시, DTO 필드를 List로 받는 방법을 알고 싶습니다.
안녕하세요.Querydsl 학습 중에 궁금한 점이 있어서 질문드립니다. Projection을 이용해서 조회 데이터를 DTO에 반환 받고 싶습니다.하지만, DTO 필드에 List 타입이 정의되어 있습니다.이런 경우에는 어떤식으로 데이터를 조회할 수 있는지 궁금합니다. 또한, 현업에서는 이런 형태의 데이터를 조회하기 위해서 어떤 방식으로 하는지 궁금합니다.객체 그래프 탐색을 이용한 Lazy 조회 후, 로직에서 조건 필터링 ?각 조건에 맞는 쿼리 여러번 호출 ?DTO Projection을 이용한 한방 쿼리 ?다른 방식 ? 조회 데이터를 반환 받기 위한 ProductDto는 다음과 같습니다.public record ProductDto( Long id, String name, int reviewScore, int reviewCount, int originalPrice, int salesPrice, List<String> productImages, List<String> productDetailImages ) { @QueryProjection public ProductDto { } } 데이터를 조회 하고자 하는 의도가 담긴 Querydsl은 다음과 같습니다.public ProductDto findSellingProductById(Long id) { return queryFactory .select(new QProductDto( product.id, product.name, product.reviewScore, product.reviewCount, productOption.originalPrice, productOption.salesPrice, productImage.imageUrl, productDetailImage.imageUrl )) .from(product) .leftJoin(product.productOptions, productOption) .on(productOption.isDefault.isTrue(), productOption.isSaleable.isTrue(), productOption.isDeleted.isFalse()) .leftJoin(product.productImages, productImage) .on(productImage.isDeleted.isFalse()) .leftJoin(product.productDetailImages, productDetailImage) .on(productDetailImage.isDeleted.isFalse()) .where(product.id.eq(id)) .fetchOne(); } Product, ProductOption, ProductImage, ProductDetailImage 엔티티는 다음과 같습니다.@Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Product extends BaseDateTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "product_id") private Long id; @Column(length = 50) private String name; private int reviewScore; private int reviewCount; // ... 중략 @OneToMany(mappedBy = "product", cascade = CascadeType.ALL) private List<ProductImage> productImages = new ArrayList<>(); @OneToMany(mappedBy = "product", cascade = CascadeType.ALL) private List<ProductDetailImage> productDetailImages = new ArrayList<>(); @OneToMany(mappedBy = "product", cascade = CascadeType.ALL) private List<ProductOption> productOptions = new ArrayList<>(); // ... 중략 } @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ProductOption extends BaseDateTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "product_option_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "product_id") private Product product; @Column(length = 30) private String name; private int originalPrice; private int salesPrice; // ... 중략 private Boolean isDefault; private Boolean isSaleable; private Boolean isDeleted; // ... 중략 } @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ProductImage extends BaseDateTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "product_image_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "product_id") private Product product; private String imageUrl; private Boolean isDeleted; // ... 중략 } @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ProductDetailImage extends BaseDateTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "product_detail_image_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "product_id") private Product product; private String imageUrl; private Boolean isDeleted; // .. 중략 } 감사합니다.
- 미해결실전! Querydsl
JPA Test Code 관련해서 질문이 있습니다.
안녕하세요.JPA와 Querydsl 학습을 위해서 테스트 코드를 작성 중에 궁금한 부분이 있어서 질문 드립니다. 조회를 위한 테스트 데이터를 save 하고, querydsl로 작성한 repository를 이용해서 데이터를 조회하여 검증하고 있습니다. 여기서 궁금한 부분은 테스트 데이터를 save 하고나서 EntityManger를 이용해서 영속성 컨텍스트를 비워주는 작업을 테스트 코드마다 해주는게 맞는지 궁금합니다. 영속성 컨텍스트를 비워주지 않고 조회하면 영속성 컨텍스트에 존재하는 데이터를 읽기 때문에 테스트가 깨집니다. 현업에서도 Repository 테스트 코드를 작성할 때, 테스트 데이터를 넣어준 후 매번 flush / clear를 해주는지 아니면 다른 Best Practice가 있는지 알고싶습니다. class ProductQueryRepositoryTest extends DomainTestSupport { @Autowired private ProductRepository productRepository; @Autowired private ProductQueryRepository productQueryRepository; @Test @DisplayName("상품 아이디로 판매중인 상품 정보를 조회한다.") void findByIdIsSaleableTrue() throws Exception { // given ProductOption appleOption1 = createProductOption("1kg", 10000, 7000, 100, 10, true); ProductOption appleOption2 = createProductOption("2kg", 20000, 15000, 100, 5, false); Product apple = createProduct("사과", false, true, appleOption1, appleOption2); productRepository.save(apple); em.flush(); em.clear(); // when Optional<Product> optionalProduct = productQueryRepository.findByIdIsSaleableTrue(apple.getId()); // then assertThat(optionalProduct).isPresent() .get() .extracting("name", "isSaleable", "isDeleted") .contains(apple.getName(), apple.getIsSaleable(), apple.getIsDeleted()); List<ProductOption> productOptions = optionalProduct.get().getProductOptions(); assertThat(productOptions).hasSize(1) .extracting("name", "originalPrice", "salesPrice", "stockQuantity", "maxOrderQuantity", "isSaleable", "isDeleted") .containsExactlyInAnyOrder( tuple(appleOption1.getName(), appleOption1.getOriginalPrice(), appleOption1.getSalesPrice(), appleOption1.getStockQuantity(), appleOption1.getMaxOrderQuantity(), appleOption1.getIsSaleable(), appleOption1.getIsDeleted()) ); } // ... 중략 } @RequiredArgsConstructor @Repository public class ProductQueryRepository { private final JPAQueryFactory queryFactory; public Optional<Product> findByIdIsSaleableTrue(Long id) { return Optional.ofNullable( queryFactory .select(product) .from(product) .leftJoin(product.productOptions, productOption) .fetchJoin() .where( product.id.eq(id), product.isSaleable.isTrue(), product.isDeleted.isFalse(), productOption.isSaleable.isTrue(), productOption.isDeleted.isFalse() ) .fetchOne() ); } } 감사합니다.
- 해결됨실전! Querydsl
Querydsl 자동 join
안녕하세요? JPA 활용 2편과 Querydsl 편을 수강하고 나서 코드를 작성하다가 알게 된 내용인데 원래 그런 것인지 알고 싶어서 여쭤봅니다.JPA 활용 2편에서 Order와 member, delivery를 한번에 조회하는 OrderSimpleApiController에서 V4를 Querydsl 버전으로 바꾸었습니다.OrderSimpleApiController.javaOrderSimpleQueryDto@Data public class OrderSimpleQueryDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; @QueryProjection public OrderSimpleQueryDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus, Address address){ this.orderId = orderId; this.name = name; // LAZY 초기화 this.orderDate = orderDate; this.orderStatus = orderStatus; this.address = address; // LAZY 초기화 } }orderSimpleQueryRepository.findOrderDtosQuerydslpublic List<OrderSimpleQueryDto> findOrderDtosQuerydsl(){ JPAQueryFactory queryFactory = new JPAQueryFactory(em); return queryFactory .select(new QOrderSimpleQueryDto( order.id.as("orderId"), order.member.name, order.orderDate, order.status, order.delivery.address) ) .from(order) .fetch(); }이렇게 V4버전을 바꿨는데, 딱히 제가 join을 날린 게 없는데 join이 날라갑니다. 오히려 제가 fetchJoin용으로 코드를 작성하려고 from절의 아랫 부분에 다른 코드를 작성하는게 불가능했습니다. join(order.delivery, order).fetchJoin() 같은 코드는 작성이 안되고 join(order.delivery).fetchJoin()은 semantic 오류라는 에러코드가 날라옵니다.Dto로 작성할 때 여러 테이블을 페치 조인해야하는 상황에서는 Querydsl을 어떻게 사용해야하나요? 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
- 미해결실전! Querydsl
테스트에서 @Commit과 @Transactional(rollback=false) 차이
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]테스트에서 DB에 반영되는 내용을 보기 위해서 @Commit을 다셨는데, 이전 강의들에서는 Transactional(rollback=false)로 그걸 수행하셨습니다. 차이가 있을까요?
- 미해결실전! Querydsl
테이블이 자동 삭제됩니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.현재 테스트 코드를 실행하면 실행은 정상적으로 작동되는데 항상 drop sequence ~~가 뜨면서 테이블에 있는 값들이 전부 삭제되는데 왜그런걸까요? ddl-auto: create상태고 @Commit에노테이션은 붙여놓은 상태입니다.