일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 |
- 자바의 정석
- JPQL
- 성능최적화
- 페치조인
- 데이터모델링
- 오라클
- 엔티티
- 스프링 컨테이너
- fetch join
- JPA
- 스프링
- 서브쿼리
- 값 타입
- 컬렉션 조회 최적화
- 친절한 SQL 튜닝
- 정렬
- 페이징
- INDEX SCAN
- querydsl
- @MappedSuperclass
- 그룹함수
- TCP/IP
- 데이터베이스
- SQL 튜닝
- 스프링 데이터 JPA
- DTO
- SQL
- Spring
- Spring data JPA
- index
- Today
- Total
목록분류 전체보기 (123)
nu_s
사용자 정의 Repository 스프링 데이터 JPA에서 제공하는 JpaRepository 인터페이스는 스프링이 구현체를 자동으로 생성해준다. 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 할 메서드들이 너무 많다. 다양한 이유로 인터페이스를 직접 구현하고 싶을 때 사용 JPA 직접 사용(EntityManager) 스프링 JDBC Template 사용 MyBatis 사용 데이터베이스 커넥션 직접 사용 Querydsl 사용 구현하는 방법 public interface MemberRepositoryCustom { List findMemberCustom(); } @RequiredArgsConstructor public class MemberRepositoryImpl implements M..

1. JPA Hint JPA 쿼리 힌트이다. (JPA 구현체에게 제공하는 힌트, SQL 힌트 X) 기본적으로 JPA를 이용해 데이터를 조회하게되면 영속성 컨텍스트에 의해 관리된다. 만약 값을 수정한 뒤 flush()하거나 변경 감지가 발생하면 업데이트 쿼리도 발생하게 된다. 이때 Hint를 사용하여 조회 용도(ReadOnly)로만 사용할 수 있다. 변경 감지에 드는 모든 비용을 사전에 차단해 성능을 최적화 할 수 있다. public interface MemberRepository extends JpaRepository { @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true")) Member findReadOnlyByU..
지연로딩 & 페치조인 이전에 JPA를 배울 때 부터 지연로딩은 항상 강조되었다. 그로 인해 발생하는 N + 1 문제를 해결하기 위해 페치 조인이라는 것을 사용해왔다. 그렇다면 스프링 데이터 JPA에서는 이 문제를 어떻게 해결할까? 바로 @EntityGraph를 사용하는 것이다. @Test public void findMemberLazy() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("membe..

벌크성 수정 쿼리 데이터 한 건 씩이 아닌 모든 데이터에 일관적인 업데이트를 날려야 하는 경우를 벌크성 수정 쿼리라 한다. JPA public int bulkAgePlus(int age) { return em.createQuery("update Member m set m.age = m.age + 1 where m.age >= :age") .setParameter("age", age) .executeUpdate(); } 스프링 데이터 JPA @Modifying @Query("update Member m set m.age = m.age + 1 where m.age >= :age") int bulkAgePlus(@Param("age") int age); 순수 JPA에서는 executeUpdate()를 사용했다..
페이징 & 정렬 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(int age) { return em.createQuery("select count(m) from Member m where m.age = :age", Long.class) .setParameter("age", age..

1. 파라미터 바인딩 파라미터 바인딩은 두가지 방식이 있다. select m from Member m where m.username = ?0 //위치 기반 select m from Member m where m.username = :name //이름 기반 위치 기반은 사용하지 말자 public interface MemberRepository extends JpaRepository { //파라미터 바인딩 @Query("select m from Member m where m.username = :name") Member findByNames(@Param("name") String name); //컬렉션 파라미터 바인딩 @Query("select m from Member m where m.username in..
쿼리메서드 이전에 쿼리 메서드에 대해 간단하게 언급했었는데, 조금 더 깊게 들어가보도록 하자 만약 도메인에 특화되어 있거나, 검색 조건이 들어간 쿼리는 어떻게 해결해야 할까? 이 방법을 해결하는 3가지 방법이 있다. 메서드 이름으로 쿼리 생성하기 메서드 이름으로 JPA NamedQuery 호출하기 @Query 어노테이션을 사용해서 리포지토리 인터페이스에 쿼리 직접 정의하기 1. 메서드 이름으로 쿼리 생성 메서드 이름을 분석해서 JPQL 쿼리를 실행한다. 이름과 나이를 기준으로 회원을 조회하려면 어떻게 해야할까? JPA 리포지토리 public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("sele..

JPA 지금까지 우리가 JPA를 사용하던 방식이다. EntityManager를 주입받아 엔티티를 영속성 컨텍스트에 관리할 수 있다. 지금도 편리해 보이지만 스프링 데이터 JPA를 사용하면 더 편리하게 코드를 작성할 수 있다. 스프링 데이터 JPA 스프링 데이터 JPA는 JPA를 사용할 때 반복되는 코드를 자동화 해준다. 스프링 데이터 JPA는 JpaRepository라는 인터페이스를 제공하는데, 여기에 기본적인 CRUD 기능이 모두 제공된다. MemberRepository // JpaRepository public interface MemberRepository extends JpaRepository { } T는 엔티티, ID는 엔티티의 식별자 타입을 넣어주면 된다. MemberRepositoryTest..