25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
select(member, team).from(member)
select(member, team).from(member) 이 부분이 이해가 너무 안되는데요 ㅠㅠ 이전 강의에서 selectFrom(member)를 했을 때는 멤버의 모든 필드를 조회해서 보여준다고 생각했습니다. 만약에 select(member, team)을 하게 되면, member필드와 team필드 모두 다 붙여서 보여주게 되나요? 가령, member테이블에는 id, username, team테이블에는 id,teamname이 있다면 id | username | id | teamname 이런식으로요..! 쿼리로 select * from member, team과 같은건지 궁금합니다 ! 그리고 .leftJoin(member.team, team)에서 member.team은 어떤걸 의미하는지도요..! ㅠㅠ 제가 join을 공부했을 때는 select * from member LEFT JOIN team ON ~ 이런 쿼리가 있을 때, 왼쪽(member 테이블)을 기준으로 오른쪽 테이블을 붙여서 출력해라! 이런 식으로 이해를 했는데요, 쿼리dsl에서는 어떻게 되는지 이미지화가 안돼요 ㅠㅠ혹시나 제 질문에 도움이 될까 싶어서 https://www.youtube.com/watch?v=pJqBR2TNe24 이 영상으로 공부했다는 점 알려드립니다..! 프로젝트 중이라 급히 사용해야 하는데 아직 이해가 안되서 큰일이에요 ㅠㅠㅠ 가능하면 상세한 답변 부탁드립니다! 감사합니다 !!
- 해결됨실전! Querydsl
Projection 사용 불가 시 One To Many 엔티티 fetch 시 cartesian product없이 n + 1 문제 해결하기
대략적 엔티티 구조 public class Level { ... @OneToMany(mappedBy = "level", cascade = CascadeType.ALL) private List<LevelCreator> levelCreators = new ArrayList<>(); } public class LevelCreator { ... @ManyToOne(fetch = LAZY) @JoinColumn(name = "level_id") @NotNull private Level level; } 위와같이 Level과 LevelCreator가 1:N으로 설계된 상태에서 QueryDSL을 사용하여 Level을 levelCreators가 전부 채워진 상태로 cartesian product와 n + 1 문제 없이 fetch하는 방법이 무엇인가요? 현재의 경우는 cartesian product가 발생하더라도 단순히 1개의 쿼리로 처리하는 것이 더 효율적일 수 있다고 생각하고 있습니다만 추후 1:N을 2개 이상 fetch join해야할 경우가 나왔을 때 이를 풀어나가기 위해 질문합니다. Dirty Checking을 사용해 자동으로 업데이트를 수행하기 위해 Dto등을 사용하지 않아 Projection사용이 곤란한 상태입니다. 만약 Projection을 사용하여서 cartesian product와 n + 1을 전부 피하면서 Dirty Checking도 가능한 방법이 있다면 알려주시면 감사하겠습니다. 현재 시도해본 것. 1. queryFactory.selectFrom(level).fetch(); // n+1 2. queryFactory.selectFrom(level) .join(level.levelCreators).fetchJoin().fetch(); // cartesian product 3. List<Level> levelList = queryFactory.selectFrom(level).fetch(); Map<Long, List<LevelCreator>> levelCreatorMap = queryFactory.selectFrom(levelCreator) .innerJoin(levelCreator.level, level) .fetchJoin().fetch().stream() .collect(Collectors.groupingBy(lc -> lc.getLevel().getId())); levelList.forEach(levelEntity -> { levelEntity.getLevelCreators().clear(); List<LevelCreator> levelCreatorList = levelCreatorMap.get(levelEntity.getId()); if (levelCreatorList != null) levelEntity.getLevelCreators().addAll(levelCreatorList); }); // n + 1 해결방법을 찾았습니다. Test환경에서 따로 application파일을 생성해야 할 경우 해당 파일에도 default_batch_fetch_size를 설정해주어야 했습니다. List<Level> results = queryFactory.selectFrom(level) .fetch(); results.stream().map(Level::getLevelCreators) .forEach(Hibernate::initialize); return results; 또한 해당 코드를 사용해 Hibernate initialize를 호출함으로써 batch size를 활용한 n+1문제 해결이 가능했습니다. 참고함 : https://blog.leocat.kr/notes/2020/01/13/querydsl-duplication-problem-on-fetchjoin-with-onetomany
- 미해결실전! Querydsl
사용자 정의 repository의 implementation class들을 더 작은 클래스들로 쪼개는 방법
만약 예를 들어, repository: WorkRepository Custom Repository interface: WorkRepositoryCustom Custom Repository interface Implementation: WorkRepositoryImpl 정도로 구성되 있을 경우, WorkRepositoryImpl (또는 WorkRepositoryCustom interface)가 너무 커져서 별도의 작은 클래스로 쪼개려고 시도중인데요, 추천하실 만한 방법이 있을까요?
- 미해결실전! Querydsl
querydsl random select관련
안녕하세요 querydsl을 사용하여 이것저것 해보다가, 랜덤으로 orderby해서 값을 가져오는 경우엔 어떻게 해야할지 궁금합니다 jpa나 jpql, querydsl을 사용하여 random select를 구현할 순 없을까요?? 참고로 DB는 MariaDB입니다!
- 미해결실전! Querydsl
querydsl 설정 문의
안녕하세요 강사님 다름이아니라 querydsl 설정하는데 있어서 문제가 있어서 이렇게 질문 남깁니다. error: cannot find symbol public class QBook extends EntityPathBase<Book> { ^ symbol: class Book 이런식으로 Book Entity의 QBook을 만들어서 run을 하면 위 같은 Book을 찾지 못한다는 에러가 발생합니다 어떻게 해결해야 할까요 ㅠㅠ
- 미해결실전! Querydsl
연관관계 편의 메소드에서 질문 있습니다!
안녕하세요 강의 수강 중 연관관계 편의 메소드에서 궁금한 점이 있어서 질문 드립니다. Members.java @Entity@Getter @Setter@NoArgsConstructor(access = AccessLevel.PROTECTED)@ToString(of = {"id", "username", "age"}) public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; public Member(String username) { this(username, 0); } public Member(String username, int age) { this(username, age, null); } public Member(String username, int age, Team team) { this.username = username; this.age = age; if (team != null) { changeTeam(team); } } public void changeTeam(Team team) { this.team = team; team.getMembers().add(this); }} public void changeTeam(Team team) { this.team = team; team.getMembers().add(this);} 위의 메소드에서 만약 인자로 넘어온 team이 teamA라면 team.getMembers()를 하면 teamA에 속해 있는 member들이 쭉 뽑아지는거 아닌가요? 맞다면 이 getMembers()는 어디에 있는 member들을 뽑아오는 건가요? 뭔가 머리 속에 상상이 안돼서 그런데 구체적인 예시를 들어주시면 감사하겠습니닷!
- 미해결실전! Querydsl
간단한 질문이 있어 질문 남깁니다.
제가 이렇게 rollup 을 사용한 querydsl 을 만들고 싶어 검색을 해봤지만 mysql 에서 지원해는 mysqlquery 의 rollup 만 발견을 했습니다-> 제가 mssql 을 쓰고어서혹시 querydsl 에서 rollup 이나 cube 같은 기능을 지원을 해주는지 궁금합니다 출처 : https://myjamong.tistory.com/191
- 미해결실전! Querydsl
EntityManager Thread safe관련 문의드립니다.
안녕하세요 김영한 강사님 강의듣다 처음 질문올립니다~~! EntityManager의 Thread-Safe관련 문의드립니다. 영한님 책 83Page에서 엔티티 매니저는 스레드간 공유하거나 재사용하면 안된다 라고 설명이 되어있는데 이게 스레드 안전하지 않다라는 내용과는 다른건가요? 전 그부분보고 지금까지 엔티티매니저는 스레드안전하지 않아서 멀티 스레드에서 사용하려면 동기화를 해줘야한다고 생각했었는데 이번 강의(순수JPA리포지토리와 Querydsl)에서 스레드 안전하다고 말씀하셔서, 궁금합니다! 아니면 본래 엔티티매니저는 스레드안전하지 않지만 스프링에서 스레드 안전하게 사용하도록 처리해주고 있는건가요?(강의에서 스프링이 Proxy를 사용한다고 말씀해주시긴 해서 혹시 이거랑 관련있는지 궁금합니다) 항상 좋은강의 너무 잘 듣고있습니다. 감사합니다~~!
- 미해결실전! Querydsl
querydsl gradle 의존성 충돌
안녕하세요, 영한님 JPA 강의 잘 듣고있습니다. 다름이 아니라, 강의에 나온 query dsl의존성 설정하엿는데 org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration ':compileClasspath'. ... Caused by: org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.conflicts.VersionConflictException: A conflict was found between the following modules: - org.javassist:javassist:3.24.0-GA - org.javassist:javassist:3.18.2-GA A conflict was found between the following modules: - com.google.guava:guava:18.0 - com.google.guava:guava:15.0 Run with: --scan or :dependencyInsight --configuration compileClasspath --dependency org.javassist:javassist 위와 같은 에러가 생깁니다. guava와 의존성이 충돌하는것 같은데.. 해결할 수 있는 방법이 있을까요?
- 미해결실전! Querydsl
안녕하세요. 질문드립니다.
java.lang.IllegalArgumentException: Could not locate ordinal parameter [1], expecting one of [] 이와 같은 익셉션이 발생합니다. 실행 테스트 코드 입니다. package study.querydsl.repository;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.Member;import javax.persistence.EntityManager;import java.util.List;import static org.assertj.core.api.Assertions.assertThat;@SpringBootTest@Transactionalclass MemberRepositoryTest { @Autowired EntityManager em; @Autowired MemberRepository memberRepository; @Test public void basicTest() { Member member = new Member("member1", 10); memberRepository.save(member); Member findMember = memberRepository.findById(member.getId()).get(); assertThat(findMember).isEqualTo(member); List<Member> result1 = memberRepository.findAll(); assertThat(result1).containsExactly(member); List<Member> result2 = memberRepository.findByUsername("member1"); assertThat(result2).containsExactly(member); }} 에러는 List<Member> result2 = memberRepository.findByUsername("member1"); 여기서 발생합니다. git 주소 입니다. https://github.com/aispark/querydsl
- 해결됨실전! Querydsl
객체설계에 대해서 질문이 있습니다.
안녕하세요. 김영한 강사님. 강사님이 올려주신 강의를 잘 듣고 있습니다. 궁금한 부분은 JPA를 사용하고 있는 현업에서는 어떻게 설계하며, 개발을 진행하는지입니다. 우선 제 상황을 간단하게 말씀드리면 업무요건을 확인하면서 아래의 단계로 설계를 진행합니다. 1. 개념데이터 모델링 - 주 목적은 업무요건에 맞춰서 엔터티가 잘 도출되었는지 확인합니다. 2. 논리데이터 모델링 - 주제영역 , 엔터티 정의, 엔터티관계 정의(1:1, 1:N), 속성정의(식별자도출), 역정규화 등등 - 메타데이터(표준단어, 표준용어, 도메인,유효값) 한글(영문)명 생성 3. 물리데이터 모델링 - 논리데이터 모델링을 기준으로 물리데이터 생성합니다. 위 단계처럼 계속적으로 업무요건에 맞게 논리데티터 모델링을 진행하고, 최종적으로 물리데이터 모델링을 진행후 에 개발을 진행합니다. 질문-1) 궁금한건 JPA DDD 기반으로 설계를 하는경우에도 위 단계처럼 엔터티 설계 후 객체(Entity)를 테이블 기준으로 생성하는지요? 아니면 객체와 테이블을 나누어서 영역별로 설계를 진행하는지요? 객체와 테이블간의 설계 순서가 있는지 궁금합니다. 질문-2) 만약 위 질문-1)처럼 테이블 설계 후 객체(Entity) 설계를 진행하는경우 객체의 필드를 테이블기준으로 컬럼매핑한다면 맵핑관계에서 객체필드의 속성들을 테이블속성에 위임하는지요? 즉, 물리테이블 생성 시 컬럼사이즈, not null, default, unique index 정의 해놓고 추가적으로 객체에도 컬럼 어노테이션으로 추가적으로 설정을 하는지요. 아니면 테이블 속성에 위임을 하는지 궁금합니다. 질문-3) 객체별 식별자는 @ID Long ID 를 정의해서 수업을 진행하셨는데 보통 pk는 어떤 규칙으로 생성하는지 궁금합니다. - 어떤 교재에서는 독립엔터티인경우 인조키로 생성하여 종속 혹은 교차엔터티는 부모의 식별자를 상속(pk) or 비상속(fk)받거나, 하위 엔터티와의 연관관계가 깊어지면 연결관계를 끊고 인조키를 생성한다고 합니다. - 근데 또 어떤분들은 인조키만으로도 충분하다고 하시면서 모든 테이블(독립/교차/종속 전체)들을 모두 인조키로만 생성하여 진행한다고도 합니다. 질문-4) JPA 영속성 컨텍스트(SQL 저장소,1차캐시)는 지연 및 변경을 이용하여 SQL를 직접 사용하지 않고 Jpql, Flush, Transaction 등 특정 이벤트가 발생하면 jpa가 쿼리를 직접 수행하는걸로 이했습니다. 정말 개발자에게는 등록/수정/조회/삭제 등 쿼리 작성하지 않고 비지니스 로직처리에 집중한다고 하는데 좋은 기술인거 같습니다. 만약 영속성 컨텍스트를 사용하여 특정 객체를 조회하면 추가적으로 동일 객체를 조회하게 된다면 영속성 컨텍스트에 있는 객체가 조회된다고 이해하였습니다. (참조값동일) 하지만 만약 누군가가 이미 동일 객체를 변경하여 오라클 버퍼캐쉬 및 디스크까지 저장된 상태라면 어떻게 되는지요? 트랜잭션 격리성이 "Non-Repeatable Rad" 인지요? 영속성 컨텍스트가 변경감지를 통해서 동일객체가 변경되었다는걸 알고 db에서 재조회를 한 이후에 영속성컨텍스트에 재적재를 하는지 잘 이해가 되지 않아서 질문드립니다. (참고 16.1.1 트랜잭션과 격리수준) 감사합니다.
- 미해결실전! Querydsl
BooleanExpression 통합방식 질문~
String usernameParam = null; or nullInteger ageParam = null; or 10 private List<Member> searchMember2(String usernameCond, Integer ageCond) { return queryFactory .selectFrom(member) .where(allEq(usernameCond, ageCond)) .fetch();}private BooleanExpression usernameEq(String usernameCond) { return usernameCond != null ? member.username.eq(usernameCond) : null;}private BooleanExpression ageEq(Integer ageCond) { return ageCond != null ? member.age.eq(ageCond) : null; }private BooleanExpression allEq(String usernameCond, Integer ageCond){ /* if(usernameCond == null){ if(ageCond != null) return ageEq(ageCond); else return null; }*/ return(ageEq(ageCond)).and(usernameEq(usernameCond));} 1) 강의에서 BooleanExpression 통합방식에서 1-1 ) usernameParam이 null , age 값셋팅 , 널포인트 익셉션이 발생 1-2 ) age 값을 null로하고 usernameParam 에 값셋팅 하면 널포인트 익셉션이 안납니다.. 경우 1-1), 1-2) 의차이가 어디서 나오는지 잘모르겠습니다. 2) 널포인트 익셉션을 방지하기위해 주석처럼 처리해도될까요? (널포인트 익셉션은 안터집니다)
- 미해결실전! Querydsl
projection 다른테이블에 있는 필드도 함께 조회
안녕하세요~ 궁금증이생겨서요 스프링데이터 JPA강의 에서 projections는 1. @Value를 이용해서 다른 엔티티에있는 필드값도 함께 조회하거나 2.중첩 구조처리? 같은걸로 다른 엔티티필드 값을 함께 조회했는데요 이경우 root엔티티에 해당되는 필드는 최적화가 되지만 root 엔티티가 아닌 필드를 조회할때는 최적화가 안되었습니다~ 그런데 쿼리 Dsl로 두 엔티티필드를 조회했더니 두 엔티티다 최적화가 된거같아서요~ (제가 직접 join문을 해서 해당필드만 가져와서 되는걸까요? , 스프링 데이터 JPA projections 는 지금 저 join 쿼리를 혼자서는 아직 최적화를 못하는거구요~?~) 이것도 쿼리 dsl의 장점인가요? , 아니면 제가 뭘 잘못 알고있는 걸까요? 결과
- 미해결실전! Querydsl
JPAQueryFactory 빈등록
JPAQueryFactory를 매번 Repository마다 만들지 않고 빈으로 등록해서 사용하면 안 되나요??
- 미해결실전! Querydsl
application.yml vs persistence.xml
공부를하다가 두 곳에 모두 중복된 코드들이 있는 것 같아서 혹시나 하고 persistence.xml을 삭제하고 돌렸는데 아무 이상없이 CRUD가 다 성공했습니다. 굳이 persistence.xml이 필요없는 것 같은데 맞나요?? emf만들때나 그럴때 쓴다고 공부했던것 같은데, 해당 xml이 없어도 돌아가는 것 보니 문제는 없는거 같고.. 그래서 핵심질문은 아래와 같습니다. 1. 굳이 둘다 있어야 하나요? 돌려보니까 application.yml만 있어도 돌아가는것 같습니다. 2. 둘의 차이점이 뭘까요? application.yml은 어플리케이션 전체에 영향을 주는 설정이고, persistence.xml은 JPA만 영향을 주는 설정인데, application.yml과 persistence.xml이 둘다 있으면 application.yml이 우선순위를 갖는 건가요?둘다 만들어놓고, yml파일은 h2 DB를, xml파일은 mysql을 설정해놓았는데 h2로 돌아갔습니다. 3. 연관관계 매핑을 할 때 예를들어, Member -> Team -> Country 이 3개의 엔티티가 Member와 Team도 다대일, Team과 Country도 다대일 관계일 때, 모든 데이터를 쿼리 한방에 다 끌고 와서 영속성컨텍스트에 저장하려면 페치조인을 어디에 써야하나요? queryFactory . select(member) .from(member) .join(member.team, team) .join(team.country, country).fetchJoin() .fetch() 인지 아니면, queryFactory . select(member) .from(member) .join(member.team, team).fetchJoin() .join(team.country, country) .fetch() 인지 아니면, queryFactory . select(member) .from(member) .join(member.team, team).fetchJoin() .fetch() 만 쓰면 그 연관된 것들도 쭉쭉 전부 다 페치조인이 적용되는지 아니면, queryFactory . select(member) .from(member) .join(member.team, team).fetchJoin() .join(team.country, country).fetchJoin() .fetch() 인지 궁금합니다.fetchJoin()은 한번만 쓰라고 했던 것 같은데마지막의 경우처럼 해도되는지도 궁금합니다.
- 해결됨실전! Querydsl
h2 database 연동 관련 문제
안녕하세요, 항상 유익한 강의 감사합니다!! 현재 안정화 버전으로 h2 데이터베이스를 설치하였으며, application.yml 생성 이후에 테스트 코드를 진행하게 되면 강의에서는 Hello 테이블이 생성되는걸 확인할 수 있는데 제가 진행하였을때는 테이블이 생성되지 않습니다..ㅠㅠ 로그를 확인해보니 트랜잭션 롤백이 발생하는 것 같은데 원인을 모르겠습니다.. 관련 로그 첨부 드립니다. 2021-08-02 11:44:40.513 INFO 49375 --- [ main] study.querydsl.QuerydslApplicationTests : Starting QuerydslApplicationTests using Java 11.0.11 on moony.local with PID 49375 (started by moonbohyeon in /Users/moonbohyeon/IdeaProjects/querydsl) 2021-08-02 11:44:40.515 INFO 49375 --- [ main] study.querydsl.QuerydslApplicationTests : No active profile set, falling back to default profiles: default 2021-08-02 11:44:41.157 INFO 49375 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2021-08-02 11:44:41.182 INFO 49375 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 18 ms. Found 0 JPA repository interfaces. 2021-08-02 11:44:41.690 INFO 49375 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2021-08-02 11:44:41.859 INFO 49375 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2021-08-02 11:44:41.946 INFO 49375 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2021-08-02 11:44:41.989 INFO 49375 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.32.Final 2021-08-02 11:44:42.115 INFO 49375 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 2021-08-02 11:44:42.228 INFO 49375 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 2021-08-02 11:44:42.766 DEBUG 49375 --- [ main] org.hibernate.SQL : drop table if exists hello CASCADE 2021-08-02 11:44:42.767 DEBUG 49375 --- [ main] org.hibernate.SQL : drop sequence if exists hibernate_sequence 2021-08-02 11:44:42.768 DEBUG 49375 --- [ main] org.hibernate.SQL : create sequence hibernate_sequence start with 1 increment by 1 2021-08-02 11:44:42.770 DEBUG 49375 --- [ main] org.hibernate.SQL : create table hello (id bigint not null, primary key (id)) 2021-08-02 11:44:42.775 INFO 49375 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2021-08-02 11:44:42.782 INFO 49375 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2021-08-02 11:44:42.988 WARN 49375 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2021-08-02 11:44:43.544 INFO 49375 --- [ main] study.querydsl.QuerydslApplicationTests : Started QuerydslApplicationTests in 3.427 seconds (JVM running for 4.713) 2021-08-02 11:44:43.666 INFO 49375 --- [ main] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@78f5c518 testClass = QuerydslApplicationTests, testInstance = study.querydsl.QuerydslApplicationTests@6b6c0b7c, testMethod = contextLoads@QuerydslApplicationTests, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@2f48b3d2 testClass = QuerydslApplicationTests, locations = '{}', classes = '{class study.querydsl.QuerydslApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@d23e042, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@69ee81fc, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@29f7cefd, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@9816741, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@36804139, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@6366ebe0], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@602aeb87]; rollback [true] 2021-08-02 11:44:43.756 DEBUG 49375 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2021-08-02 11:44:43.969 DEBUG 49375 --- [ main] org.hibernate.SQL : insert into hello (id) values (?) 2021-08-02 11:44:43.973 DEBUG 49375 --- [ main] org.hibernate.SQL : select hello0_.id as id1_0_ from hello hello0_ 2021-08-02 11:44:44.025 INFO 49375 --- [ main] o.s.t.c.transaction.TransactionContext : Rolled back transaction for test: [DefaultTestContext@78f5c518 testClass = QuerydslApplicationTests, testInstance = study.querydsl.QuerydslApplicationTests@6b6c0b7c, testMethod = contextLoads@QuerydslApplicationTests, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@2f48b3d2 testClass = QuerydslApplicationTests, locations = '{}', classes = '{class study.querydsl.QuerydslApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@d23e042, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@69ee81fc, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@29f7cefd, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@9816741, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@36804139, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@6366ebe0], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]] 2021-08-02 11:44:44.035 INFO 49375 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2021-08-02 11:44:44.036 INFO 49375 --- [ionShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down' 2021-08-02 11:44:44.036 DEBUG 49375 --- [ionShutdownHook] org.hibernate.SQL : drop table if exists hello CASCADE 2021-08-02 11:44:44.039 DEBUG 49375 --- [ionShutdownHook] org.hibernate.SQL : drop sequence if exists hibernate_sequence 2021-08-02 11:44:44.041 INFO 49375 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2021-08-02 11:44:44.044 INFO 49375 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
- 미해결실전! Querydsl
Gradle에서 deprecated 문제가 있습니다.
plugins { id 'org.springframework.boot' version '2.5.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"}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' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //querydsl 추가 implementation 'com.querydsl:querydsl-jpa'}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}//querydsl 추가 끝 영한님이 올려주신대로 그대로 gradle 코드를 작성하여 돌려보았는데, The AbstractCompile.destinationDir property has been deprecated. This is scheduled to be removed in Gradle 8.0. Please use the destinationDirectory property instead. 이런 오류가 뜨더군요. 그래서 오류에 나와있는 해결방법대로 destinationDir를 찾아 바꿔주려하는데 이와 똑같은 단어가 gradle내에 존재하지 않아서 어떤걸 바꿔줘야할지 모르겠습니다. 뒤가 Dir로 끝나는 것들을 전부 Directory로 바꿔주면서 해봤는데도 잘 안되더군요. 혹시 어디를 수정하면 될까요?
- 미해결실전! Querydsl
캐스팅 관련 질문드리고 싶습니다!
안녕하세요, 영한 선생님. 강의 늘 즐겁게 잘 듣고 있습니다. 다름이 아니라, nativeQuery 를 querydsl로 수정하는 부분에서 질문이 있습니다. querydsl 에서 Qclass 는 StringPath 타입으로 변수를 가져와서 order.toString 으로 변환할 수가 없어서 해결을 못하고 있습니다... 이런 경우 어떤 식으로 해야하는지 여쭤봐도 될까요..? 현재 테이블이 실무에서 사용하는 테이블인데 애초에 order 를 String 이 아니라 number로 설계를 했어야했는데, 테이블을 수정하지 않은채 짜는 방법이 궁금해 여쭤봅니다!! 좋은 강의 늘 감사합니다! ㅎㅎ EmployeeRank { String name; String order; String department; } nativeQuery : update EmployeeRank set order = to_char(to_number(order)-1) where to_number(order) > to_number( :order) ; 제가 생각하는 querydsl (:order 은 input 변수로 들어옵니다) queryfactory .update(employeeRank) .set(employeeRank.order, String.valueOf(Integer.parseInt(:order)-1)) .where(???) .execute();
- 미해결실전! Querydsl
List 를 Map으로 변환할 수 있을까요?
List<MemberDto> 조회 결과를 Map형태로 변경해서 받을 수는 있나요??
- 미해결실전! Querydsl
v3-1 방식으로 Querydsl 사용할 때
삭제된 글입니다