30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
캐멀케이스 질문
안녕하세요! 정말 간단한 질문인데 구글링해도 딱히 나오지 않아서 질문드립니다. 2:00 에 보면 필드명이 username, teamName 하셨는데요 username은 왜 캐멀케이스를 사용하지 않나요??
- 미해결실전! Querydsl
페치 조인과 on 절
안녕하세요! 4:39초 코드에서 질문 있습니다. 코드를 left조인으로 수정, where절 대신 on절 추가로 코드를 바꿔봤습니다. on절로 걸러진 것들을 left join하고 Lazy인 것을 페치 조인으로 땡겨올 것이라 예상했는데 오류가 나더라구요 혹시나 해서 활용편을 다시 봤는데 fetch join 예시에서는 on을 사용하지 않으셨더라구요 fetchjoin은 on절과 사용하지 못하는 건가요? List<Member> findMembers = queryFactory .selectFrom(member) .leftJoin(member.team, team).fetchJoin().on(team.name.eq("teamA")) .fetch();
- 미해결실전! Querydsl
querydsl 의 order by 문에서 cast 와 replace 를 사용하는 방법
김영한님 현재 해당 sql 쿼리를 querydsl 바꿔야하는 상황이고 제품의 가격별로 페이징 및 정렬을 해야하는 상황입니다.문제는 현재 product table 에 있는 데이터가 ₩8,000 이렇게 들어가 있는 상태고 전부 string 입니다. 그런제 저가순/고가순 그리고 페이징 까지 적용해야하는 상황인데sql문까지는 만들 수 있는데, 문제는 querydsl 로 적용하는 부분에서 막혔습니다.이게 sql 문이고 select * from product order by cast(replace(replace(product.price,‘₩’,‘’), ‘,’,‘’) as decimal) asc; orderby 구문에서 replace 와 cast 를 전부 적용해야하는 데, 변환가능한 문제인지 묻고싶습니다 ㅠ 염치불구하고 두서없이 질문드려서 죄송합니다...
- 미해결실전! Querydsl
안녕하세요? 여쭤볼 곳이 없어 질문남깁니다
회사에서 MSSQL을 사용하고 있습니다 기존에 마이바티스를 사용하고 있었고 최근 JPA와 querydsl을 도입했습니다 MSSQL특성 상 SELECT 쿼리에 with(nolock) 힌트를 줘서 써야한다하기에 셀렉트 쿼리에 한하여 @Transactional (isolation = Isolation.READ_UNCOMMITTED) 를 줬습니다 현재 배포시 의문의 락이 걸리고 있는 상황인데, 개발서버에서는 아무 이상이 없고 운영에만 넘어가면 락이걸리네요 아무튼 상황은 이렇구 제 의문은 이겁니다 with(nolock)힌트를 줘서 더티리드를 한다고 한다면 JPA는 어쨋건 읽어오면서 영속성 컨텍스트에 저장을 하게되잖습니까? 그럼 더티리드를 여러군데서 해간다고 한다면 정합되지 않은 해당 정보들이 모두 영속성 컨텍스트에 들어간 상태인데, 그 상황에 어딘가에서 변경감지를 통한 업데이트 쿼리가 발생한다고 한다면 이게 정확히 어떤식으로 동작하는지가 궁금합니다. 현재 발생하고 있는 의문의 락과 연관이 있을까요?
- 해결됨실전! Querydsl
MemberRepositoryImpl
좋은강의 감사드립니다! 처음으로 DB 를 사용함에 있어서 흥미를 가지게 되었네요!! 다름이 아니라 궁금한 점이 생겼는데 스프링 컨테이너가 MemberRepositoryImpl 을 사용하게 되는 것 같은데 컨테이너에 어떻게 해당 클래스가 빈으로 등록되는지 감이 잘 오지 않습니다. ㅠㅠ ****RepositryImpl 이라는 규약을 두고 해당 클래스를 빈으로 등록시켜주는 매커니즘일까요??
- 해결됨실전! Querydsl
재밌게가 아닌 신나게 들었습니다 ㅋㅋ
기존 Spring , JPA 강의가 재밌는 강의라면 Querydsl은 신나는 강의네요. 어? 이것도 가능해? 아니 이것도 된다고?? 여기에 더해서 이런것까지 해줘? 강의 듣는 내내 감탄사만 나왔네요 ㅎㅎ 직접 jpql을 건드릴 때는 상상할 수도 없던 것들이 다 가능하게 되는게 너무 신기합니다. 기존 JPA 강의에서 Querydsl을 엄청 강조하신 이유가 이제야 알겠네요 ㅎㅎㅎ 마지막 강의는 조금 저한테는 어렵긴 했지만 Function<Target, Result> 로 만든 파라미터가 결국에는 람다식을 파라미터로 넣기 위한 자바기능이란것도 이해했구요. (계속 복기하다보면 어느샌가 이해되겠죠 ㅎㅎ) 덕분에 신나게 강의 들었습니다! 감사합니다~~
- 해결됨실전! Querydsl
결과적으로는 바인딩받은 조건으로 검색하려면
그냥 앞전에 우리가 배운 Condition 클래스를 만들어서 그걸로 바인딩 받아서 where 문에 넣으면 되나요? 제 눈에는 그게 더 직관적이더라구요. Querydsl을 복잡한 실무환경에서 사용할때도 클래스로 바인딩받아서 BooleanExpression 메소드 만들어서 쓰면 될까요? 항상 감사합니다~
- 미해결실전! Querydsl
강좌 너무 감사합니다. 강의 자료는 원본으로 받을수 없을까요?
진짜 너무 좋은 강의 감사합니다. 강의 자료를 프린트해서 볼려니 페이지 수가 너무 많아요..ㅠㅠ 빈줄도 많고...ㅠㅠ pdf를 다른(한글,워드등) 파일로 변환하여 수정하여도 쉽지 않더라구요, 강의 자료를 pdf파일이 아닌 수정 가능 파일로 첨부해주실수 없는지요. 사용하신 프로그램이름과 파일 원본과 그리고 pdf를 같이 올려주시면 사용자가 골라서 다운 받으면 좋지 않을까 싶어요~^^
- 미해결실전! Querydsl
QueryDSL 계층형 쿼리
안녕하세요JPA와 QueryDSL을 공부하다가 궁금한 점이 생겨서 질문 드립니다.상품의 카테고리 테이블이 있고 해당 카테고리는 자기자신을 참조하는 형태로 계층 구조를 가지고 있다고 하면 API 응답 구성은 { "category_seq":"1", "parent_id":null, "name":"root", "children":[ { "category_seq":"2", "parent_id":"1", "name":"child_1", "children":[ { "category_seq":"4", "parent_id":"2", "name":"child_1_1", "children":[ ] } ] }, { "category_seq":"3", "parent_id":"1", "name":"child_1", "children":[ ] } ] } 아래와 같은 형태로 구성하고 싶습니다. 그렇게 되면 아래와 같은 entity 가 나오고 public class Category { @Id @GeneratedValue(generator = "uuid2") @Column(columnDefinition = "varchar(36)") @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator") private String categorySeq; @Column private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_seq") private Category parent; @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST,fetch = FetchType.LAZY) private List<Category> children = new ArrayList<Category>(); } QueryDSL에서는 from(qCategory).join(qCategory.children).fetchJoin() 으로 조회를 할텐데 API의 응답 구성으로 계층화 시키려고 하면 child를 접근하는 부분에서 N+1 문제가 발생합니다. 혹시 이 부분에 대한 해결 방법이 있을까요? 아래는 SQL 문 입니다. select category0_.category_seq as category1_0_0_, children1_.category_seq as category1_0_1_, category0_.name as name5_0_0_, category0_.parent_seq as parent_s6_0_0_, children1_.name as name5_0_1_, children1_.parent_seq as parent_s6_0_1_, children1_.parent_seq as parent_s6_0_0__, children1_.category_seq as category1_0_0__ from t_category category0_ inner join t_category children1_ on category0_.category_seq = children1_.parent_seq ; --------------------- child 부분 ----------------------- select children0_.parent_seq as parent_s6_0_1_, children0_.category_seq as category1_0_1_, children0_.category_seq as category1_0_0_, children0_.name as name5_0_0_, children0_.parent_seq as parent_s6_0_0_ from t_category children0_ where children0_.parent_seq in ('540a0597-1273-4925-84da-e0a0f86f234a', 'kf0a0597-1273-4925-84da-e0a0f86f234a'); ....... 생략 --------------------- child 부분 -----------------------
- 해결됨실전! Querydsl
그냥 native SQL 짜듯이 짜면 되는게 신기하네요
심지어 자바 코드로 만들어서 컴파일 시에 에러까지 잡아주니까 너무 신기하고 재밌어요 ㅋㅋㅋ 다른 강의들에서 항상 QueryDSL 강조하시던 이유가 있었군요!!
- 해결됨실전! Querydsl
서브쿼리 질문입니다.
위 네이티브 쿼리를 Querydsl이나 @Query를 이용하여 작성하고 싶습니다. Querydsl이나 @Query나 모두 똑같은데서 문제가 발생하는데요.where절에서 두 개 이상의 필드를 명시할 경우 위처럼 컴파일 에러가 발생합니다. 강의 예제에서는 where절에 하나의 필드만 사용했는데두 개이상의 필드는 사용하지 못하는건가요?? --------------------------------- 네이티브 쿼리로 동작은하는데(반환타입을 List로하고 파라미터 없이할 경우)페이징도 하고싶어서 반환타입을 Page로 할경우 ID 컬럼을 찾을 수 없다는 에러가 납니다. 쿼리를 두번 나눠서 호출하는게 답일까요..? 질문을 요약하면1. 서브쿼리 사용 시 where절에 두 개 이상의 필드 사용 가능 여부 2. 네이티브 쿼리 사용 시 페이징 가능 여부 입니다.
- 미해결실전! Querydsl
JPQL로 해결 안 되는 부분
선생님 안녕하세요 양질의 강의 잘 듣고 있습니다. 다름이 아니고 SQL로는 쉽게 짤 수 있는 구문이 JPQL, QUERYDSL 로 변환하는데 어려움을 겪고 있씁니다. 상황은 간단히 요약하면 게시판 글 목록을 보여주기 위해 게시물인덱스, 제목, 내용, 글에 눌린 '총 좋아요 수' 를 reponse 로 주는 API를 만드려고 하는 것입니다. post 테이블이 있고, 어떤유저가 어떤 글에 좋아요를 눌렀는지 체크하는 'user_like' 테이블이 있습니다. SQL로 짠다면 아래와 같이 짤 수 있습니다. select p.post_idx,p.post_title,p.post_body,c.cnt from post pleft join (select count(*) as cnt, post_idx from user_likewhere is_clicked = 'Y'group by post_idx) as con c.post_idx = p.post_idx; https://www.inflearn.com/questions/14139 의 답변을 보고 해결방안을 생각해 보았는데, 1.네이티브 쿼리 사용 2.쿼리를 2번 나누어 호출 첫 번째 질문은 네이티브 쿼리로 위의 SQL문을 만들 수 있나요? 두 번째 질문은 설명을 보아도 쿼리를 2번 쓰는게 어떤건지 잘 모르겠습니다. 예를 들어 join 뒤에 subquery를 먼저 돌린다고 하면 [게시물인덱스, 총 좋아요수] 가 나옵니다. 이걸 DTO를 만들어서 리스트에 담을거고, 담은 값을 다시 꺼내어 나머지 쿼리를 돌린다는 걸까요? 람다를 써서 할 수 있는건지...? 어떻게 코드를 쓰는건지 감이 안 잡힙니다. 쿼리를 두 번 써서 어떻게 제가 원하는 게시물 정보 리스트를 얻을 수 있을까요?
- 미해결실전! Querydsl
Q Class 생성 시 extends 상속 질문
안녕하세요. Entity class에 extends DefualtEntity 를 할 경우 Q class 생서 시 DefualtEntity 의 값은 Q Class에 누락되는 현상이 있던데 상속을 해서 구성하면 안되는 걸까요? DefualtEntity 에는 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime regDate; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime udtDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.now(); regDate = now; udtDate = now; } @PreUpdate public void preUpdate() { udtDate = LocalDateTime.now(); } 이런 공통적인 내용을 넣어보려합니다.
- 미해결실전! Querydsl
Dto에서 @QueryProjection 및 @Builder를 같이 사용해도 될까요?
안녕하세요 영한님! queryDsl 강좌를 잘 보고 있습니다. 이번 강좌를 듣고 궁금증이 생겨서 질문드립니다. 아래와 같이 @QueryProjection과 @Builder를 같이 적용을 해서 사용을 해도 아무런 문제가 없는건지 궁금합니다. @QueryProjection @Builder public TestDto(String name, int age) { this.name = name; this.age = age; } 일단 테스트로 같이 적용해서 돌려봤는데 별 이상없이 돌아가는거 같긴한데 권장되지 않는 방법인지 모르겠네요 감사합니다(__)
- 미해결실전! Querydsl
Query DSL의 지연로딩
안녕하세요 강의 너무 잘 듣고 있습니다 ㅎㅎ 듣다보니 궁금한게 생겼는데 --- Query DSL도 Entity Manager를 사용하는걸 보고 이런 생각이 들었습니다. ' 그러면 Query DSL도 지연 로딩이 가능한가? ' --- Entity Manger를 사용하는 JPA 같은 경우엔 영속성 컨텍스트를 사용하여 지연 로딩 사용이 가능한데 Query DSL도 사용 가능하다고 보는게 맞을까요? --- 실제로 Query DSL로 테스트를 했을 땐 Lazy 로딩으로 설정이 잡혀있어도 fetch join 처럼 다 조회해서 가져오긴하네용 ㅎㅎ --- 감사합니다.
- 미해결실전! Querydsl
Querydsl4RepositorySupport을 이용한 Controller 구현 문의
마지막 완강을 드디어 마치고, 실습하는 과정에 있어서 막히는 부분이있어서 문의 드립니다. MemberController.java 에서 이번에 적용된걸 추가해서 진행했는데 (v4, v5) @RestController@RequiredArgsConstructorpublic class MemberController { private final MemberJpaRepository memberJpaRepository; private final MemberRepository memberRepository; private final MemberTestRepository memberTestRepository; // 조회 API 컨트롤러 개발 @GetMapping("/v1/members") public List<MemberTeamDto> searchMemberV1(MemberSearchCondition condition) { return memberJpaRepository.search(condition); } // 단순 페이징 처리 (전체 카운트를 한번에 조회하는 단순한 방법) @GetMapping("/v2/members") public Page<MemberTeamDto> searchMemberV2(MemberSearchCondition condition, Pageable pageable) { return memberRepository.searchPageSimple(condition, pageable); } // 복잡한 페이징 처리 (데이터 내용과 전체 카운트를 별도로 조회하는 방법) @GetMapping("/v3/members") public Page<MemberTeamDto> searchMemberV3(MemberSearchCondition condition, Pageable pageable) { return memberRepository.searchPageComplex(condition, pageable); } // Querydsl 지원 클래스 직접 만들어서 페이징 처리 구현 @GetMapping("/v4/members") public Page<Member> searchMemberV4(MemberSearchCondition condition, Pageable pageable) { return memberTestRepository.applyPagination(condition, pageable); } // Querydsl 지원 클래스 직접 만들어서 페이징 처리 구현2 @GetMapping("/v5/members") public Page<Member> searchMemberV5(MemberSearchCondition condition, Pageable pageable) { return memberTestRepository.applyPagination2(condition, pageable); }} 기존에 searchPageSimple처럼 MemberRepositoryCustom 추가는 아닌거같고.. 아래와 같은 에러가 발생합니다. 기존방법과 좀 다른거같아, 혹시 다르게 설정을 어딘가에 줘야할까요?
- 미해결실전! Querydsl
BooleanBuilder와 BooleanExpression의 차이점이 궁금합니다.
안녕하세요. 강사님. 강의를 보는 도중 궁금한 점이 생겨 문의글 남깁니다. where 다중 조건을 사용하면 좋은 점이 메소드를 사용할 수 있어 재사용이 용이하다고 하셨는데요, BooleanBuilder를 메소드로 빼서 사용하는 것과의 차이점이 궁금합니다.
- 미해결실전! Querydsl
@Transaction에 대해서 질문드드립니다.
안녕하세요? 강사님. 항상 좋은 강의 잘 보고 있습니다. 이번강의를 보면서 에러가 발생하였습니다. Member member = new Member("member1", 10);memberRepository.save(member);Member findMember = memberRepository.findById(member.getId()).get();assertThat(findMember).isEqualTo(member); assertThat부분에서 <"Member(id=1, username=member1, age=10) (Member@1b444b5)"> to be equal to: <"Member(id=1, username=member1, age=10) (Member@5a1a20ae)"> but was not. Expected :Member(id=1, username=member1, age=10) Actual :Member(id=1, username=member1, age=10) 이러한 에러가 발생했습니다. 알고보니 @Transaction 어노테이션을 선언을 안해서 그랬습니다. member와 findMember의 메모리 주소가 달라서 에러가 발생한것 같은데 메모리가 주소가 왜 다른지 잘 이해가 안됩니다. meber객체를 save 하면서 영속성 컨텍스트에 담기고 findMember는 영속성컨텍스트에 담겨있는 member인것이 아아니라 새로 select문을 날려서 디비에서 조회한 값이더라구요( @Transactional이 없을 때 로그를 통해서 확인하였습니다) @Transactional을 선언 하고 save 후 em.flush(); em.clear();를 해준것과 같은 현상이 나더라구요. @Transactional이 롤백외에도 어떠한 기능이 있길래 이러한 현상이 나타나는지 알고 싶습니다. 감사합니다.
- 미해결실전! Querydsl
union 질문 입니다.
안녕하세요 강사님 강의 잘 듣고 있습니다. jqpl 에서는 union 자체를 지원하지 않는 걸로 알고 있는데 지원하지 않는 이유가 union으로 문제를 해결하는게 좋은 로직이 아니어서 일까요? union을 써서 해결해야 하는 것들은 어떤 식으로 해결하는지 궁금합니다!
- 미해결실전! Querydsl
쿼리문 작성 질문입니다!
안녕하세요 강사님! 강의 항상 열심히 듣고 있습니다. 이번에 스프링을 배운김에 토이 프로젝트를 하나 하고 있습니다. 기능중에 준비된 랜덤단어 두 개 로 유저의 닉네임을 랜덤으로 지어주는 기능을 만들려고 합니다. 그래서 랜덤단어X랜덤단어를 만드는거는 쉽지만 user table 에 이미 있는 닉네임이면 클라에 주기 전에 서버에서 먼저 거르는 작업을 하고자 합니다. 랜덤단어 하나를 만들어서 DB에 존재하는지 검사하는 로직을 통과할때까지 while문으로 돌릴까 생각하였지만 db와 연결을 너무 많이 하게 될 것 같아 포기하고 sql문으로 해결할 수 없는지 생각해 보았습니다. 그래서 생각한게 랜덤단어가 들어있는 테이블을 두 개 만들어서 세타조인을 해서 하나의 테이블을 만들고, 유저테이블에서 나온 닉네임과 대칭 차집합을 통해 아직 만들어지지 않은 닉네임들을 후보까지 안전하게 10개를 뽑아서 클라에 넘겨주자는 생각을 했습니다. 그래서 대칭 차집합 쿼리를 찾아보니 SELECT str FROM ( SELECT str FROM tableA UNION ALL SELECT str FROM tableB ) AS tmp GROUP BY str HAVING COUNT(*)=1 이렇게 구현할 수 있다는 것을 알게 되었습니다. 근데 jpql은 FROM 절에 서브쿼리를 적을 수 없어 이것을 구현할 수 없다고 생각했습니다. 혹시 뭔가 다른 구현이 가능한 방법이 있을까 해서 질문 드립니다!