DB/JPA ( Java Persistence API ) 10

[JPA] JPA와 Transaction

트랜잭션 전파📌 하나의 트랜잭션이 다른 트랜잭션 내에서 어떻게 동작할지를 결정하는 규칙으로 여러 개의 트랜잭션이 포함된 시스템에서 특정 작업이 다른 작업에 어떻게 영향을 미칠지를 정의한다. 현재 클래스의 트랜잭션과 다른 클래스의 트랜잭션을 교통정리 한다.트랜잭션이 여러 계층 또는 메서드에서 어떻게 처리될지 정의한다.(@Transactional)propagation 속성을 통해 트랜잭션의 동작 방식을 제어할 수 있다.다양한 비즈니스 요구 사항에 맞춰 복잡한 트랜잭션 흐름을 유연하게 설계할 수 있도록 돕는다.데이터 무결성과 비지니스 로직의 안정성을 보장할 수 있다. 코드 예시REQUIRED(Default) 사용@Service@RequiredArgsConstructorpublic class MemberSer..

[JPA] 지연로딩, 즉시로딩

Lazy Loading📌 지연 로딩(Lazy Loading)은 데이터를 실제로 사용할 때 데이터베이스에서 조회하는 방식   JPA의 지연로딩 fetch 속성 사용FetchType.LAZY : 지연로딩지연로딩을 사용하면 Proxy 객체를 조회한다.연관된 객체(Company)를 매번 함께 조회하는것은 낭비인 경우에 사용한다.@Entity@Table(name = "tutor")public class Tutor { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name =..

[JPA] Proxy

Entity 조회📌 em.getReference()는 JPA의 EntityManager에서 제공하는 메서드로 특정 엔티티의 프록시 객체를 반환한다. 지연 로딩(Lazy Loading)을 활용해 데이터베이스 조회를 미루고 실제로 엔티티의 속성에 접근할 때만 데이터베이스를 조회하도록 한다.  @Entity@Table(name = "tutor")public class Tutor { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne @JoinColumn(name = "company_id") private Company company; ..

[JPA] 상속관계 매핑

테이블 전략📌 JPA에서 엔티티 상속 구조를 데이터베이스 테이블에 매핑하는 방법을 말한다. JPA는 엔티티의 상속 구조를 처리하기 위해 3가지의 테이블 전략을 제공하며 각각의 전략은 데이터 저장 방식과 성능에 차이가 있으므로 프로젝트의 요구사항에 맞게 선택할 수 있다. 관계형 데이터베이스의 테이블에는 상속 관계가 없다.  dtype@DiscriminatorColumn의 dtype은 **JPA (Java Persistence API)**에서 **싱글 테이블 상속 전략(Single Table Inheritance)**을 사용할 때, 엔티티의 타입을 구분하는 데 사용되는 컬럼을 의미합니다. dtype 컬럼은 테이블 내의 데이터가 어떤 엔티티 타입에 해당하는지 식별하기 위해 자동으로 생성됩니다. + 엔티티 ..

[JPA] 연관관계

연관관계 매핑📌 JPA 연관관계 매핑을 통해 데이터베이스 테이블 간의 관계를 객체 지향적으로 표현하여 엔티티 클래스들 간의 관계를 설정한다. JPA를 통해 연관관계를 매핑하면 SQL을 직접 작성하지 않고도 객체 간의 관계를 활용하여 쉽게 데이터를 조회하고 조작할 수 있다.   1 : N 단방향📌 한 엔티티가 @OneToMany를 통해 여러 엔티티와 관계를 맺는 경우를 말한다. 이 경우 연관관계의 주인은 1에서 가지고 있다. 1의 Entity가 외래 키(FK)를 관리한다. (연관관계의 주인)DB 입장에서는 항상 외래 키가 N 쪽에 위치해야 한다. (설계상 불가)1(Company)이 N(Tutor)의 외래 키를 수정해야 한다.더보기@Entity@Table(name = "tutor")public class..

[JPA] Spring Data JPA

Spring Boot와 JPA📌 Spring Boot는 JPA 설정을 자동으로 구성해 주어 JPA를 쉽게 사용할 수 있도록 도와준다. 기본적으로 필요한 EntityManagerFactory와 TransactionManager를 자동으로 설정하고 데이터베이스 관련 설정을 application.properties 파일에서 간단히 지정할 수 있게 해준다.  public static void main(String[] args) { // EntityManagerFactory 생성 EntityManagerFactory emf = Persistence.createEntityManagerFactory("test"); // EntityManager 생성 EntityManager em = emf.c..

[JPA] 연관관계 Mapping

단방향📌 단방향 연관관계는 객체 간의 관계가 한쪽에서만 참조 = 일방통행될 수 있는 관계를 말한다. 설정이 단순하고 유지 관리가 쉬우며 불필요한 데이터 접근을 방지할 수 있다.   데이터베이스 중심 객체 설계FK 값은 Tutor가 가지고 있다.Tutor만 참조할 수 있다.N:1, 다대일 연관관계, 가장 많이 사용된다.여러명(N)의 Tutor가 어떤 Company(1)에 소속 되어있는지 설정할 수 있다.@Entity@Table(name = "tutor")public class Tutor { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @Column(name = comp..

[JPA] 영속성 컨텍스트

영속성 컨텍스트(PersistenceContext)📌 Entity 객체를 영속성 상태로 관리하는 일종의 캐시 역할을 하는 공간으로 여기에 저장된 Entity는 데이터베이스와 자동으로 동기화되며 같은 트랜잭션 내에서는 동일한 객체가 유지된다. 영속성 상태 = JPA(Java Persistence API)에서 **엔티티(Entity)**가 EntityManager에 의해 관리되는 상태 논리적인 개념눈에 보이지 않는 공간이 생긴다.Entity Manager 를 통해서 영속성 컨텍스트에 접근한다.EntityManager.persist(entity);Entity(객체)를 영속성 컨텍스트에 영속(저장)한다.  Entity📌 데이터베이스의 테이블과 매핑되는 Java 클래스를 의미합니다. 데이터베이스에서 Entit..

[JPA] 페러다임 불일치 문제 [객체 관계형 데이터베이스]

객체와 관계형 데이터베이스📌 객체는 클래스를 통해 만들어지며 속성(field)와 기능(method)를 포함하며 관계형 데이터베이스는 데이터를 테이블 형식으로 표현하며 각 테이블은 열(column)과 행(row)으로 구성된다.  객체 지향 언어 Java객체를 저장할 수 있는 다양한 종류의 DatabaseRDB(무결성, 일관성)NoSQLFile기타 등등..관계형 데이터베이스와 객체 지향의 패러다임 불일치 문제가 발생한다. 관계형 DB에 객체 저장 시 발생하는 문제점 1. 관계형 DB와 객체 간의 구조적 차이객체 지향 vs. 관계형 모델:객체지향 언어(Java, Python 등)는 객체를 중심으로 설계되며, 상태(필드)와 행동(메서드)을 결합.관계형 데이터베이스는 테이블과 행(row)을 기반으로 데이터를 저..