본문 바로가기

Spring boot

(33)
QueryDSL 데이터 조회 시, Entity, Tuple, DTO 사용법 + 각 장단점 QueryDSL은 select 절에서 원하는 컬럼만 조회할 수 있다. (DB와 서버 사이에 사용하는 네트워크 사용량도 줄고 물론 속도도 줄어듦) 데이터를 조회할 때, Entity나 Tuple을 직접 조회하거나 DTO를 사용해 데이터를 조회해오는 방법이 있다. 모두 장단점이 있으니, 아래에서 설명해보겠다. Entity 사용하기 Entity 조회시 Hibernate 캐시, 불필요한 컬럼 조회, OneToOne N+1 쿼리 등 단순 조회 기능에서는 성능 이슈 요소가 많다. (OneToOne 관계는 null인 경우 때문에 Lazy Loading을 허용하지 않음. 따라서 연관된 entity전체가 아닌 entity의 id만 필요해도 entity 전체를 조회함 => store.image.id.as("imageId")..
[Spring boot] 쿼리 속 ? 인자 확인하는 방법 Spring boot 3.0.5 기준! application.yml에 추가 spring: jpa: properties: hibernate: # show_sql: true format_sql: true logging: level: org.hibernate.SQL: debug org.hibernate.orm.jdbc.bind: trace
외래키 참조 쿼리 비교(findByMemberId, findByMember) 프로젝트를 진행할 때 쿼리를 하나하나 살펴보는 편인데... 문뜩 의문점 발견했습니당 member entity가 team을 가진다고 하면, findByTeamId와 findByTeam 쿼리가 다르게 나가는 것을 알았습니다..! teamId로 찾을땐 left outer join을 하길래 무슨 차이일지, 실무에서는 어떤 것을 더 많이 사용하는지 궁금했습니다. 이 차이를 언급하며 내 인프런 교수님 영한님께 여쭤봤을땐 이 대답을 들었고 저 강의를 참고하면 // findByTeam Team team = em.find(Team.class, 1L); String qlString = "select m from Member m where m.team = :team"; List resultList = em.createQue..
[spring boot] 벌크성 수정 쿼리 // member repository @Modifying(clearAutomatically = true) @Query("update Member m set m.age = m.age + 1 where m.age >= :age") int bulkAgePlus(@Param("age") int age); @Modifying : jpa에서 .excuteUpdate와 동일, update 쿼리는 @Modifying 필수 벌크성 쿼리 실행 후 영속성 컨텍스트 초기화: @Modifying(clearAutomatically = true) (기본값은 false ) 따로 flush, clear 안 해도 됨. 반환타입 : int // test @Test public void bulkUpdate() throws Exception..
[spring boot] 페이징과 정렬 페이징과 정렬 파라미터 org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함) org.springframework.data.domain.Sort : 정렬 기능 특별한 반환 타입 org.springframework.data.domain.Page : 추가 count 쿼리 결과를 포함하는 페이징 org.springframework.data.domain.Slice : 추가 count 쿼리 없이 다음 페이지 유무만 확인 가능 (내부적으로 limit+1 조회) List (자바 컬렉션) : 추가 count 쿼리 없이 결과만 반환 페이징과 정렬 사용 예제 Page findByUsername(String name, Pageable pageable); //tota..
[spring boot] 반환 타입 스프링 데이터 JPA는 유연한 반환 타입 지원 List findByUsername(String name); //컬렉션 Member findByUsername(String name); //단건 Optional findByUsername(String name); //단건 Optional 조회 결과가 많거나 없으면? (ex. 특이한 이름을 찾는 경우) 컬렉션 결과 없음: 빈 컬렉션 반환 단건 조회 결과 없음: null 반환 결과가 2건 이상: javax.persistence.NonUniqueResultException 예외 발생
[spring boot] 파라미터 바인딩 위치 기반 이름 기반 (무조건 이름 기반 사용하자) 위치, 이름 기반의 차이 파라미터 바인딩 @Query 속 :name에 집중 import org.springframework.data.repository.query.Param public interface MemberRepository extends JpaRepository { @Query("select m from Member m where m.username = :name") Member findMembers(@Param("name") String username); } 위치기반은 순서 실수가 일어날 수 있음. 컬렉션 파라미터 바인딩 Collection 타입으로 in절 지원 @Query("select m from Member m where m.user..
[spring boot] @Query, 메서드 이름으로 생성, NamedQuery 스프링 데이터 JPA가 제공하는 기능 (사용 순위) @Query 어노테이션을 사용해서 repository interface에 쿼리 직접 정의 메소드 이름으로 쿼리 생성 (메서드 이름에 파라매터 많아지면 지저분) 메소드 이름으로 JPA NamedQuery 호출 1. @Query, 리포지토리 메소드에 쿼리 정의하기 //member repository public interface MemberRepository extends JpaRepository { @Query("select m from Member m where m.username= :username and m.age = :age") List findUser(@Param("username") String username, @Param("age") int..