30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
수업 예제에서 fetch join을 하지 않아도 team.name을 가져오는 이유
안녕하세요.제가 이해한 바로는, join과 fetch join의 차이가 select하는 범위의 차이라고 알고 있습니다.예를 들어,Member findMember = queryFactory .selectFrom(member) .join(member.team, team) .where(member.username.eq("member1")) .fetchOne();위 코드는 일반 join으로 team 연관관계를 조회합니다.그 결과 member 정보만 select 합니다.select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 join team t1_0 on t1_0.team_id=m1_0.team_id where m1_0.username=? 반대로 fetch join을 하면 한 번의 쿼리로 team 정보도 select문에 포함시킵니다.Member findMember = queryFactory .selectFrom(member) .join(member.team, team).fetchJoin() .where(member.username.eq("member1")) .fetchOne();select m1_0.member_id, m1_0.age, t1_0.team_id, t1_0.name, //팀 이름이 추가! m1_0.username from member m1_0 join team t1_0 on t1_0.team_id=m1_0.team_id where m1_0.username=? 여기까지 제가 이해한 게 맞다면, 질문 드립니다.강사님께서 Querydsl에서 where절 파라미터 사용하는 예제를 보여주실 때, 분명 코드는 leftJoin(), 즉 일반 join()을 사용하셨습니다.public List<MemberTeamDto> searchByWhere(MemberSearchCondition condition) { return queryFactory .select(new QMemberTeamDto ( member.id.as("memberId"), member.username, member.age, team.id.as("teamId"), team.name.as("teamName") )) .from(member) .leftJoin(member.team, team) .where( usernameEq(condition.getUsername()), teamnameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())) .fetch(); }fetch join을 사용하지 않았으니 member와 연관관계를 가진 team은 프록시 객체를 가질 것입니다. 하지만 쿼리문을 보면 마치 fetch join을 한 것처럼 select 문에 team.name을 조회하는 쿼리문이 포함되어 있습니다./* select member1.id as memberId, member1.username, member1.age, team.id as teamId, team.name as teamName from Member member1 left join member1.team as team where team.name = ?1 and member1.age >= ?2 */ select m1_0.member_id, m1_0.username, m1_0.age, t1_0.team_id, t1_0.name from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id where t1_0.name=? and m1_0.age>=? 어째서 fetch join을 하지 않았는데 한 번의 쿼리문으로 member와 team 정보를 모두 조회할 수 있는지 궁금합니다.만약 일반 join으로 가능하다면 굳이 fetch join을 사용할 이유가 없을텐데 말입니다. 감사합니다!
- 해결됨실전! Querydsl
테스트 코드 EntityManager Autowired 컴파일 에러 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]build.gradle 설정은 아래와 같이 하였습니다.빌드를 하니 build 경로에 Q타입 생성된 것을 확인했습니다.plugins { id 'java' id 'org.springframework.boot' version '3.2.1' 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' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 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') } 테스트 코드package study.querydsl; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import study.querydsl.entity.Hello; import study.querydsl.entity.QHello; import static org.assertj.core.api.Assertions.*; @Transactional @SpringBootTest class QuerydslApplicationTests { @Autowired EntityManager em; @Test void contextLoads() { Hello hello = new Hello(); em.persist(em); JPAQueryFactory query = new JPAQueryFactory(em); QHello qHello = new QHello("h"); Hello result = query.selectFrom(qHello) .fetchOne(); assertThat(result).isEqualTo(hello); } }해당 테스트 코드에서 em 부분에 컴파일 에러(Could not autowire. No beans of 'EntityManager' type found. )가 발생하고 테스트를 실행하면 아래와 같은 메세지가 출력됩니다.Execution failed for task ':test'. > There were failing tests. See the report at: file:///C:/Users/user/OneDrive/%EB%B0%94%ED%83%95%20%ED%99%94%EB%A9%B4/querydsl/build/reports/tests/test/index.html * Try: > Run with --scan to get full insights. Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/8.5/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD FAILED in 3s 4 actionable tasks: 3 executed, 1 up-to-date인텔리제이 종료 후 .idea 파일 삭제후 프로젝트 다시 실행해도 동일한 상황이어서 질문 드립니다. Gradle 버전은 8.5입니다.https://android-developer.tistory.com/entry/%ED%95%B4%EA%B2%B0-Deprecated-Gradle-features-were-used-in-this-build-making-it-incompatible-with-Gradle-80-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4해당 링크 방법도 해보았지만 동일한 상황입니다.
- 해결됨실전! Querydsl
강사님 Pageable->OrderSpecifier 변환 질문이 있습니다.
강의는 스프링 데이터 페이징 활용 3 - 컨트롤러 개발시간은 6:33코드는for (Sort.Order o : pageable.getSort()) { PathBuilder pathBuilder = new PathBuilder(member.getType(), member.getMetadata()); query.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC : Order.DESC,pathBuilder.get(o.getProperty()))); List<MemberTeamDto> content = query.fetch(); }루트 엔티티가 현재는 member 입니다. 직접 테스트해보고 싶어서 임의의 엔티티 user를 만들고 left join으로 묶었습니다@Override public Page<MemberTeamDto> searchPageComplex(MemberSearchCondition condition, Pageable pageable) { JPAQuery<MemberTeamDto> query = factory .select(new QMemberTeamDto( member.id, member.username, member.age, team.id, team.name, user.name)) .from(member) .leftJoin(member.team, team) .leftJoin(user).on(team.id.eq(user.id)) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()); JPAQuery<Long> countQuery = factory .select(member.count()) .from(member) .leftJoin(member.team, team) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())); for (Sort.Order order : pageable.getSort()) { PathBuilder pathBuilder; if (order.getProperty().equals("name")) { pathBuilder = new PathBuilder<>(user.getType(), user.getMetadata()); } else { pathBuilder = new PathBuilder<>(member.getType(), member.getMetadata()); } query.orderBy(new OrderSpecifier(order.isAscending()? Order.ASC:Order.DESC,pathBuilder.get(order.getProperty()))); } List<MemberTeamDto> content = query.fetch(); return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne); }left join user를 추가하고 조건은 user.id = team.id 로 했습니다.http://localhost:8080/v2/members?page=0&size=3&sort=name,asc&sort=username,asc실행되는 SQL은select m1_0.member_id, m1_0.username, m1_0.age, m1_0.team_id, t1_0.name, u1_0.name from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id left join users u1_0 on m1_0.team_id=u1_0.id order by u1_0.name, m1_0.username limit 0,3;단순한 경우에는 상관이 없지만 조인하는 경우에는 동작을 잘 안한다고 설명을 해주셔서 간단하게 테스트를 해봤는데 동작을 하더라구요 강의 이후에 오류가 수정되어 해결이 된건지 아니면 제가 테스트를 잘못한걸까요?아니면 강사님께서 말씀하신 경우가 이 경우가 아닌 걸까요 ?
- 해결됨실전! Querydsl
querydsl Projection 성능 문제
안녕하세요 Querydsl Projection 을 활용해 DTO에 담는경우 성능 관련 질문이 있습니다. Querydsl에서 Projections.constructor를 활용해서 query를 작성하는경우 fetchJoin이 되지 않더라구요.일대 다 관계에서 fetchJoin을 하지 않게되면 n+1 이슈가 발생할거 같은데Projections을 활용하는 환경에서 성능개선은 어떻게 해야할까요?
- 해결됨실전! Querydsl
stringTemplate("...") 은 어떻게 찾으신건가요?
공식 문서 5.0.0 버전을 봐도 stringTemplate이나 function에 대한 소개가 없더라구요 이렇게 공식문서에서 찾을 수 없는 내용을 강사님께서는 어떻게 찾으시는지 궁금합니다.
- 미해결실전! Querydsl
BooleanBuilder 사용 방법에 대해서
private BooleanBuilder searchName(String name) { if (name == null || name.isBlank()) { return new BooleanBuilder(); } return new BooleanBuilder(QMember.member.username.eq(name)); } private BooleanBuilder searchAge(Integer age) { if (age == null) { return new BooleanBuilder(); } return new BooleanBuilder(QMember.member.age.eq(age)); } private BooleanBuilder allCond(String username, Integer age) { return searchName(username).or(searchAge(age)); } @DisplayName("BooleanBuilder 연속 사용") @Test void pr2(){ //given em.persist(new Member("둘리",15)); em.persist(new Member("또치",20)); em.flush(); em.clear(); QMember member = QMember.member; List<Member> findMember = queryFactory .select(member) .from(member) .where(searchName("name").and(searchAge(null)).and(searchAge(15))) .fetch(); System.out.println("findMember = " + findMember); }null 여부에 따라 Expression을 추가하거나 new BooleanBuilder를 반환하면and나 or일 경우 내부에서 합치거나 치환하는 방식을 통해 최종 BooleanBuilder를 사용할 수 잇더라구요public BooleanBuilder or(@Nullable Predicate right) { if (right != null) { if (predicate == null) { predicate = right; } else { predicate = ExpressionUtils.or(predicate, right); } } return this; }이렇게 사용하는 방법은 BooleanExpression을 사용하면 null 체크를 해야하는데따로 기존에 있는 메소드에서 null을 체크해야주기 때문에 좋을 거같은데단점은 매번 쿼리를 실행할 때마다 저 많은 조건문이 실행되니까 비효율적일까요 ?
- 미해결실전! Querydsl
paging2는 어떤식으로 수정해야되는 건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]paging2에서 Deprecated된 fetchResults를 통해 전체 값 리밋값 옵셋 값 결과 개수 값을 다 구하는데 이제는 어떤식으로 해야되나요? 그냥 getTotal의 경우 count 를 통해 얻어올 수 있는데 나머지 값들은 어떻게 처리해야되나요?
- 미해결실전! Querydsl
gradle compileQuerydsl 안뜸
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]build.gradle에 작성을 했습니다.plugins { id 'java' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' } group = 'study' version = '0.0.1-SNAPSHOT' 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' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 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') } GradlecompileQueryDsl이 존재하지 않습니다. 라이브러리로는 추가가 되어 있습니다어떻게 해결해야 할까요??
- 미해결실전! Querydsl
OrderRepository 변환
기존 jpashop에서 사용했던 MemberRepository는 querydsl을 사용하여 변환하는 과정을 강의를 보며 공부하였는데, OrderRepository에서 findAllByString와 findAllByCriteria를 querydsl을 이용하여 변환하는 강의는 어디를 보면 되나요??
- 미해결실전! Querydsl
RequestDto에서 요청값으로 받는 Enum에 조건식 또는 정렬 기준을 포함하는거에 대해서 어떻게 생각하시나요?
안녕하세요! 저는 7월부터 스타트업에서 JAVA기반으로 Spring과 Jpa를 활용하여 백엔드 개발자를 하고 있습니다! 다름이 아니라, 조회 로직에서 다양한 필터링 조건을 걸어야 하는 요구사항을 맡게 되었습니다. 이때 결론적으로 Enum의 필드로 조건식(BooleanExpression) 또는 정렬 조건(OrderSpecifier)를 가지고 있는걸 어떻게 생각하시는지 의견을 여쭙고 싶습니다!(제가 GPT에게 물어보았을 때는, 좋은 방법이나, Enum이 데이터 접근 계층에 의존적이게 된다는 단점을 지적받았습니다.)@Getter @RequiredArgsConstructor public enum ItemSortCriteria { ITEM_PRICE_ASC("상품 가격기준 오름차순 정렬", QItem.item.price.asc()), ITEM_PRICE_DESC("상품 가격기준 내림차순 정렬", QItem.item.price.desc()); private final String description; private final Orderspecifier orderSpecifier; } 제가 예전에 접했던 코드 중 하나라 문득 생각이 들었는데요,올바른 판단인지 / 아닌지 판단하기가 어려워서 질문 드립니다! 나아가 영한님 혹은 답변해주신 분들 께서는, 이렇게 든 생각이 올바른 판단인지 아닌지를 어떤 기준을 가지고 판단하시는지 그 사고의 흐름도 궁금합니다!
- 미해결실전! Querydsl
Library source does not match for class 에러
스프링 부트 3에서 작업 중입니다. 교안을 보고 build.gradle 설정했는데 유레카랑 오픈페인 의존성에 에러가 뜨더라구요.. 왜인지는 모르겠으나 구글링을 통해서 아래와 같이 설정했는데 이것과 관련이 있을까요? 구버전 query dsl이 심어진 건지,, 이 에러의 원인을 못 찾겠습니다.파일 설정을 src/main/아래로 둔 이유는 src파일 외에는 경로 설정을 따로해도 못 찾아서입니다 ㅜ
- 미해결실전! Querydsl
왜 getPage 할 때 람다식은 경고를 주는데, 더블콜론은 경고를 주지 않나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]()->countQuery.fetchOne() 이나countQuery::fetchOne()나 똑같다고 생각했는데 아닌가요?
- 해결됨실전! Querydsl
@Transactional과 @PostConstruct를 나눈 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]@PostConstruct나 @Transactional이나 둘 다 프록시인데,프록시는 보통 외부에서 호출을 하면 가로채서 먼저 프록시 메소드를 실행하고 넘겨주는데, 저거는 둘 다 프록시라 뭐를 해야할 지 몰라서? 프록시 메소드는 하나만 실행되서? 같이 쓰지 않는건가요?
- 해결됨실전! Querydsl
allEq() 만들기
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]allEq를 만들기 위해서, private BooleanExpression allEq(MemberSearchCondition condition){ return usernameEq(condition.getUsername()) .and(teamNameEq(condition.getTeamName())) .and(ageGoe(condition.getAgeGoe())) .and(ageLoe(condition.getAgeLoe())); }이런 식의 코드를 만들기 위해서는 null 대신 빈 표현식을 반환해야 하는데, new BooleanExpression()은 안되는 모양이예요.그래서 찾아봤더니,null 대신 Expressions.TRUE를 중립조건으로 반환하게 하는거예요.근데 이러면 나가는 쿼리가, /* select member1.id, member1.username, member1.age, team.id, team.name from Member member1 left join member1.team as team where true and team.name = ?1 and true and true */ select m1_0.member_id, m1_0.username, m1_0.age, m1_0.team_id, t1_0.name from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id where true and t1_0.name=? and true and true이렇게 true로 섞여서 나가지만, 저런 것들은 DB내에서 최적화 해줘서 문제가 없다고 해요. 근데 아무래도 익숙하지 않은 상황에서는 다른 분이 보았을 때 저게 뭐지? 왜 저 쿼리가 나가지? 라는 생각을 할 것 같아요.그런데, 저 and true를 보고 아, 동적 쿼리를 사용했나? 라고 생각할 수 있는 사람끼리 본다면 굉장히 괜찮은 방법 같아요. 근데 여튼간에 보여지는 것 자체에는 의미없는 쿼리가 나가는 거라서, 유지보수 면에서 좀 그럴 것 같다는 생각이 들어서요.실무에서는 어떤가요?
- 해결됨실전! Querydsl
이제는 DB의 function을 등록하지 않아도 쓸 수 있지 않나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]하이버네이트 6 오면서 바뀌었다고 기억하고 있었는데..
- 해결됨실전! Querydsl
searchSimple 에 관한 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Override public Page<MemberTeamDto> searchPageSimple(MemberSearchCondition condition, Pageable pageable) { List<MemberTeamDto> content = queryFactory .select(new QMemberTeamDto( member.id, member.username, member.age, team.id, team.name )) .from(member) .leftJoin(member.team, team) // where 방식이 더 좋은 이유는 무엇일까? 재사용성이 좋아진다. 이게 가장 큰 객체지향의 특징인데 이걸 이용할 수 있음! .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); int totalSize = content.size(); log.info("total size = " + totalSize); return new PageImpl<>(content, pageable, totalSize); }serachSimple을 아래와 같이 작성하였습니다.fetchResults가 deprecated 되어서 이렇게 작성하였는데postman에서 실행결과 total 페이지가 들어간 수로만 나옵니다.이유를 알 수 있을까요??
- 해결됨실전! Querydsl
[질문X] fields 방식이 private이여도 주입이 되는 이유
저도 잠깐 생각해봤는데,이 Projections.fields라는 건 리플렉션 방식을 이용한다고 함.뭔지는 잘 모르겠으나, 객체의 구체적인 타입을 알지 못하더라도 해당 객체의 멤버변수, 메서드 등에 접근할 수 있도록 해주는 자바의 기능이라고 함.생각해보면 private 하는 게 정말로 다른 객체에서 절대로 접근하지 못하게 할거야! 라기 보다는 유지보수, 축약하자면 캡슐화를 위해 함. 근데, 필드에 주입 할 수 있다는 것 자체가, 주입할 판이 있어야 함. 주입할 객체가 있어야 함. 그래서 비어있는 생성자가 필요한 듯.
- 해결됨실전! Querydsl
왜 메소드 이름이 bean인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]저는 bean이라 하면 뭐에 의해 관리되는 하나하나 개개의 단위? 라고 생각했어요. 스프링 빈.영속성 컨텍스트에 의해 관리되는 엔티티들도 약간 그런 느낌으로.. 근데 여기서 bean이라는 메소드 명을 들으니 뭐라고 생각해야 될 지 모르겠어요.
- 해결됨실전! Querydsl
[질문 X] 스프링 부트 3.2 QueryDSL gradle 설정
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]plugins { ...... // QueryDSL 관련 명령어 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } dependencies { ........ //QueryDSL 종속성. implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } //QueryDSL 설정 //def generated = 'src/main/generated' def generated = layout.buildDirectory.dir("generated/querydsl").get().asFile querydsl { jpa = true querydslSourcesDir = generated } sourceSets { main.java.srcDir generated } compileQuerydsl{ options.annotationProcessorPath = configurations.querydsl } configurations { compileOnly { extendsFrom annotationProcessor } querydsl.extendsFrom compileClasspath } //def generated = 'src/main/generated'def generated = layout.buildDirectory.dir("generated/querydsl").get().asFile 이 둘의 차이는 src 폴더 안에 구현체인 Q 파일들을 넣느냐, 아니면 빌드 폴더에 넣느냐인데, 만약 이 gradle을 쓰면서 영상처럼 compileQuerydsl 하고 시작하면java: Attempt to recreate a file for type study.querydsl.entity.QTestEntity 이런 오류가 날 수 있음.그러니까, Test를 시작할 때 빌드 하면서 시작하는데, 아마도 build에 compileJava가, compileJava에 compileQuerydsl이 포함되어 있음. 그래서 이미 compileQuerydsl로 QueryDSL 파일들을 빌드 한 상태에서 시작을 하려니,저 파일을 다시 생성하려고 시도한다는 오류가 뜨는 걸로 추측됨. 근데 또 신기한게 뭔가 기록? 캐시가 남는지, QueryDSL 파일을 import 안한 상태로 뻘건줄 쭉쭉 있는 상태로 테스트 돌려서 자동으로 빌드가 따라오게끔 하면 저런 오류가 안뜸.근데 이런 아무리 알고 있는 에러이지만 저런 환경에서 코드를 짠다는 건 좀..저는 그래서 그냥 일단def generated = 'src/main/generated'여기에 Q파일을 일단 뒀다가, gitignore에 저거 등록 하고,build 할 때만 def generated = layout.buildDirectory.dir("generated/querydsl").get().asFile이걸로 바꿔놓는 걸 추천.. 저는 그렇게 했고 더 좋은 방법도 있을거임..
- 미해결실전! Querydsl
Querydsl Q클래스 생성 오류
plugins { id 'java' id 'org.springframework.boot' version '3.1.5' id 'io.spring.dependency-management' version '1.1.3' 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' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' 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" testImplementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'}tasks.named('test') { useJUnitPlatform()}clean { delete file('src/main/generated')}tasks.named('bootBuildImage') { builder = 'paketobuildpacks/builder-jammy-base:latest'}tasks.named('test') { useJUnitPlatform()}//querydsl 세팅 시def querydslDir = "$buildDir/generated/querydsl"querydsl { jpa = true querydslSourcesDir = querydslDir}sourceSets { main.java.srcDir querydslDir}configurations { querydsl.extendsFrom compileClasspath}compileQuerydsl { options.annotationProcessorPath = configurations.querydsl}인프런에서 질문 & 답변을 보고 gradle 설정했는데도 오류가 계속 발생됩니다.Build and run using : Gradle 로 변경하면 발생 되는 오류 입니다.오류 : Attempt to recreate a file for type study.querydsl.entity.QHello