본문 바로가기

분류 전체보기138

[Spring Data JPA] @EntityGraph @EntityGraph해당 애노테이션은 JPA에서 연관관계가 있는 엔티티를 조회 시 fetch join으로 한 번에 로드할 수 있도록 한다.일반적으로 jpql을 사용하면 fetch join을 아래와 같이 사용할 수 있다.@Query("select m from Member m left join fetch m.team")List findMemberFetchJoin();Spring Data JPA는 @EntityGraph 애노테이션은 통해 JPQL 없이 Fetch join이 가능하도록 할 수 있다.LEFT OUTER JOIN을 사용하며, attributePaths = {”함께 로드할 연관된 엔티티”} 처럼 사용한다.// JPA가 지원하는 공통 메서드와 함께 사용@Override@EntityGraph(attri.. 2024. 12. 30.
[Spring Data JPA] @Modifying @ModifyingSpring Data JPA에서 데이터베이스의 데이터를 수정하는 쿼리를 정의할 때 사용되는 애노테이션으로 @Query 애노테이션과 함께 변경이 일어나는 작업을 수행하는 메서드에 사용한다. 이는 벌크 연산 시 사용한다. 벌크 연산데이터베이스에서 대량의 데이터를 Update, Delete 하기 위한 작업으로 이는 JPA에서 변경 감지를 통해 변경되는 것이 아니라 한 번에 Update 쿼리를 날리는 작업을 의미한다.즉 Entity의 Life-cycle을 무시하고 쿼리가 실행되므로 영속성 컨텍스트 관리에 주의해야 한다.(jdbc 템플릿, mybatis 처럼 jdbc를 직접 날리는 것도 Jpa는 인식하지 못하므로 영속성 컨텍스트를 플러시나 초기화를 해주어야 한다.) 앞서 말했다 시피 벌크 연산은.. 2024. 12. 30.
[Spring Data JPA] Page, Slice 먼저 페이징을 위해선 메서드에서 Pageable을 인자로 받아야 한다.Pageable은 인터페이스로 페이징을 위한 정보를 저장하는데 대표적인 구현체인 PageRequest의 생성자를 보면 다음과 같다.protected PageRequest(int page, int size, Sort sort) { super(page, size); Assert.notNull(sort, "Sort must not be null"); this.sort = sort;}page : 페이지 번호 (0부터 시작)size : 해당 페이지의 데이터의 개수sort : 정렬 기준Spring Data JPA는 페이징을 처리할 때 컨트롤러에서 파라미터로 인터페이스인 Pageable을 받을 수 있다.@GetMapping("/me.. 2024. 12. 29.
[JPA] OSIV(Open Session In View) OSIV최초 데이터베이스 커넥션 시작 시점(트랜잭션 시작)부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지시키는 기능이다.이로 인해 View Template이나 API 컨트롤러에서 지연 로딩이 가능해진다.(지연 로딩은 영속성 컨텍스트가 살아있어야 하고, 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지)하지만 해당 기능은 오랜 시간 데이터베이스 커넥션 리소스를 사용하므로 실시간 트래픽이 중요한 애플리 케이션에서는 커넥션이 모자라 장애로 이어지는 문제가 발생할 수 있다. OSIV를 끄면 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환.즉 View template에서는 지연 로딩이 동작하지 않기에 모든 지연 로딩을 트랜잭션 끝나기 전에 강제로 호출해.. 2024. 12. 29.
[JPA] JPQL JPQL객체 지향적인 방식으로 데이터베이스에 접근할 수 있도록 도와주는 쿼리 언어로 테이블이 아니라 엔티티를 대상으로 한다.JPQL은 SQL을 추상화하여 만들었기 때문에 데이터베이스 벤더에 독립적SQL과 문법이 유사하다. (SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원)엔티티 객체를 중심으로 개발 가능JPQL 문법select m from Member as m where m.age > 18엔티티와 속성은 대소문자 구분 필요JPQL 키워드는 대소문자 구분 X별칭이 필수 (as 생략 가능)테이블 이름이 아닌 엔티티 이름을 사용select COUNT(m), // 회원수 SUM(m.age), // 나이 합 AVG(m.age), // 평균 나이 MAX(m.age), // .. 2024. 12. 29.
[JPA] 데이터 타입 JPA의 데이터 타입은 크게 두 종류로 볼 수 있다.엔티티 타입@Entity로 정의하는 객체데이터가 변해도 식별자로 지속해서 추적 가능생명주기를 가지고 있으며, 공유 가능회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능값 타입int, Integer, String 같이 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고 값만 있으므로 변경 시 추적 불가공유하지 않는 것이 안전, 불변으로 만들어야 함값 타입의 종류기본 값 타입자바 기본 타입(int, double …)래퍼 클래스(Integer, Long …)String기본 값 타입은 생명 주기를 엔티티에 의존한다. (엔티티가 삭제되면 엔티티의 name, age 필드도 삭제)임베디드 타입(복합 값 타입)새로운 값 타입을 직접 정의 (주로 기본.. 2024. 12. 29.
[JPA] 영속성 전이, 고아 객체 영속성 전이란?특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용하는 기능이다.// ALL: 모두 적용// PERSIST: 영속// REMOVE: 삭제@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)이렇게 하면 부모 엔티티를 persist 시 자식 엔티티도 함께 저장되며, REMOVE 옵션을 적용 시 부모 엔티티를 삭제하면 자식 엔티티도 삭제된다.즉 부모 위주로 프로그래밍을 하거나, 부모 엔티티가 자식 엔티티의 생명 주기를 관리하고 싶은 경우 사용한다.고아 객체 제거고아 객체란 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 의미하며 orphanRemoval 기능은 해당 고아 객체를 자동으로 삭제한다.orphan.. 2024. 12. 29.
[JPA] 프록시, 로딩 전략 객체의 경우 연관된 객체들을 자유롭게 탐색할 수 있다. 하지만 데이터베이스의 경우 연관된 테이블을 조회하려면 JOIN을 해야하기 때문이다.이는 비용이 발생하며, 만약 연관된 테이블의 데이터를 사용하지 않는다면 더욱 더 낭비가 된다.따라서 해당 문제를 해결하기 위해 프록시가 등장하였다.프록시는 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아닌, 실제 사용하는 시점에 조회할 수 있도록 한다.프록시란위임, 대리라는 의미로 JPA에선 데이터베이스를 통해서 조회한 실제 엔티티 객체말고 데이터베이스 조회를 미루는 역할을 수행하는 가짜 엔티티 객체를 의미한다.실제 클래스를 상속해서 만들어지므로 실제 클래스와 겉모습이 유사프록시 객체는 실제 객체의 참조(target)를 보관함.따라서 프록시 객체를 호출하면 해.. 2024. 12. 29.
[JPA] N + 1 문제 N + 1 문제N + 1 문제란 연관관계에서 발생하는 문제로 연관 관계가 설정된 엔티티를 조회할 때 조회된 데이터 갯수(n 개) 만큼 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 것을 의미한다.예를 들어 1개의 게시물에 10개의 댓글이 존재하고, 게시글과 댓글의 관계가 1 : N 관계일 때 해당 게시글을 조회하면 10개의 댓글에 대한 쿼리가 나가는 경우를 의미한다. N+1이 발생하는 이유?JPA는 메서드 이름을 분석한 뒤 JPQL을 생성하여 실행하게 된다. JPQL은 특정 SQL에 종속되지 않고 엔티티 객체와 필드 이름을 가지고 쿼리를 날리기 때문에 findAll()이란 메소드를 수행하였을 때 해당 엔티티를 조회하는 select * from board 쿼리만 실행하게 된다. 이후 결과를 받아 엔티티의 .. 2024. 12. 29.