개-발/JPA , QueryDSL

Index 인덱스란 뭘까 ? 데이터베이스 인덱스는 추가 쓰기 및 저장 공간을 희생 하여 테이블에 대한 데이터 검색 작업의 속도를 향상시키는 데이터 구조입니다 . (DB에서 검색이 이루어 질땐 컴퓨터는 처음부터 끝까지 모든 데이터를 검색한다.) JPA에서 Index를 설정한다는 것은 대부분 단일 테이블에서 선택한 데이터 열을 복사하여 만들어 놓는다. 어떤 엔티티를 대상으로 사용해야 할까 ? * 중복도가 낮은 것 ! 주민번호 / 중복이 낮다. 성별 / 중복이 매우 높다. 같이 남 / 여 두가지만 존재하여 여러값들이 중복이 많은 데이터는 피해야 한다 ! * 크기가 큰 테이블 인덱스 설정 @Index @Target({}) @Retention(RUNTIME) public @interface Index { Str..
BooleanBuilder package study.querydsl.dto; import lombok.Data; @Data public class MemberSearchCondition { //회원명, 팀명, 나이(ageGoe, ageLoe) private String username; private String teamName; private Integer ageGoe; private Integer ageLoe; } Request 받을 DTO Wrapper 클래스(Integer)를 사용한 이유는 값이 null일 수도 있기 때문이다. public List searchByBuilder(MemberSearchCondition condition) { BooleanBuilder builder = new Bool..
BooleanBuilder BooleanBuilder는 Predicate를 구현하는 구현체이고 Predicate는 where절의 파라미터 타입입니다. 따라서 BooleanBuilder를 이용해 조건절을 추가한 뒤 where절에 전달하면되고, 이 부분을 동적으로 구현할 수 있습니다. 현재 Entity는 필드 수가 워낙 적어 경우의 수가 몇 가지 나오지 않으니 한 번 모두 테스트해보도록 하겠습니다. @SpringBootTest @Transactional class PlayerTest { @Autowired EntityManager entityManager; private JPAQueryFactory queryFactory; @BeforeEach void setup() { Team tottenhamHotspu..
순수JPA @Test public void findDtoJPQL() throws Exception { List result = em.createQuery("select new study.querydsl.dto.MemberDto(m.username,m.age) from Member m", MemberDto.class) .getResultList(); for (MemberDto memberDto : result) { System.out.println("memberDto = " + memberDto); } } 순수 JPA에서 DTO를 조회할 때는 new 오퍼레이션을 사용해야한다. DTO의 package path를 모두 적어줘야 한다. 생성자 방식만 지원한다. QueryDSL - 프로퍼티 접근 - 필드 접근 ..
Paging / Pagination DB에 저장된 데이터들을 페이지에 맞춰서 몇 개씩 뿌릴건지 알려주는 것 DB에 저장된 데이터가 20개이고 프론트에서 1페이지에 5개씩 이라고 요청하면 백엔드에서 전체 DB에서 데이터를 앞에서부터 5개씩 분류하여 해당 페이지에 맞는 데이터를 넘겨줌. JPA - Pageable 이를 위해서 JPA에서 Pageable이라는 객체를 제공하고있다. Pageable이란?Pageable 이 Pagination 요청 정보를 담기위한 추상 인터페이스 라는 의미/실제로 쓰기 위해서는 구현체가 필요 class QPageRequest : QueryDSL 을 위한 Pageable 구현체 class PageRequest : 가장 기본적인 Pageable 구현체 enum Unpaged : pag..
fetchResult (deprecated) 이전까지의 페이징 방법중 하나는 fetchCount()와 fetchResult()를 이용하는 방법이였다. 하지만 이는 단순히 count 처리하는 용도이기 때문에 QueryDSL에서는 이를 지원하지 않기로 결정했다고 한다. 따라서 count와 result를 더 효율적으로 이용하는 방법을 사용하자. List content = 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) ...
UserRepository는 JPARepository 와 UserRepositoryCustome(DSL)을 인터페이스화한다 그리곤 UserRepositoryCustome 를 구현해줄 UserRepositoryCustomeImpl class를 만들어 DSL을 구현하면 된다.
모아서 보내기 = flush 플러시 란? JPA는 엔티티를 영속성 컨텍스트에서 관리합니다. 영속성 컨텍스트에 있는 내용을 데이터베이스에 반영하는 것을 플러시라고 합니다. 보통 트랜잭션을 커밋하면 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화(등록create, 수정update, 삭제delete) 작업을 진행하게 됩니다. 엔티티 등록 EntityMaanger em = emf.createEnttiyManager(); ENtityTranscation transaction = em.getTransaction(); // 엔티티 매니저는 데이터 변경 시 트랜잭션을 시작해야한다. transaction.begin(); em.persist(memberA); em.persist(memberB); // 여기까지 Inse..
imSoo
'개-발/JPA , QueryDSL' 카테고리의 글 목록