Jun's note

[JPA] 값 타입 (기본값 타입, 임베디드 타입, 컬렉션 값 타입) 본문

Programming/JPA

[JPA] 값 타입 (기본값 타입, 임베디드 타입, 컬렉션 값 타입)

junning 2022. 1. 24. 00:03
728x90

JPA를 사용할 때 변수값을 3가지 타입으로 정의할 수 있다.

 

<값타입 분류 3가지>

1. 기본값 타입

2. 임베디드 타입 (복합 값 타입) (예, 좌표 x,y를 하나의 값으로 함께 사용)

3. 컬렉션 값 타입 (기본값 타입과 임베디드 복합해서 사용?)


1. 기본값 타입

<int vs Integer>  기본타입 vs 객체타입

int, double - 변수를 공유하지 않음 (값 변경 x) (메모리에 각각의 주소에 할당됨) (값을 전달,복사하는 것)

Integer, Long(클래스) - 변수를 공유 o (왜? 레퍼런스를 참조하기 때문, 주소를 연결시켜주기 때문에 다른 변수여도 저장소는 같은곳) (참조를 전달)

 

 

2. 임베디드 타입

연관되어있는 값끼리 묶어 하나의 클래스로 해결  (엔티티 X)

 

쉽게 말하면,

1. "회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편 번호를 가진다."

2. "회원 엔티티는 이름, 근무 기간, 집 주소를 가진다."

1번보다 2번 형태로 말하는 것이 간단하고 관리하기 쉽다.

 

@Entity
public class Member {

  @Id @GeneratedValue
  private Long id;
  private String name;
  
  @Embedded
  private Address homeAddress;	// 집 주소
  
  @Embedded
  private Period workPeriod;	// 근무 기간
}

 

//Address (집주소)
@Embeddable
public class Address {
  
  @Column(name="city")
  private String city;
  private String street;
  private String zipcode;
 
}
//Peroid (근무기간)
@Embeddable
public class Peroid {
  
  @Temporal(TemporalType.DATE)
  Date startDate;
  @Temporal(TemporalType.Date)
  Date endDate;

}

(임베디드 타입 사용하는 방법)

  • @Embeddable: 값 타입을 정의하는 곳에 표시
  • @Embedded: 값 타입을 사용하는 곳에 표시

(임베디드 타입 사용시 주의사항)

한 엔티티에서 임베디드 타입은 한 값만 사용해야한다. 

예를 들어, address 임베디드타입을 homeAddress, workAddress로 두번 사용 X

 

왜? 임베디드는 타입은 객체(클래스)로 정의한것으로 참조를 전달함. homeAddress가 값을 변경하면 workAddress도 값이 변경됨 -> 부작용 발생!!!!!!(값은 변경되면 안됨) 내가 변경하지도 않았는데 다른것도 자동으로 변경되는 현상

 

그래서 값을 변경하고 싶으면 어떻게 해야하나? 객체를 하나 생성해서 사용 (똑같은 값 또 삽입) or 생성자로만 값을 설정하고 수정자(setter) 만들지 않으면 됨

 

 

3. <값 타입의 비교> 방법 2가지

1. == 동일성 비교: 인스턴스의 참조 값 비교

2. equals() 동등성비교: 인스턴스의 값 비교

임베디드 객체를 안에 값(필드)을 비교할때는!! 2번으로 해야함 (왜? 객체 2개가 서로 값이 같은지를 비교싶으니깐)

 

 

Comments