스프링/DB

Transaction_3(트랜잭션 전파)
기존의 트랜잭션이 진행 중이고, 추가로 또 다른 트랜잭션이 시작된다고 가정해보자. 이 때 추가되는 트랜잭션은 기존 트랜잭션에 합류하여 진행되어야할까? 아니면 별도의 트랜잭션으로 진행되어야할까? 이런 상황에서 트랜잭션의 동작을 결정하는 것을 트랜잭션 전파(propagation)라고 한다. 트랜잭션 전파의 옵션으로는 REQUIERD, REQUIRES_NEW가 주로 사용된다. REQUIRED가 기본 값이기 때문에 우선 REQUIRED에 기반하여 설명한 후, REQUIRES_NEW에 대한 설명을 이어가겠다. 트랜잭션 전파 기본 개념 트랜잭션 전파를 설명하기 위해 사용되는 용어들을 먼저 정의하려고 한다. 외부 트랜잭션과 내부 트랜잭션 외부 트랜잭션 외부 트랜잭션은 처음에 시작된 트랜잭션을 의미한다. 다음에 시작되..
데이터 접근 기술_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를 통해 접근 가능하다. 영속성 컨텍스트는 눈에 보이지 않는 논리적인 개..