본문 바로가기

JPA

(8)
[JPA] SpringDataJPA - OSIV [JPA] SpringDataJPA - OSIV and etc.. 지연로딩으로 인해 프록시 객체가 들어있는 엔티티를 트랜잭션 범위 밖에서 초기화 하려고하면 에러가 발생한다. 스프링에서는 이런 문제를 해결하기위해, OSIV라는 방법을 제공하는데, 그 전에, API를 사용하지않고, 해결하는 방법을 알아보자. 미리 초기화, Facade, DTO만 넘기기 첫번째 해결법은 트랜잭션 범위가 끝나기전에 엔티티를 미리 초기화 하는 것 이다. 이 방법은 관리해야할 트랜잭션 범위가 OSIV보다 적어서 디버깅이 편하지만, 코드량이 늘어나는 단점이 있다. 또한, 뷰에 맞는 최적화 코드를 추가로 생성해야 하므로, 코드끼리의 논리적인 의존도가 증가할수있다. 예를들어, 뷰 A는 user1엔티티만 필요하고, 뷰 B는 user1엔티티..
[JPA] 지연로딩과 영속성전이 JPA 연관관계 관리 비즈니스로직을 분석해보니, 대부분의 로직에선 엔티티 A만 필요했다. 이런 상황에서, 엔티티 A에 연관되어있는 엔티티 B까지 같이 메모리에 올리는것은 비 효율적이며, 성능또한 느리게 한다. JPA는 즉시로딩과 지연로딩이라는 기법을 통해, 연관 엔티티의 로딩시점을 정할수있도록 해준다. JPA 프록시 지연로딩을 이해하기위해선, 하이버네이트에서 제공하는 프록시를 이해해야한다. public void 테스트1(){ EntityA entityA = em.getReference(EntityA.class,"e1"); } public void 테스트2(){ EntityA entity1 = em.find(EntityA.class, "e1"); EntityA entity2 = em.getReference..
[JPA] 고급 매핑 - 상속 관계, 복합키와 식별 관계 1. 상속관계 매핑 많이 사용되는 상속관계 매핑에는 3가지 종류가 있다. - 조인 전략 - 단일 테이블 전략 - 자식 테이블에게 매핑 정보만 제공 - 조인 전략 조인 전략은 엔티티 각각을 테이블로 만들고 자식 엔티티가 부모 엔티티의 기본키를 받아서 기본키 + 외래키로 이용하는 전략이다. 테이블을 조회할때, Join을 이용해 상속관계를 표현한다. @Entity @Inheritance(startegy = InheritanceType.JOINED) @DiscriminatorColumn(name = "DTYPE") public class Entity1{ @ID @GeneratedValue @Column(name = "ENTITY_1_ID") private Long id; } @Entity @Discriminat..
[JPA] 연관관계 매핑 연관관계 매핑 1. @OneToMany, @ManyToOne @OneToMany와 @ManyToOne은 이름 그대로, 일대다, 다대일 연관관계를 정의한다. 우선 단방향 연관관계 매핑과 양방향 연관관계 매핑 코드를 살펴보자. /* 단방향 연관관계 매핑 */ @Entity public class A{ @Column(name=B) @ManyToOne @JoinColumn(name="B_ID") private B b; } @Entity public class B{ @Id @Column(name="B_ID") private Long bId; } 1. 연관관계 매핑 어노테이션인 @ManyToOne, @OneToMany...은 자신의 상태를 앞에 작성한다. 따라서, 위 코드에서는 A가 Many, B가 1에 해당한다...
[JPA] 필드와 컬럼 매핑 필드와 컬럼 매핑 객체의 필드와 데이터베이스의 컬럼을 매핑하는 방법에 대해 알아보겠다. 1. @Column 객체필드를 테이블 컬럼에 매핑한다 주요 속성들 - name = String -> 테이블 컬럼에 매핑될때의 이름을 정의한다. - nullable = boolean -> null값 허용 여부를 선택한다 - unique = boolean -> 한 컬럼에 유니크 제약조건을 걸때 사용한다. - length = int -> String값에만 사용하며, 최대 길이를 설정한다. 예시 @Entity @Table(name = "USER") public class User extends CommonDate{ @Id @GeneratedValue @Column(name = "ID") private Long id; @Col..
[JPA] JPA 영속성 컨텍스트 JPA를 사용하면, EntityManagerFactory에서 EntityManager를 얻고, EntityManager를 이용해, DB관련 작업을 처리한다. EntityManager는 영속성 컨텍스트를 만드는데, 영속성 컨텍스트는 엔티티를 저장하고, 관리하는 등의 역할을 한다. 영속성 컨텍스트 영속성 컨텍스트를 사용하면, 다음 이점이 있다. 1. 1차캐시 2. 동일성 보장 3. 트랜잭션을 지원하는 쓰기 지연 4. 변경감지 5. 지연로딩 1차캐시 영속성 컨텍스트는 내부에 캐시를 갖고있다. DB에 flush를 하기위해, 영속성 컨텍스트에 persist한 엔티티나 DB에서 가져온 엔티티를 저장하며, 해당 엔티티를 "영속화"상태로 만든다. 영속화 상태인 엔티티는 영속성 컨텍스트에 의해 관리되며 많은 이점을 누릴..
[JPA] JPA 성능최적화 - N+1문제 JPA 프로그래밍을 할때, 성능상 가장 주의해야할점은 N+1 문제다. N+1문제란, 연관관계에서 발생하는 문제점으로, 연관관계를 조회할경우, 해당 연관관계의 사이즈만큼 SQL쿼리를 만들어 날리는 것을 말한다. 즉시로딩 아래 코드를 보자. (동작 여부는 상관없이 플로우를 보도록하자) @Entity class TestEntity{ @Id @GeneratedValue @Column(name = "ID") private id; @OneToMany(fetch = FetchType.EAGER, mappedBy = "testEntity") private List lists = new List(); } public class EntityTest{ /.../ @Test public void N+1테스트(){ em.fin..
[JPA] JPA란? - 패러다임의 불일치 JPA JPA는 자바 진영의 ORM기술 표준이다. JPA또한 내부적으로 JDBC API를 사용하며, 애플리케이션과 JDBC사이에서 동작한다. JPA를 사용함으로써, 아래에서 설명할 패러다임의 불일치 문제를 거의 대부분 해결할수있으며, 생산성 또한 향상시킬수있다. SQL - 관계지향 패러다임과 객체지향 패러다임의 불일치로 발생하는 문제점 1. 객체 그래프탐색에서의 불편함 SQL은 처음 작성한 SQL문에 따라서, 탐색범위가 결정된다. 하지만, 객체는 한 객체를 한번 참조함으로써, 그 객체가 참조하는 다른 객체를 전부 참조할수있다. 외래키만 저장한 가상의 테이블 A, B, C, D, E, F 가 있고, 각각 외래키를 통해 다음과 같이 연결되어있다. A - B - C - D - E - F 이를 객체로 표현하면 ..