일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- kotlin
- 그리디
- Thymeleaf
- 김영한
- http
- jpa
- spring
- Android
- pointcut
- JPQL
- Spring Boot
- Greedy
- 인프런
- JDBC
- 스프링
- java
- 백준
- db
- transaction
- Proxy
- SpringBoot
- Exception
- QueryDSL
- 스프링 핵심 기능
- AOP
- springdatajpa
- Servlet
- 자바
- 스프링 핵심 원리
- 알고리즘
- Today
- Total
목록인프런/[인프런] QueryDsl (28)
개발자되기 프로젝트
1. QuerydslRepositorySupport EntityManager 주입해줌. Querdsl 유틸리티 클래스 : Helper instance to ease access to Querydsl JPA query API. from절부터 시작 가능. @Repository public abstract class QuerydslRepositorySupport { private final PathBuilder builder; private @Nullable EntityManager entityManager; private @Nullable Querydsl querydsl; 2. from절부터 시작 바로 from부터 시작. select를 마지막에 //from절부터 시작. List result = from(me..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/oxvt6/btrd1P6olSK/uOZ0kg723dK5jnyeztPgWK/img.png)
해당 기능은 제약이 커서 실무에서 사용하기에는 현실적으로 어려움..ㅜㅜ 1. 인터페이스 지원 : QuerydslPredicateExecutor Repository가 QuerydslPredicateExecutor을 상속받으면 메서드에 Querydsl에서 사용하는 조건을 넘겨줄 수 있다. @Test public void querydslPredicateExecutorTest(){ Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("membe..
1. Controller개발 @GetMapping("/v2/members") public Page searchMemberV2(@ModelAttribute MemberSearchCondition condition, Pageable pageable){ return memberRepository.searchPageSimple(condition, pageable); } @GetMapping("/v3/members") public Page searchMemberV3(@ModelAttribute MemberSearchCondition condition, Pageable pageable){ return memberRepository.searchPageComplex(condition, pageable); } Query..
1. CountQuery 최적화 PageableExecutionUtils.getPage(content, pageable, () -> ~.fetchCount()) CountQuery를 날릴려면 fetchCount()가 호출 되어야 함. PageableExecutionTuils.getPage()를 통해 count 쿼리가 생략 가능한 경우는 Countquery 생략 페이지 시작이면서 컨텐츠 사이즈가 페이지 사이즈보다 작을 때 마지막 페이지 일 때 (offset + 컨텐츠 사이즈를 더해서 전체 사이즈 구함) @Override public Page searchPageComplex(MemberSearchCondition condition, Pageable pageable) { //content를 바로 가져오고. L..
1. SpringData Paging 활용 스프링 데이터의 Page, Pageable을 활용해보자. 전체 카운트를 한번에 조회하는 단순한 방법 데이터 내용과 전체 카운트를 별도로 조회하는 방법 2. 인터페이스에 두 가지 기능 추가 public interface MemberRepositoryCustom { List search(MemberSearchCondition condition); Page searchPageSimple(MemberSearchCondition condition, Pageable pageable); Page searchPageComplex(MemberSearchCondition condition, Pageable pageable); } 3. 전체 카운트를 한번에 조회하는 단순한 방법 s..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bem0eH/btrd22czctq/b8cqpEFxcKSnznUvBxiTUK/img.png)
1. SpringDataJPA 적용 public interface MemberRepository extends JpaRepository { List findByUsername(String username); } 2. 사용자 정의 Repository Querydsl을 사용하려면 사용자 정의 Repository 사용 필요함. 사용자 정의 리포지토리 사용법 사용자 정의 인터페이스 작성 사용자 정의 인터페이스 구현 스프링 데이터 리포지토리에 사용자 정의 인터페이스 상속 MemberRepository 가 MembeRepositoryCustom을 상속 받기 때문에 search() 사용 가능. spring 에서 자동으로 구현체 매핑해줌. 2.1 MemberRepository public interface Member..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bs5bH8/btrd0GogqJa/6UsojgbmNGjJTXhdfllND0/img.png)
데이터 확인을 위해서 샘플 데이터를 추가하자. 테스트케이스 실행에 영향을 주지 않기 위해 톰캣이 돌아갈 때만 샘플 데이터가 들어가도록 설정하자. --> 테스트케이스, 톰캣의 프로파일 분리 1. 프로파일 설정 main.resources.application.yml test.resources.application.yml 2. 샘플 데이터 추가 @Profile 을 통해 application.yml의 active와 대응됨. @PostConstruct : bean 생성 이후 해당 메서드 실행. JPA 데이터 변경은 Transaction안에서 이루어져야함 @Profile("local") @Component @RequiredArgsConstructor public class InitMember { private fi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ONAps/btrd0GodolT/7OfUE86WdB5LyY8CVK9b41/img.png)
1. Builder @Data public class MemberTeamDto { private Long memberId; private String username; private int age; private Long teamId; private String teamName; public MemberTeamDto() { } @QueryProjection public MemberTeamDto(Long memberId, String username, int age, Long teamId, String teamName) { this.memberId = memberId; this.username = username; this.age = age; this.teamId = teamId; this.teamName..