본문 바로가기

반응형

Tech/JPA

(11)
[JPA] LazyInitializationException 과 OSIV 테스트 코드를 작성하다가 LazyInitializationException 에러가 발생하였다. 이슈에 대해서 찾아보니 JPA 의 lazy loading 과 관련된 이슈였으며, @Transactional 등을 사용하여 해결할 수 있었다. 오늘은 해당 이슈가 발생하고 이를 해결하면서 가졌던 의문점과 이에 대한 설명을 정리해본다. 1. LazyInitializationException 에러 설명 및 발생 원인 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.msa.dataset.domain.entity.Project.categories: could not initialize proxy ..
[JPA] JPQL 경로표현식과 fetch join 1. 경로 표현식 JPA 에서 경로 표현식은 엔티티 객체에 점을 찍어 객체 그래프를 탐색하는 방식을 의미한다. 경로 표현식을 통해서 엔티티가 가지고 있는 값들, 필드에 접근할 수 있다. 경로 표현식을 통해서 접근하는 필드는 기본 값 데이터를 저장하는 상태 필드와 연관관계 매핑으로 연결된 객체를 저장하는 연관 필드로 구분된다. - 상태 필드 단순히 값을 저장하기 위한 필드이다. 더이상 탐색을 할 수 없는 경로 탐색의 마지막 필드이다. # JPQL select m.username, m.age from Member m # SQL select m.username, m.age from Member m - 연관 필드 연관 관계를 저장하는 필드. 연관관계의 매핑 형식에 따라 단일 값 연관 필드와 컬렉션 값 연관 필드..
[JPA] JPQL 기본 문법 1. JPQL JPQL 은 SQL 을 추상화하여 사용하는 객체지향 쿼리 언어이다. 따라서 테이블을 대상으로 하지 않고 엔티티 객체를 대상으로 쿼리를 수행한다. 또한 추상화를 통해서 특정 데이터베이스 SQL 에 의존되지 않게 개발할 수 있다. 실제 수행할 때는 JPQL 로 작성한 쿼리가 매핑정보 등을 통해서 SQL 로 변환되어 DB 에 수행된다. 2. JPQL 기본 문법 JPQL 의 문법은 SQL 과 유사하다. 다만 다른점은 테이블의 이름이 아니라 엔티티의 이름을 사용한다는 것이다. 아래의 예시에서 Member 는 테이블이 아닌 엔티티 클래스의 이름이다. // Member 는 테이블이 아닌 엔티티이다. em.createQuery("select m from Member as m where m.age > 18..
[JPA] 값 타입 JPA 의 데이터 타입 1. 엔티티 타입 - @Entity 로 정의하는 객체 - 식별자 (id) 를 가지고 있어서 데이터가 변해도 식별자로 추적가능 2. 값 타입 - int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 - 식별자가 없고 값만 있으므로 변경시 추적 불가 값 타입 분류 1. 기본값 타입 자바에서 제공하는 기본 데이터 타입을 의미한다. 자바의 primitive type, wrapper class, String 등을 포함하는 값 타입이다. String name, int age 와 같이 엔티티에 정의되어 있는 기본 타입의 값들이다. 이러한 타입의 값들은 다른 엔티티와 공유해서는 안된다. 값 복사를 통해서 사용해야 한다. 그 이유는 공유된 값들이 변경됨으로 발..
[JPA] 영속성 전이 (CASCADE) 1. 영속성 전이 (CASCADE) 특정 엔티티를 영속상태로 만들 때 연관관계에 있는 엔티티도 함께 영속상태로 만들기 위해서 사용한다. 예를들어 부모 엔티티가 영속화 될 때 자식 엔티티도 영속화 되도록 한다. CASCADE 를 설정한다고 해서 연관관계를 매핑에 변동은 없다. 다만 연관관계가 매핑되어 있을때 연관된 객체들의 영속화를 편리하게 해주는 것 뿐이다. 연관관계 매핑 어노테이션에서 cascade 옵션을 사용하여 지정한다. @OneToMany(mappedBy="parent", cascade=CascadeType.ALL) private List children = new ArrayList(); 2. CASCADE 종류 - CascadeType.ALL: 모든 Cascade 를 적용한다. - Cascade..
[JPA] 프록시와 지연로딩 1. 프록시 프록시 사용 이유 다른 엔티티와 연관관계를 가지고 있는 엔티티의 객체를 조회하는 경우 연관관계가 있는 객체들도 조회하게 된다. 이 경우에 불필요한 객체들이 함께 조회되면서 리소스 낭비가 발생하게 될 수 있다. JPA 에서는 이러한 문제를 프록시와 지연로딩을 사용하여 해결한다. 프록시 객체 조회 엔티티를 조회하는 방식으로는 다음의 두가지가 있다. em.find(): 바로 DB 에서 조회하여 실제 엔티티 객체 조회. em.getReference(): DB 조회를 미루고 가짜 (프록시) 엔티티 객체 조회. 해당 객체의 필드를 조회하는 경우에 쿼리를 수행하여 DB 조회를 수행한다. 프록시 엔티티는 실제 클래스를 상속받아서 생성된다. 실제 클래스와 형태가 같아서 사용자 입장에서 실제 객체인지 프록시 ..
[JPA] 상속관계 매핑 상속관계 매핑 객체는 부모 클래스와 자식 클래스의 상속관계가 있지만, 관계형 데이터베이스는 상속관계가 존재하지 않는다. 대신 데이터베이스에는 슈퍼타입, 서브타입 관계라는 모델링 기법이 있는데, 이 기법이 객체의 상속과 유사한다. 이 방법을 객체의 상속과 매핑하여 상속관계를 구현한다. ※ 슈퍼타입 - 서브타입 모델링 공통 속성을 가진 여러개의 데이터들이 존재할 때, 이들을 어떻게 관리할 것인지에 대한 방법이다. 슈퍼타입 모델링은 전체 데이터를 하나의 슈퍼 테이블로 관리하는 방식이다. 이 방식으로 관리하는 경우, 전체 검색에 유리하지만 공통 속성을 제외한 나머지 속성에 대해서 NULL 값이 저장되는 단점이 있다. 서브타입 모델링은 각 데이터들을 공통 속성 + 서브 속성으로 각각의 서브타입별로 데이터를 저장하..
[JPA] 연관관계 매핑 종류 객체간의 연관관계를 매핑할 때는 다음의 요소들을 고려해야한다. 1. 다중성 - 1:1, 1:N, N:1, N:M 2. 방향성 - 단방향, 양방향 3. 연관관계의 주인 위의 요소들을 고려하여 JPA 에서는 다양한 연관관계 매핑을 사용할 수 있다. 1. 다대일 [N:1] 다대일 단방향 여러개의 객체가 하나의 객체를 참조하는 구조이다. 데이터베이스 테이블의 관계에서는 N 에 해당하는 테이블이 1 에 해당하는 테이블의 키를 외래키로 가진다. 객체의 연관관계에서는 외래키가 있는 테이블의 객체가 1 에 해당하는 테이블을 참조하여 매핑한다. @ManyToOne, @JoneColumn 등의 어노테이션을 사용하여 구현한다. @Entity public class Team { @Id @GeneartedValue @Colum..

반응형