본문 바로가기

데이터베이스/JPA7

[JPA] 값 타입 컬렉션 : @ElementCollection, @CollectionTable JPA에서 데이터 타입은 엔티티 타입과 값 타입으로 분류할 수 있다. 여기서 값 타입은 단순히 값으로 사용하는 자바의 프리미티브 타입이나 객체를 말한다. 값 타입의 분류 기본값 타입 : 자바 프리미티브 타입, 래퍼 클래스(Integer, Long 등), String 임베디드 타입(복합 값 타입) 값 타입 컬렉션 : 값 타입을 여러 개 저장하고자 할 때 사용하며, 자바의 컬렉션을 사용한다. 값 타입 컬렉션 @ElementCollection, @CollectionTable 애노테이션을 붙여 값 타입 컬렉션을 사용할 수 있다. //임베디드 타입 @Embeddable public class Address { private String city; private String street; private String.. 2021. 3. 24.
[JPA] Cascade(영속성 전이), OrphanRemoval(고아객체 제거) cascade : 영속성 전이 JPA에서 Cascade 옵션을 사용하면 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들 수 있다. 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공한다. @Entity public class Parent { @Id @GeneratedValue private Long id; //cascade 옵션 적용 @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List childList = new ArrayList(); public List getChildList() { return childList; } public Long getId() { return id; } }.. 2021. 3. 17.
[JPA] @MappedSuperClass 여러 엔티티에서 공통적으로 사용하는 속성들을 부모 클래스로 뽑아내고, @MappedSuperClass 애노테이션을 적용하면 DB 테이블에는 영향을 주지 않고 코드상 중복을 제거할 수 있다. @Entity public class Teacher { @Id @GeneratedValue @Column(name = "teacher_id") private Long id; private String name; private String subject; } @Entity public class Student { @Id @GeneratedValue @Column(name = "student_id") private Long id; private String name; private String grade; } 예를 들어 .. 2021. 3. 13.
JPA JPQL 페치 조인(fetch join) JPA에서 일반적인 조인을 사용하면 연관된 엔티티는 함께 조회하지 않는다. 그렇기 때문에 N+1 문제가 발생할 수 있는데, 페치 조인을 사용하면 연관된 엔티티를 한 번의 쿼리로 모두 가져올 수 있다. 참고로 N+1 문제란 하나의 쿼리를 날리는데 조회되는 결과의 개수만큼의 쿼리가 추가적으로 나가는 것을 말한다. Member 엔티티와 Team 엔티티가 1:N 단방향 연관 관계를 가지는 상황을 예로 들어보자. Member 엔티티 @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member { @Id @GeneratedValue private Long id; private String name; @ManyToOne(fetch = F.. 2021. 2. 21.
JPA 임베디드 타입( Embedded Type, 복합 값 타입) : @Embedded, @Embeddable, @AttributeOverride, @AttributeOverrides 여러 개의 값을 묶어서 하나의 값 타입을 만들수 있는데 JPA에서는 이것을 임베디드 타입이라고한다. JPA 임베디드 타입의 기본적인 사용법에 대해 알아보자. 사용 방법 "Person 엔티티는 이름과 주소를 가지고있습니다." 이것을 임베디드 타입을 사용하지 않고 엔티티 코드를 작성하면 다음과 같이 작성할 수 있다. @Entity public class Person { @Id @GeneratedValue private Long id; private String name; private String city; private String street; private String zipcode; } 코드를 보면 city, street, zipcode는 주소와 관련된 값들 임을 알 수 있다. 이런 경우 임베디드 타.. 2021. 2. 20.
JPA 지연로딩을 사용해야하는 이유, 지연로딩(Lazy)과 즉시로딩(Eager) 공부하는 과정에서 작성한 글입니다. 잘못되거나 보충할 내용이 있다면 언제든지 알려주세요:) JPA에서는 데이터를 조회할 때 즉시 로딩(EAGER)과 지연 로딩(LAZY) 두 가지 방식이 있다. 이 두 가지 방식을 간단하게 설명하면 즉시 로딩은 데이터를 조회할 때 연관된 데이터까지 한 번에 불러오는 것이고, 지연 로딩은 필요한 시점에 연관된 데이터를 불러오는 것이라고 할 수 있다. 즉시 로딩(EAGER) @xxToxx(fetch = fetchType.EAGER) 다음과 같이 Member 엔티티와 Team 엔티티가 N:1 매핑으로 관계를 맺고 있다. @Entity public class Member { @Id @GeneratedValue private Long id; private String usernam.. 2021. 2. 12.