본문 바로가기

Java

[JPA] 값타입

반응형

엔티티 타입

- @Entity 객체를 엔티티 타입이라한다. 

- 데이터가 변해도 식별자로 지속해서 추적가능

 

값 타입

- int, String, Integer 단순히 값으로 사용하는 자바 기본타입이나 객체

- 식별자가 없고 값만 있으므로 변경시 추적불가( int a= 100; a = 200; 으로 값 변경하면 다른값으로 대체)

 

값 타입 분류

기본값 타입

- 자바 기본타입( primitive type) : int , double ...etc

   

- 래퍼클래스 : Integer, Long

- String

Integer같은 래퍼 클래스나 String 같은 특수 클래스는 공유는 가능하지만 변경은 X

 

임베디드 타입
- 새로운 값 타입을 직접 정의할 수 있음

- JPA는 임베디드 타입이라함

- 주로 기본값 타입을 모아서 만들어서 복합값 타입이라고도 함

- int, String과 같은 값 타입

- 장점
   - 재사용 가능

   - 높은 응집도

   - Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드 만들 수 있음

   - 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존함

임베디드 사용법

- @Embeddable : 값 타입을 정의하는곳에 표시

- @Embedded : 값 타입을 사용하는 곳에 표시

- 기본 생성자 필수 

 

객체타입의 한계

- 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있다. 

- 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입이다. 

- 자바 기본 타입에 값을 대입하면 값을 복사한다. 

- 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없다. 

- 객체의 공유 참조는 피할 수 없다. 

 

// 기본타입 값 
int a = 10;
int b = a;
b=4; 
//결과 : a==10, b==4

//객체 타입
Member m1 = new Member("하켱");
Member m2 = m1;
m2.setName("하켱켱");
//결과 : m1==하켱켱, m2==하켱켱

불변객체

 - 객체 타입을 수정할 수 없게 만들면 부작용을 원천 차단

- 값타입은 불변 객체로 설계해야함

- 불변 객체 : 생성 시점 이후 절대 값을 변경할 수 없는 객체

- 생성자로만 값을 설정하고 수정자를 만들지 않으면 됨

- Integer, String은 자바가 제공하는 대표적인 불변 객체 

 

 

값 타입 컬렉션

- 값 타입을 하나 이상 저장할때 사용

- @ElementCollection, @CollectionTable사용

- 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다. 

- 컬렉션을 저장하기 위한 별도의 테이블이 필요함

@ElementCollection
    @CollectionTable(name = "FAVORITE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID"))
    @Column(name = "FOOD_NAME")
    private Set<String> favoriteFoods = new HashSet<>();

    @ElementCollection
    @CollectionTable(name = "ADDRESS", joinColumns = @JoinColumn(name = "MEMBER_ID"))
    private List<Address> addressHistory = new ArrayList<>();

 

 

반응형

'Java' 카테고리의 다른 글

[JPA] 중급 JPQL  (0) 2022.05.18
[JPA]JPQL  (0) 2022.05.11
[JPA] 상속관계 매핑  (1) 2022.04.10
[JPA] Proxy, 즉시로딩, 지연로딩  (0) 2022.04.01
[JPA] 양방향 관계  (0) 2022.03.30