JPA

    데이터 접근 기술_JPA_Cascade, orphanRemoval

    Cascade Cascade란 JPA에서 제공하는 영속성 전이라는 기능이다. 영속성 전이는 특정 엔티티에 대해 작업을 수행하면 관련된 엔티티에도 동일한 작업이 수행된다는 의미이다. 일반적으로 작업이 직접 수행되는 엔티티를 부모 엔티티, 부모 엔티티와 관련되어 작업이 간접적으로 수행되는 엔티티를 자식 엔티티라고 부른다. 영속성 전이는 생명주기가 동일한 엔티티들에 적용하면 된다. 또한 자식 엔티티와 연관된 엔티티가 1개일 때만 적용해야한다. 그렇지 않을 경우 자식 엔티티가 다른 엔티티에 필요한 데이터임에도 불구하고, 부모 엔티티가 삭제 될 때 자식 엔티티가 함께 삭제되는 참사가 발생할 수 있다. 영속성 전이의 종류 영속성 전이의 종류에는 ALL, PERSIST, REMOVE, MERGE, DETACH, RE..

    데이터 접근 기술_JPA_Spring Data JPA

    Spring Data JPA 스프링 데이터 JPA(Spring Data JPA)는 모든 어플리케이션에서 공통적으로 사용되는 JPA 리포지토리 메소드를 인터페이스에 정의해두고, 엔티티 정보에 따라 자동으로 JPA 리포지토리 구현체를 생성해주는 라이브러리이다. 아래의 MemberJpaRepository와 MemberRepository를 살펴보자. MemberJpaRepository는 순수 JPA 리포지토리이다. 그리고 MemberRepository는 스프링 데이터 JPA 리포지토리이다. @Repository public class MemberJpaRepository { @PersistenceContext // 생성자 주입의 역할을 한다 private EntityManager em; public Member ..

    데이터 접근 기술_JPA_JPQL join, fetch join

    이번 글에서는 JPQL의 join과 fetch join에 대해 알아보자. 아래는 이번 글에서 사용할 엔티티들이다. Member(N)와 TeamForEager(1)는 다대일 단방향 연관관계를 가진다. Member(N)와 TeamForLazy(1)는 다대일 및 일대다 양방향 연관관계를 가진다. TeamForEager와 TeamForLazy는 FetchType.EAGER와 FetchType.Lazy에 따른 동작 차이를 확인하기 위해 구분된 엔티티이며, 도메인 측면의 의미는 동일하다. @Getter @NoArgsConstructor @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id..

    데이터 접근 기술_JPA_JPQL 기본 문법

    JPA는 다양한 쿼리 방법을 지원한다. 그 중 대표적으로 사용되는 것이 JPQL과 QueryDSL이다. 이번 게시글 부터 다음 게시글까지 JPQL의 개념과 사용 방법에 대해 알아보고자 한다. JPQL JPQL의 특징 JPQL은 JPA가 제공하는 기능이며, SQL을 추상화한 객제 지향 쿼리이다. JPQL은 SQL을 추상화 했기 때문에, 특정 데이터베이스의 SQL 문법에 의존하지 않는다. SQL은 데이터베이스 테이블을 대상으로 쿼리를 작성하지만, JPQL은 엔티티 객체를 대상으로 쿼리를 작성한다. JPQL은 설정된 Dialect(벤더별 방언)을 참고하여, 결국 SQL로 변환된다. JPQL 사용 방법 앞으로의 설명과 예시 코드는 아래의 객체 및 데이터 모델을 기반으로 설명할 것이다. JPQL 기본 규칙 sel..

    데이터 접근 기술_JPA_임베디드 타입

    임베디드 타입 JPA 엔티티의 속성 값으로 사용할 수 있는 타입 중 임베디드 타입이 있다. 예를 들어 Member 엔티티가 id, name, startDate, endDate, city, street, zipcode라는 속성을 갖고 있었다고 가정하자. 개발자는 startDate와 endDate는 근무기간과 관련된 속성이고 city, street, zipcode는 주소와 관련된 속성이라는 생각을 할 수 있다. 그리고 특정 논리적 개념과 관련된 속성들끼리 객체 지향적으로 관리하고 싶을 수 있다. 이 때 사용되는 것이 임베디드 타입이다. 임베디드 타입은 논리적으로 관련 있는 엔티티의 속성을 하나의 클래스에 모아둔 타입이라고 할 수 있다. 아래의 그림 처럼 임베디드 타입으로 사용될 Period, Address ..

    데이터 접근 기술_JPA_프록시와 지연 로딩

    프록시 jpa에서 프록시는 DB로부터 데이터를 조회할 때 사용된다. 일반적으로 DB에서 데이터를 조회하고, 해당 데이터에 대한 엔티티를 얻는 메소드는 EntityManger.find()이다. EntityManger.find()는 DB를 통해 실제 엔티티 객체를 얻을 수 있는 것이다. 그에 반해 EntityManager.getReference()는 DB에서 데이터를 조회하지 않으며, 가짜(프록시) 엔티티 객체를 얻을 수 있다. 프록시 엔티티 객체 특징 프록시 엔티티 객체는 실제 엔티티 클래스를 상속 받아서 생성된다. 따라서 실제 엔티티 객체와 형태가 동일하다. 실제 엔티티 객체와 프록시 엔티티 객체의 차이점이 있다면, 프록시 엔티티 객체는 id를 제외한 속성의 값들이 비워져 있다. 그리고 실제 엔티티 객체..

    데이터 접근 기술_JPA_상속 관계 매핑

    상속 관계 매핑 데이터베이스에는 테이블 간의 상속 관계라는 개념이 없다. 굳이 비슷한 개념을 찾자면 슈퍼 타입과 서브 타입이라는 개념이 존재한다. 슈퍼 타입과 서브 타입이라는 개념도 논리 모델의 개념이며, 이것을 물리 모델로 구현하는 방법에는 세 가지가 있다. 조인 전략 단일 테이블 전략 개별 테이블 전략 세 가지 구현 방법에 따라 실제 테이블 설계가 달라지며 JPA는 객체, 즉 엔티티와 각 테이블 설계를 매핑하는 방법을 제공한다. 정리하자면 데이터베이스의 슈퍼 타입과 서브 타입을 구현 하는 방법들과 상속 관계를 가진 엔티티들을 매핑하는 것이 상속 관계 매핑이다. 조인 전략 조인 전략은 객체 지향 설계와 가장 비슷하게 슈퍼타입과 서브타입을 구현하는 방법이다. 조인 전략을 사용할 경우, 오른쪽과 같이 테이..

    데이터 접근 기술_JPA_연관 관계 매핑

    연관 관계 매핑 데이터베이스에서는 두 테이블 간에 외래키(Foreign Key)를 통해 서로 연관 관계를 맺고 있다. 연관 관계 매핑이랑 이러한 테이블 간의 연관 관계를 엔티티들에 매핑하는 것을 의미한다. 연관 관계 매핑을 이해하고 정확히 사용하기 위해서는 방향, 연관 관계의 주인, 다중성을 이해해야한다. 방향 연관 관계 매핑에서의 방향은 객체 참조의 방향을 의미한다. 연관 관계를 가진 두 엔티티 중 하나의 엔티티에서만 다른 엔티티를 참조할 수 있으면 단방향, 두 엔티티 모두 다른 엔티티를 참조할 수 있으면 양방향이라고 한다. 여기서 데이터베이스 테이블의 연관 관계와는 약간 차이점이 있다. 테이블의 연관 관계는 단방향, 양방향을 구분할 필요가 없다는 것이다. 두 테이블 간에 외래키 하나만 존재하면, 두 ..

    데이터 접근 기술_JPA_영속성 컨텍스트

    영속성 컨텍스트 영속성 컨텍스트는 JPA에서 가장 중요한 개념 중 하나이다. JPA의 내부 동작 원리를 정확히 이해하기 위해서는 영속성 컨텍스트를 알아야한다. EntityManagerFactory와 EntityManager 웹 어플리케이션이 구동되면 하나의 EntityManagerFactory가 생성된다. 그리고 트랜잭션 단위의 요청이 발생할 때마다, EntityManagerFactory는 EntityManager를 생성한다. EntityManager들은 ConnectionPool에서 Connection을 획득하여 DB 작업을 실행한다. 영속성 컨텍스트 영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 의미하며, EntityManger를 통해 접근 가능하다. 영속성 컨텍스트는 눈에 보이지 않는 논리적인 개..

    데이터 접근 기술_JPA_기본 개념

    JPA JPA(Java Persistence API)는 자바 진영의 ORM 표준 기술이다. 그러면 ORM은 무엇일까? ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매핑한다는 것을 의미한다. ORM 기술은 매핑을 통해 어플리케이션의 객체 중심 설계와 데이터베이스의 데이터 중심 설계 간의 패러다임 불일치를 해결해준다. JPA는 구현체가 아닌 인터페이스이다. 다양한 JPA 구현체가 존재하며, 가장 대중적으로 사용되는 구현체는 Hibernate이다. JPA는 어플리케이션 로직과 JDBC(DB 드라이버) 사이에서 동작한다. JPA의 장점 생산성과 유지보수 어플리케이션 로직은 자바 컬렉션에서 객체를 조작하듯이 JPA와 상호작용 할 수 있다. 어플리케이션 로직과 JPA의 상호..