나머지 기능들
·
BackEnd/스프링 데이터 JPA
Specifications(명세) 스프링 데이터 JPA는 JPA Criteria를 활용해서 이 개념을 사용할 수 있도록 지원한다. 술어(predicate) 참 또는 거짓으로 평가한다. AND OR 같은 연산자로 조합해서 다양한 검색조건을 쉽게 생성한다. (컴포지트 패턴) 스프링 데이터 JPA는 org.springframework.data.jpa.domain.Specification 클래스로 정의한다. 실무에서는 JPA Criteria를 거의 사용하지 않고 QueryDsl을 사용한다고 한다! Query By Example @SpringBootTest @Transactional public class QueryByExampleTest { @Autowired MemberRepository memberRepos..
스프링 데이터 JPA 분석
·
BackEnd/스프링 데이터 JPA
스프링 데이터 JPA 구현체 분석 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체는 org.springframework.data.jpa.repository.support.SimpleJpaRepository 이다. @Repository 적용 JPA 예외를 스프링이 추상화한 예외로 변환한다. JDBC를 JPA로 바꿔도 예외를 처리하는 매커니즘이 동일하다. @Transactional 트랜잭션 적용 JPA의 모든 변경은 트랜잭션 안에서 동작한다. 스프링 데이터 JPA는 변경(등록, 수정, 삭제) 메서드를 트랜잭션 처리한다. 서비스 계층에서 트랜잭션을 시작하지 않으면 리파지토리에서 트랜잭션 시작한다. 서비스 계층에서 트랜잭션을 시작하면 리파지토리는 해당 트랜잭션을 전파 받아서 사용한다. 그래서 스프링 데..
확장 기능
·
BackEnd/스프링 데이터 JPA
사용자 정의 리포지토리 구현 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성한다. 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많다. MemberRepositoryCustom public interface MemberRepositoryCustom { List findMemberCustom(); } MemberRepositoryImpl @RequiredArgsConstructor public class MemberRepositoryImpl implements MemberRepositoryCustom{ private final EntityManager em; @Override public List findMemberCustom() ..
@EntityGraph, JPA Hint @ Lock
·
BackEnd/스프링 데이터 JPA
저번 기본 편에서 연관된 다른 엔티티에 내용을 조회할 때 문제가 있었다. 실무에서는 모든 내용이 Lazy 로딩으로 되어 있어야 한다. 그 상태에서 연관된 다른 엔티티를 조회할 경우 프락시로 저장되어 있다. 그래서 그 엔티티 내용을 다시 조회할 때면 쿼리가 또 나가게 된다. 결국 N+1 문제가 발생한다. 이것을 해결한 것이 fetch join이다. fetch join은 연관된 엔티티도 조회할 때 클래스로 가지고 온다. 즉, N+1 문제가 해결되고 한방 쿼리로 모든 것을 가져오게 된다. 하지만 스프링 데이터 JPA에서 사용할려면 Query문을 새로 추가해 줘야 하고 매번 fetch join을 써줘야 한다. 그래서 스프링 데이터 JPA에서 지원해주는 것이 @EntityGraph 이다. EntityGraph 사..
벌크성 수정 쿼리
·
BackEnd/스프링 데이터 JPA
벌크성 수정 쿼리는 모든 지원의 연봉을 10%인상 하라는 것 처럼 한번에 모든 데이터를 관리할 때 사용한다. 순수 JPA public int bulkAgePlus(int age){ int resultCount = em.createQuery( "update Member m set m.age = m.age + 1" + " where m.age >= :age") .setParameter("age", age) .executeUpdate(); return resultCount; } 이 조건을 만족하는 데이터들은 모두 update한다. 스프링 데이터 JPA @Modifying @Query("update Member m set m.age = m.age + 1 where m.age >= :age") int bulkAg..
JPA 페이징 처리
·
BackEnd/스프링 데이터 JPA
순수 JPA 페이징과 정렬 다음 조건으로 페이징과 정렬을 사용하는 예제 코드를 생성해보자. 검색 조건: 나이가 10살 정렬 조건: 이름으로 내림차순 페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 3건 JPA 페이징 리포지토리 코드 public List findByPage(int age, int offset, int limit){ return em.createQuery("select m from Member m where m.age =:age order by m.username desc") .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } public long totalCount(i..