Programming-[Backend]/JPA (37) 썸네일형 리스트형 [JPA기본] 10. 즉시/지연 로딩과 CASCADE 1. 즉시/지연 로딩 : FetchType-EAGER, LAZY FetchType.LAZY 특정 엔티티를 불러올때, 연관된 엔티티를 무조건 가져온다면 EAGER, 미리 가져오지 않는다면 LAZY FetchType으로 지정할 수 있다. 아래와 같이 Member 객체에서 연관관계를 갖는 Team 필드의 @ManyToOne에 fetch 속성을 걸어주면 Team 프록시를 초기화하지 않는 이상, Team 테이블에는 쿼리를 보내지 않는다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String name.. [JPA기본] 9. 프록시 객체 1. 프록시 기초 프록시는 JPA의 실제 엔티티를 필요할때만 꺼내쓸 수 있도록 하는 가짜 객체이다. 실제 클래스를 상속받아서 만들어지며 겉모양이 같기 때문에 이론적으로는 사용자가 Proxy 객체를 그대로 써도 문제가 없다. 프록시 객체에는 아래와 같이 상속받은 엔티티 타입의 target이라는 필드값이 있다. 실제 데이터가 필요하면 이 target을 통해 id, name 등 원래 entity의 속성값을 조회한다. 아래 예제를 살펴보자. 아래와 같이 1:N의 관계로 연관지어진 Member와 Team 객체 관계에서 member 객체를 불러와서 SQL문을 확인해보자. src/main/java/com/example/jpamain/JpaMainApplication.java 1 2 3 4 5 6 7 8 9 10 11.. [JPA기본] 8. 연관, 상속관계 매핑 실습 : 테이블 -> 엔티티 환원 1. 테이블 설계도 이때까지 배운 내용을 바탕으로, 테이블 설계 내용에 따라 Entity를 직접 작성해본다. 테이블의 설계도만 보고 이때까지 배운 내용대로 Entity들을 작성할 수 있어야 한다. 실제로 그렇게 해보고, 안되는 부분이 있다면 아래 내용들을 참고한다. 강의에서 나온 테이블 설계도는 다음과 같다. 2. 단방향 연관관계 : ORDERS, MEMBER, DELIVERY Member와 Orders는 1:N의 관계이고, Orders와 Delivery는 1:1의 관계이다. Orders에서 Member를 여러 개 가지므로 Member_id를 FK로 갖는다. 그렇기 때문에 Orders가 연관관계의 주인이다. 단방향 연관관계로 설정된 이유는 (아마도) 비즈니스 로직상 Delivery 정보에서 Order 정.. [JPA기본] 7. 상속관계 매핑 1. 상속관계 매핑 전략 엔티티 계층화와 테이블 생성 전략 상속관계 매핑은 아래 그림과 같이 두 엔티티 사이에 공통적인 속성이 있는 경우 엔티티를 상속관계로 만들어서 공통화하고, 독립적인 속성만 각 엔티티의 속성으로 두는 경우에 필요하다. 원래는 테이블의 스키마를 기준으로 엔티티를 생성하지만, 만약 이러한 계층화된 엔티티를 기준으로 테이블을 생성한다면, 3가지의 생성 전략을 적용할 수 있다. 1) 단일 테이블 전략(Single Table) : 1개 테이블에 모든 필드값 넣기 2) 클래스별 테이블 전략(Table per class) : 위 그림의 왼쪽과 같이 중복되는 항목 무시하기 3) 조인 테이블 전략(Joined) : 위 그림의 오른쪽과 같이 중복되는 항목만 따로 테이블화하기 2. 단일 테이블 전략 J.. [JPA기본] 6. 양방향 연관관계 1. 양방향 연관관계의 필요성 이전 글에서는 Member 객체에 teamId 대신 Team 객체 자체를 넣는 것이 효율적이고, 이렇게 함으로써 단방향 연관관계를 맺을 수 있다는 것을 배웠다. 그리고 이를 이용하여 특정 Member가 속한 Team을 얻어낼 수 있었다. 테이블은 외래키를 통해 이미 양방향 관계가 있는 것과 같은 구조이다 그런데 만약 특정 Team에 해당하는 Member 들을 조회하고 싶다면? 테이블의 연관 관계에서는 그냥 TEAM 테이블과 MEMBER 테이블을 조인하여, TEAM.TEAM_ID = MEMBER.TEAM_ID인 항목을 MEMBER 테이블에서 조회하면 된다. 이전 글에서 살펴본 것처럼 Member가 소속된 Team을 찾는 경우도 이런 방식으로 하면 된다. 다시 말해, 테이블은 .. [JPA기본] 5. 기본 키 매핑과 연관관계 매핑 기초 1. 기본 키 매핑 @GeneratedValue - 기본 키 생성 전략 기본키를 매핑하는 @Id 어노테이션과 @GeneratedValue 어노테이션에 대해서 알아본다. id값을 직접 매핑한다면 @Id 어노테이션만 있으면 된다. 그런데 수많은 데이터를 처리하므로 보통 기본 키값인 Id값은 자동으로 생성되도록 하는데, 이것을 해주는 것이 @GeneratedValue 어노테이션이다. @GeneratedValue 어노테이션은 자동 생성을 하는 방식을 strategy 속성으로 지정해줄 수 있다. 이 속성의 value는 다음 4가지로 설정이 가능하다. ex) @GeneratedValue(strategy = GenerationType.IDENTITY) GenerationType.AUTO GenerationType.I.. [JPA기본] 4. DDL 자동 생성과 엔티티 매핑 어노테이션 JPA를 잘 사용하기 위해서는 자바 객체인 엔티티와 RDB의 테이블간 매핑을 잘하는 것이 중요하다. 이 내용을 잘 모르면 에러가 발생할 경우가 많아지고 시간을 많이 허비하게 될 수 있다. 1. 데이터베이스 스키마 자동생성 DDL 자동 생성 데이터베이스 스키마 자동생성은 객체에 정의한 정보를 바탕으로 테이블을 만들어주는 기능이다. JPA가 DDL(Data Definition Language, 데이터 베이스의 스키마(테이블명, 열 이름 등)을 만들어주는 SQL문 집합) 을 자동으로 생성해준다. 단순히 생성해주는 것이 아니라, persistence.xml에서 지정한 SQL dialect에 맞는 적절한 DDL을 생성해준다. 예를 들어 String값은 일반적으로 테이블에서는 varchar 타입으로 분류되지만, O.. [JPA기본] 3. 영속성 컨텍스트 - JPA 내부 동작 방식 앞서 객체와 RDB의 상호소통의 가장 기초적인 예제를 살펴보면서 객체와 RDB간 매핑이 중요하다는 것을 간단히 체험해봤다. 이 부분에 대해서는 뒤에서 더 깊게 다루게 된다. 이런 ORM의 구조 외에 가장 중요한 점이 있다면 영속성 컨텍스트 개념이다. JPA가 동작하는 기본 방식으로 이 부분을 잘 이해해야 문제가 생겼을 때 대응을 잘할 수 있다. 1. 영속성 컨텍스트와 엔티티 생명주기 영속성 컨텍스트 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이다. 이전 글에서 살펴본대로 어떤 객체(엔티티)의 값을 저장하기 위해서 persist() 메서드를 쓰는데, 이 경우 객체가 바로 DB로 INSERT 되는 것이 아니라 영속성 컨텍스트에 등록되는 것이다. 아래 도식에서처럼 JPA를 이용하여 어떤 객체를 조회하거나 p.. 이전 1 2 3 4 5 다음