JPA(24)
-
스프링데이터 JPA[쿼리 메서드] - 페이징
페이징 사용 예) 1 2 3 4 5 6 Page findByUsername(String name, Pageable pageable); //count 쿼리 사용 Slice findByUsername(String name, Pageable pageable); //count 쿼리 사용 안 함 List findByUsername(String name, Pageable pageable); //count 쿼리 사용 안 함 List findByUsername(String name, Sort sort); cs org.springframework.data.domain.Sort: 정렬 기능 org.springframework.data.domain.Pageable: 페이징 기능(내부에 Sort 포함) org.springfr..
2021.02.06 -
스프링데이터 JPA[쿼리 메서드] - @Query 어노테이션 사용법
@Query JPQL을 정의할 수 있는 어노테이션 1. JPA의 @NamedQuery에 정의된 쿼리를 정의하여 사용할 수 있다. @Entity @NamedQuery(name="Member.findAll", query="select m from Member m") public class Member { ... } public interface MemberRepository extends JpaRepository { @Query(name = "Member.findAll") List findAll(); } 위 예제와 같이 NamedQuery의 이름과 레퍼지포리의 메서드 이름이 같은 경우 @Query 어노테이션 생략 가능. 2. 컬럼 리스트 조회하기 @Query("select m.username from Mem..
2021.02.06 -
스프링데이터 JPA[쿼리 메서드] - 메서드 이름으로 쿼리 생성 규칙, 반환타입
쿼리 메서드의 메서드명으로 쿼리 생성시 명명 규칙에 대해 알아보자. 메서드 명명 규칙 조회: find…By ,read…By ,query…By get…By 예:) findHelloBy 처럼 ...에 식별하기 위한 내용(설명)이 들어가도 된다. COUNT: count…By 반환타입 long EXISTS: exists…By 반환타입 boolean 삭제: delete…By, remove…By 반환타입 long DISTINCT: findDistinct, findMemberDistinctBy LIMIT: findFirst3, findFirst, findTop, findTop3 자세한 규칙은 레퍼런스를 참고하자. 메서드 명명 규칙 스프링 공식 레퍼런스: docs.spring.io/spring-data/jpa/docs..
2021.02.06 -
OSIV(OPEN SESSTION IN VIEW)란?
OSIV OSIV는 세션(JPA에서는 엔티티매니저)의 생명 주기를 설정할 수 있는 옵션이다. 엔티티 매니저는 데이터베이스 커넥션의 생명 주기를 같이 가지고 있어 엔티티 매니저가 생성될때 데이터 베이스 커넥션을 생성하여 엔티티 매니저가 사라질때 데이터 베이스의 커넥션은 반환된다. 엔티티 매니저는 트랜잭션 시작시 생성된다. spring.jpa.open-in-view: true (기본값) 데이터 베이스 커넥션, 엔티티 매니저가 트랜잭션 시작시 생성되고 컨트롤러에서 응답될때 데이터 베이스 커넥션 반환, 엔티티 매니저가 사라진다. 장점: 컨트롤러에서 지연로딩이 가능하다. (코딩이 편하다) 단점: 커넥션을 물고 있는 주기가 길어지고 커넥션을 빨리 반환하지 않으면 커넥션풀로 인해 장애로 이어질 수 있다. spring..
2021.02.04 -
컬렌션(일대다) SELECT 시, 주의점과 성능 최적화
컬렉션 조회의 문제점 일대다 관계의 컬렉션을 조회하게 될때 데이터는 기준 데이터(루트)보다 훨씬 많은 양의 데이터가 조회될 수 있다. 데이터 양도 문제지만 루트를 기준으로 페이징을 해야할때 데이터가 더 많아지기때문에 페이징이 불가능해진다. 컬렉션 조회 개선점 1. N+1 문제를 해결하기 위해 fetch조인을 고려하자 일대다 관계는 지연로딩을 기본으로 두고 있다. 루트를 조회하고 그 결과 개수에 따라 데이터를 가져오기 위해 프록시를 강제 초기화를 N번 수행하게 된다. 루트의 결과 데이터 개수에 따라 DB와의 커넥션 작업이 많아지게 되고 성능을 악화시키기 때문에 fetch 조인을 사용하여 한번의 쿼리로 데이터를 엔티티에 바인딩해주는 방법을 고려해보자. 일대다 관계이기 때문에 루트 데이터를 기준으로 엔티티를 ..
2021.02.04 -
엔티티에 setter를 사용하면 안되는 이유와 대체방안
엔티티에 setter를 열어두면 어떻게 될까? 보통 스프링은 여러가지 클래스 종류로 나눌수 있지만 대표적으로 Controller, Service, Repository, Domain 등 으로 분류할 수 있다. 엔티티는 도메인에 해당하며 여기서 만약 setter를 열어뒀다고 가정해보자. 엔티티에 setter로 필드 상태를 변경하고 트랜잭션이 종료되면 변경감지에 의해 update문이 나가게 된다. 그런데 Controller에서도 Entity를 생성하여 setter를 호출하고,,, Service에서도 호출하고,, 시스템이 복잡하다면 운영시 해당 Update문이 어디서 누구에 의해 발생했는지 추적하기가 굉장히 어려워진다. 그럼 setter를 열어두지 않고 어떻게 필드 상태를 업데이트 할 수 있을까? setter를..
2021.01.29