본문 바로가기

반응형

JPA

(8)
[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 ..
[Spring] Database 연동 - 4 (JPA) 1. JPA JPA 는 Java Persistence API 의 줄임말로 Java 표준 ORM 인터페이스이다. ORM 은 Object Relational Mapping 의 줄임말로 객체와 RDB 를 매핑하는 기술이다. 객체와 DB 를 매핑하면서 SQL 쿼리 중심이 아닌 객체 중심의 코딩을 할 수 있도록 한다. JPA 는 Java 표준 ORM 인터페이스로 JPA 의 기능을 사용하면 기존의 반복적인 코드는 물론이고 기본적인 SQL 쿼리를 자동으로 생성해주어 코드를 간결하게 유지할 수 있다. 또한 JPA 를 사용하여 데이터를 객체와 매핑하게 되면, SQL 과 데이터 중심의 설계에서 Java 언어와 객체 중심의 설계로 전환할 수 있다. 2. 환경 설정 JPA 를 사용하기 위해서는 application 의 라이브..
[JPA] 값 타입 JPA 의 데이터 타입 1. 엔티티 타입 - @Entity 로 정의하는 객체 - 식별자 (id) 를 가지고 있어서 데이터가 변해도 식별자로 추적가능 2. 값 타입 - int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 - 식별자가 없고 값만 있으므로 변경시 추적 불가 값 타입 분류 1. 기본값 타입 자바에서 제공하는 기본 데이터 타입을 의미한다. 자바의 primitive type, wrapper class, String 등을 포함하는 값 타입이다. String name, int age 와 같이 엔티티에 정의되어 있는 기본 타입의 값들이다. 이러한 타입의 값들은 다른 엔티티와 공유해서는 안된다. 값 복사를 통해서 사용해야 한다. 그 이유는 공유된 값들이 변경됨으로 발..
[JPA] 프록시와 지연로딩 1. 프록시 프록시 사용 이유 다른 엔티티와 연관관계를 가지고 있는 엔티티의 객체를 조회하는 경우 연관관계가 있는 객체들도 조회하게 된다. 이 경우에 불필요한 객체들이 함께 조회되면서 리소스 낭비가 발생하게 될 수 있다. JPA 에서는 이러한 문제를 프록시와 지연로딩을 사용하여 해결한다. 프록시 객체 조회 엔티티를 조회하는 방식으로는 다음의 두가지가 있다. em.find(): 바로 DB 에서 조회하여 실제 엔티티 객체 조회. em.getReference(): DB 조회를 미루고 가짜 (프록시) 엔티티 객체 조회. 해당 객체의 필드를 조회하는 경우에 쿼리를 수행하여 DB 조회를 수행한다. 프록시 엔티티는 실제 클래스를 상속받아서 생성된다. 실제 클래스와 형태가 같아서 사용자 입장에서 실제 객체인지 프록시 ..
[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..
[JPA] 연관관계 매핑 (2) - 양방향 연관관계 1. 양방향 연관관계 양방향 연관관계는 두 객체가 서로 상대편을 참조하고 있는 연관관계를 의미한다. 기존의 단방향 연관관계에서는 참조하는 객체만 반대편 객체를 외래키와 매핑하여서 참조하고 있었다. 하지만 양방향 연관관계에서는 참조되는 객체도 참조하는 객체를 바라보고 있어서 반대 방향에서도 객체 그래프 탐색이 가능하다. // 참조되던 쪽에서는 참조하는 쪽을 바라보기 위한 멤버가 추가된다. class Team { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "team") // 일대다 관계. Member 객체의 team 에 매핑된다. List members = new ArrayList(); // 해당 team 에 해당하는 member 들을 List ..
[JPA] 연관관계 매핑 (1) - 단방향 연관관계 DB 에서는 테이블의 외래키를 이용하여 테이블간의 연관관계를 구성한다. JPA 는 전통적인 테이블 간의 관계를 객체간의 연관관계로 매핑시켜준다. 객체의 참조변수와 테이블의 외래키를 매핑시켜서 연관관계를 객체지향적으로 변환시켜준다. JPA 에서 연관관계는 방향에 따라서 단방향, 양방향으로 구분이 되며, 서로의 연관을 가지는 객체의 개수 (다중성, multiplicity) 에 따라서 다대일, 일대다, 일대일, 다대다 등으로 구분이 된다. 또한 양방향 연관관계에서 연관관계의 주인, owner 를 지정하여 어떤 객체가 해당 데이터의 관리 권한을 가질 것인가를 결정한다. 1. 연관관계의 필요성 객체의 연관관계가 없이 테이블의 연관관계를 기반으로 설계를 하게되면 객체지향적인 설계를 할 수가 없어진다. 테이블은 외래..
[JPA] 영속성 관리 JPA 는 영속성 컨텍스트를 통해서 객체와 DB 사이의 entity 를 관리한다. 영속성 컨텍스트는 entity manager 에 의해 관리되는데, 이를 통해서 애플리케이션과 데이터베이스 사이에서 데이터가 처리된다. - EntityManagerFactory 애플리케이션 로딩 시전에 DB 당 하나만 생성되는 팩토리이다. 요청이 있을 때마다 EntityManager 를 생성한다. - EntityManager 영속성 컨텍스트를 관리하는 객체이다. 실제 transaction 단위를 수행할 때마다 생성하는데, DB Connection 을 통해서 DB 에 접근한다. 1. 영속성 컨텍스트 (Persistence Context) 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이다. 애플리케이션과 데이터베이스 사이에서 엔..

반응형