728x90
반응형
SMALL

JPA(Java Persistence API) 21

[JPA] Part 11. 지연로딩과 즉시로딩

지연로딩과 즉시로딩에 대해 공부한 내용을 적고자 한다. 내가 JPA를 처음 이론적인 공부를 하지 않고 그냥 무작정 사용했을 때 이런 내용이 있는지도 사실 모르고 데이터를 받아올 때 무수히 많은 SQL문을 남발하곤 했는데, 그 남발하게된 SQL문의 원인 중 하나가 여기에 있다. 우선 지연로딩과 즉시로딩은 JPA가 데이터를 데이터베이스로부터 조회할 때 조회할 레코드에 참조 객체(테이블 관점에서는 외래키)가 있는 경우 해당 데이터까지 한꺼번에 다 가져올지 말지를 정하는 기준을 말한다. 다음 상황을 가정해보자. 팀 엔티티와 멤버 엔티티가 있고 팀과 멤버는 일대다 관계이다. 이 때 멤버를 조회할 때 팀도 한번에 조회해야 할까? 코드로 이를 직접 비교해보자. 지연로딩(LAZY Fetch) Member Class p..

[JPA] Part 10. 프록시

JPA에서 중요한 개념 중 하나인 프록시라는 게 있다. 중요한 개념이라기보단 중요하게 사용되는 지연로딩과 즉시로딩을 사용하려면 반드시 깊은 이해가 필요하다고 개인적으로 생각한다. 왜 그러냐면 회사에서 프로젝트를 진행 중에 이해도가 깊지 않은 상태에서 지연로딩을 마구잡이로 썼다가 프록시 초기화 오류를 진짜 무진장 만났던 기억이 아직도 생생하다. 우선 서사는 이렇다. 멤버라는 테이블과 팀이라는 테이블이 있을 때를 가정해보자. 멤버는 팀에 속하고 아래 그림과 같다. 이런 구조를 가진 두 테이블이 있을 때 멤버를 조회한다고 가정해보자. 특정 멤버를 조회할 때 팀도 같이 조회해야 할까? 예를 들어 이런 메서드가 있다고 생각해보자. private static void printMember(EntityManager ..

[JPA] Part 9. @MappedSuperclass

이건 Part 8에서 알아본 상속 관계 매핑이랑은 다른데 (느낌은 비슷하다) 어떤 거냐면 테이블들이 공통으로 사용하는 필드들을 편하게 가져다 쓰기 위해 한 클래스에서 그 필드들을 선언하고 필요한 엔티티가 가져다가 사용하는 것을 말한다. 자주 사용되며 아주 대표적인 예시가 createdDate, createdBy, lastModifiedBy, lastModifiedDate같은 필드를 다룰 때이다. 바로 코드를 보자. Part 8에서 사용했던 Item, Movie, Album, Book 테이블을 활용해서 적용해보자. Base Entity package org.example.entity.inheritance; import javax.persistence.MappedSuperclass; import java.t..

[JPA] Part 8. 상속관계 매핑

이제 상속관계를 매핑하는 법도 알아보자. 왜냐하면 객체는 상속을 받을 수 있으니까. 우선은 관계형 데이터베이스는 상속 관계가 없다. 대신 슈퍼타입 서브타입 관계라는 모델링 기법이 있고 그 기법이 객체 상속과 유사하다. 그래서, 상속관계 매핑을 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑해 보는 것이 주제다. 위 그림에서 ITEM이라는 테이블이 있고 그 테이블이 가지는 컬럼을 모두 동일하게 가지는 3개의 테이블 Album, Movie, Book이 있다고 가정해 보자. 이 경우 데이터베이스에서는 3가지 전략으로 테이블을 구성할 수 있다. 조인 전략 단일 테이블 전략 구현 클래스마다 각 테이블 전략 조인 전략 조인 전략은 상위 테이블인 ITEM의 기본키를 각 테이블이 기본키이자 외래키로 가지는 방..

[JPA] Part 7. 다대일, 일대다, 일대일, 다대다

이 전 포스팅까지는 단방향, 양방향에 대해서 알아보았는데 결론은 테이블 관점은 방향이란 게 없고 자식 테이블에 외래키가 존재하며 그 외래키를 통해 부모 테이블과 조인하여 원하는 데이터를 얻어내거나 반대로 부모 테이블은 본인의 PK를 이용해서 자식 테이블의 외래키와 조인하여 원하는 데이터를 얻을 수 있고 객체 관점은 단방향 또는 양방향 연관관계라는 게 존재하며 양방향 연관관계는 사실 단방향 두 개를 의미하며 설계할 때 양방향이 단 하나도 없어도 애플리케이션에 전혀 문제가 없다는 것. 단방향으로 설계를 끝내고 필요하면 양방향 연관관계를 추가할 것이 결론이었다. 이제는 연관관계를 매핑할 때 ManyToOne, OneToMany, OneToOne, ManyToMany 관계에 대해서 알아보려고 한다. ⭐️ Man..

[JPA] Part 6. 객체 지향형 모델링, 단방향 양방향 연관관계 주인

데이터베이스와 자바의 객체를 매핑하는 것을 이전 시간에 공부했는데 데이터베이스와 자바의 객체는 한 가지 이질적인 부분이 있다. 데이터베이스는 한 테이블에서 다른 테이블을 참조할 때 외래키를 이용하여 어떤 레코드를 참조하는지만 표현하는 반면, 객체 지향적이란 건 객체가 다른 객체를 참조할 수 있어야 객체 지향적이라고 할 수 있다. 객체 지향적인 설계가 복잡하고 어려운 내용인것 같다. 공부하고 공부해도 모자란 부분이 이 부분인 것 같지만 한 가지 확실한 건 다음과 같은 설계가 객체 지향적이라고 볼 순 없을 것 같다. Member Entity package org.example.domain; import javax.persistence.*; @Entity public class Member { @Id @Gen..

[JPA] Part 5. 객체와 테이블 매핑

이제 JPA에서 역시 제일 중요한 부분 중 하나인 객체와 테이블 매핑에 대해서 알아보자. 이 부분은 복잡한 내용은 없고 간단하게 어노테이션을 이용해서 객체를 테이블과 매핑할 수 있다. Member Entity package org.example.entity; import javax.persistence.*; import java.time.LocalDateTime; @Entity @Table(uniqueConstraints = { @UniqueConstraint(name = "UniqueName", columnNames = { "name" }), @UniqueConstraint(name = "UniqueEmail", columnNames = { "email" }) }) public class Member ..

[JPA] Part 4. 영속성 컨텍스트

영속성 컨텍스트는 JPA에서 가장 중요한 개념 중 하나이다. 이 PersistenceContext를 이해해야만 JPA를 이해할 수 있다고 봐도 무방하다. 공부하는데 도움을 받은 김영한 강사님의 "자바 ORM 표준 JPA 프로그래밍" 추천합니다. 출처: https://www.inflearn.com/course/ORM-JPA-Basic/dashboard 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자 www.inflearn.com 엔티티 매니저 팩토리와 엔티티 매니저 우선 영속성 컨텍스트를 알기..

[JPA] Part 3. JPA를 뿌리부터 시작해보기

JPA를 진짜 깊게 이해하기 위해 아예 순수 JPA 세팅부터 시작해 보려고 한다. 내가 처음 JPA를 사용했을 때 느꼈던 것보다 훨씬 진짜 훨씬 더 많은 내용이 JPA에 있었는데 지금이라도 깊게 공부하게 되서 다행인거 같다. 우선 프로젝트를 Maven 기반으로 시작해보자. pom.xml 현재 정말 아무것도 없는 상태에서 pom.xml 파일 하나만 있는 상태다. 이 파일에서 필요한 두 가지가 있는데 하나는 hibernate, 하나는 h2database dependency다. 4.0.0 org.example hello-jpa 1.0-SNAPSHOT 18 18 org.hibernate hibernate-entitymanager 5.6.15.Final com.h2database h2 2.2.224 딱 두개의 D..

[JPA]: Part 2. Hibernate 정의와 JPA와 Hibernate의 차이점

Hibernate는 자바 기반의 오픈소스 프레임워크로 객체 지향된 도메인 모델과 RDB 사이의 연결을 제공한다. Hibernate가 자바 애플리케이션에서 데이터베이스 관련 프로그래밍을 개발자들이 Java Objects를 통해 할 수 있도록 도와준다. 복잡한 SQL 쿼리 대신. Hibernate의 핵심 특징은 다음과 같다. 1. Object-Relational Mapping (ORM): Hibernate의 핵심 목적은 객체 지향적 언어와 RDB 사이의 갭에 연결 다리를 놓는것이다. 그리고 그를 위해 양방향으로 자바 오브젝트들과 데이터베이스 테이블들 사이를 매핑해준다. 2. Persistence: Hibernate는 RDB에 또는 RDB로부터 자바 오브젝트들을 저장하거나 읽어오는 메커니즘을 제공한다. Hib..

728x90
반응형
LIST