일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 디자인 패턴
- Redis
- jpa blog
- JPA
- docker
- 코테
- 프로그래머스
- 배열
- 데이터 베이스
- 연습문제
- 이것이 자바다
- 포트 폴리오
- Til
- 일정관리프로젝트
- 네트워크
- LV1
- 알고리즘
- LV.02
- 포트폴리오
- LV01
- mysql
- Join
- LV02
- LV03
- CoffiesVol.02
- Spring Frame Work
- Java
- LV0
- Lv.0
- SQL
- Today
- Total
코드 저장소.
Jpa - 값타입 본문
목차
1.JPA의 데이터 타입
2.기본값 타입
3.임베디드 타입
4.컬렉션 값 타입
1.JPA의 데이터 타입
JPA에서의 데이터 타입은 크게 엔티티타입과 값 타입으로 되어있습니다.
엔티티 타입
엔티티 타입은 @Entity로 정의를 할 수 있는 객체를 의미합니다.
값타입
값타입은 크게 3가지로 분류를 할 수 있습니다.
1.기본 값
2.임베디드 타입
3.컬렉션 타입
2.기본값 타입
기본 값 타입은 자바에서 기본 타입, 래퍼 클래스, String을 예로 들 수 있습니다.
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class testEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
위의 코드에 testEntity라는 엔티티 안에 id와name은 Long,String이 기본 타입입니다. 또한 기본값 타입은 주의해야 할 점이 있는데 기본값은 엔티티에 의존적이라는 것입니다. 간단히 말하자면 각 엔티티 인스턴스가 독립적인 상태를 가지며, 다른 인스턴스와 상태를 공유하지 않는 것을 의미합니다. 이를 통해 데이터 무결성, 동시성 문제, 영속성 컨텍스트와의 호환성 문제를 방지할 수 있습니다.
3.임베디드 타입
임베디드 타입은 엔티티의 일부에 별도의 클래스를 사용하여 구현함으로써, 코드를 더 모듈화하고 재사용성을 높이는 방식이다. 임베디드 타입을 사용함으로써 복잡한 속성 그룹을 분리하고 공통 타입을 다양한 엔티티에서 재사용할 수 있습니다.
알기 쉽게 아래의 코드를 보면 알 수 있습니다.
@Embeddable
public class testEmbedded {
private String phone;
private String address;
private String age;
private String sex;
public testEmbedded(){
}
}
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class testEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Embedded
private testEmbedded testEmbedded;
}
임베디드 타입인 클래스에 @Embeddable을 붙여주고 사용하는 엔티티에 @Embedded를 붙여주면 됩니다.
그러면 @Embeddable에 있는 컬럼이 testEntity에 들어갈 수 있는 것을 확인할 수 있습니다.
이 임베디드 타입을 통해서 알 수 있는 장점은 다음과 같습니다.
재사용성
높은 응집도
값 타입별 의미있는 메소드를 만들 수 있다.
그리고 임베디드 타입을 사용하는데 있어서 주의사항이 있습니다.
- 기본 생성자가 있어야 한다.
- 불변적이어야 한다.
- 엔티티에서 공유하여 사용하면 부작용이 발생한다.
- 생명주기가 사용된 엔티에 의존한다.
4. 컬렉션 타입
값 타입 컬렉션은 엔티티의 필드로 사용되는 컬렉션이며, 컬렉션의 요소가 값 타입인 경우를 말합니다.
이해를 돕기 위해서 아래의 코드를 예시로 들겠습니다.
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
// getters and setters
}
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ElementCollection
@CollectionTable(name = "user_address", joinColumns = @JoinColumn(name = "user_id"))
private List<Address> addresses = new ArrayList<>();
// getters and setters
}
위의 코드를 설명하면 다음과 같습니다. 우선은 Address클래스는 @Emveddable로 정의를 해서 값 타입으로 사용을 합니다. 그 다음 User 엔티티에서 addresses 필드를 가지고 있으며, 이는 Address 값 타입의 리스트입니다.
@ElementCollection을 사용해서 값 타입 컬렉션을 명시를 하고, @CollectionTable을 사용해서 컬렉션 테이블의 이름과 조인 컬럼을 지정을 합니다. 여기서는 user_address 테이블이 생성되고, user_id 컬럼을 통해 User엔티티에 연결을 합니다.
그 후 실행을 하게 되면 user_address라는 별도의 테이블을 생성을 하고 addresses 컬렉션의 요소들을 저장을 합니다. 이 테이블은 다음과 같습니다.
user_idcitystreetzipcode
1 | New York | 5th Ave | 10001 |
1 | Boston | Beacon St | 02108 |
값 타입 컬렉션의 특징
종속성
- 값 타입 컬렉션은 소유 엔티티에 종속적입니다. 즉, 소유 엔티티가 삭제되면 값 타입 컬렉션의 요소들도 함께 삭제됩니다.
- 독립적 식별자 없음
- 값 타입은 독립적인 식별자를 가지지 않습니다. 이는 값 타입 컬렉션의 요소들도 식별자를 가지지 않음을 의미합니다.
- 변경 시 전체 삭제 후 재삽입:
- 값 타입 컬렉션의 요소가 변경되면, JPA는 기존 요소들을 모두 삭제하고 새로운 요소들로 대체합니다. 이는 값 타입 컬렉션의 요소들이 데이터베이스에서 관리되는 방식 때문입니다.
마지막으로 컬렉션 타입을 사용하는데 있어서의 주의사항은 다음과 같습니다.
- 데이터베이스 성능:
- 값 타입 컬렉션의 변경 시 전체 삭제 후 재삽입 방식은 많은 데이터가 있을 때 성능에 영향을 미칠 수 있습니다. 따라서 대규모 데이터의 경우 별도의 엔티티로 모델링하는 것이 좋습니다.
- 컬렉션의 크기 제한:
- 값 타입 컬렉션의 크기가 매우 클 경우, 성능 문제와 관리 복잡성을 야기할 수 있습니다. 적절한 크기로 제한하거나, 필요한 경우 별도의 엔티티로 변경하는 것이 좋습니다.
- 변경 불가능한 값 타입 사용:
- 값 타입은 변경 불가능(immutable)하게 설계하는 것이 좋습니다. 이는 불변 객체의 특성을 활용하여 사이드 이펙트를 방지하고, 코드의 안정성을 높이는 데 도움이 됩니다.
출처
https://hstory0208.tistory.com/entry/JPA-임베디드-타입이란-Embeddable [< Hyun / Log >:티스토리]
[JPA] 임베디드 타입이란? (@Embeddable)
임베디드 타입은 엔티티의 일부에 별도의 클래스를 사용하여 구현함으로써, 코드를 더 모듈화하고 재사용성을 높이는 방식이다. 임베디드 타입을 사용함으로써 복잡한 속성 그룹을 분리하고
hstory0208.tistory.com
https://zepettoworld.tistory.com/36
JPA 값 타입이란?
이 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 기본편 강의를 참고하였습니다. www.inflearn.com/course/ORM-JPA-Basic/dashboard 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 JPA를 처음 접하거나,
zepettoworld.tistory.com
'웹개발 > Jpa' 카테고리의 다른 글
Jpa - 프록시 및 로딩전략 (0) | 2024.05.29 |
---|---|
Jpa - 엔티티 연관관계 (0) | 2024.05.25 |
Jpa - 영속성 컨텍스트 (0) | 2024.05.13 |
Jpa [엔티티 매핑] (0) | 2024.05.11 |
Jpa 란 무엇인가?? (0) | 2024.05.07 |