값타입

기본값 타입

  • 자바 기본 데이터 타입
  • 래퍼클래스
  • String

임베디드 타입( 복합값 타입 )

  • 객체 형태의 Data Type.
  • @Embeddable : 값 타입을 지정하는 곳에 사용.
  • @Embedded : 값 타입을 사용하는 곳에 사용.
  • @AttributeOverride : 속성 재정의
  • 장점
    • 데이터의 의미 및 응집도를 높임.
    • 재사용이 가능.
  • ex )

     @Entity
     public class Member{
       @Id
       @GetneratedValue
       private Long id;    
       private String name;
    
       @Embedded    //값 타입을 사용하는 곳
       Period workPeriod;
    
       @Embedded    //값 타입을 사용하는 곳
       Address homeAddress;
    
       @Embedded    //값 타입을 사용하는 곳
       @AttributeOverrides({
         @AttributeOverride(name="city", column=@Column(name="company_city")),    //city 필드의 매핑 컬럼 재정의
         @AttributeOverride(name="street", column=@Column(name="company_street")),    //street 필드의 매핑 컬럼 재정의
         @AttributeOverride(name="zipcode", column=@Column(name="company_zipcode"))    //street 필드의 매핑 컬럼 재정의
       }) // 속성 재정의
       Address companyAddress;
     }
    
     @Embeedable    // 값 타입을 지정하는 곳
     public class Period{
       @Temporal(TemporalType.DATE)
       Date startDate;
    
       @Temporal(TemporalType.DATE)
       Date endDate;
     }
    
     @Embeddable    // 값 타입을 지정하는 곳
     public class Address{
       @Column
       private String city;
    
       @Column
       pivate String street;
    
       @Column
       private String zipcode;
     }
    

값 타입과 불변 객체

  • 자바의 객체 공유시 발생되는 일반적인 문제와 같음. ( 메모리 참조주소만을 공유함으로써 같은 객체를 사용 )
  • 해결책
    1. clone 메소드를 구현
    2. 생성자만을 이용한 값세팅이 되도록 객체를 구성 ( 불변객체 )
      • Getter만 존재, Setter 메소드를 만들지 않아 값을 수정하지 못하도록 한다.

값 타입 컬렉션

  • 값 타입을 하나이상 저장 하려 할때 사용.
  • @ElementCollection, @CollectionTable 사용
  • 특징
    • 식별자가 없다
    • 생명주기를 엔티티에 의존한다. ( 엔티티가 삭제되면 같이 삭제 된다. )
  • 값 타입 컬렉션의 제약 사항

    • 값 타입은 단순한 값들의 모음이므로 값의 변경이 생기면 원본 데이터를 찾기 어렵다.
    • JPA 에서는 값의 변동 사항이 생길 시, 값 타입 컬렉션의 매핑된 데이터를 삭제하고 새로운 값을 모두 저장 한다.
      @ElementCollection
      @CollectionTable(name="address_history", joinColumns = @JoinColumn(name="member_id"))
      private List<Address> AddressHistorys = new ArrayList<Address>();
      
  • 코드를 추가시 address_history 테이블이 생성이 된다.

    CREATE TABLE `address_history` (
     `member_id` BIGINT(20) NOT NULL,
     `city` VARCHAR(100) NULL DEFAULT NULL,
     `street` VARCHAR(200) NULL DEFAULT NULL,
     `zipcode` VARCHAR(20) NULL DEFAULT NULL,
     INDEX `FK_2qc7mth9466r9vntt606n6p15` (`member_id`),
     CONSTRAINT `FK_2qc7mth9466r9vntt606n6p15` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`)
    );
    
  • 실무에서는 엔티티로 정의해 일대다 관계로 설정 후 영속성정의(Cascade), 고아 객체 제거(ORPHAN REMOVAL) 기능을 적용하여 값 타입 컬렉션처럼 이용할 수 잇다.

public class Member{
.
.
.
@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="member_id")
private List<AddressHistory> AddressHistorys = new ArrayList<AddressHistory>();
.
.
.
}

@Entity
@Table(name="address_history")
public class AddressHistory {

  @Id
  @GeneratedValue
  private Long id;

  @Embedded
  private Address address;

}
CREATE TABLE `address_history` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `city` VARCHAR(100) NULL DEFAULT NULL,
    `street` VARCHAR(200) NULL DEFAULT NULL,
    `zipcode` VARCHAR(20) NULL DEFAULT NULL,
    `member_id` BIGINT(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `FK_518k2sayx1asmuw5soq8kcjao` (`member_id`),
    CONSTRAINT `FK_518k2sayx1asmuw5soq8kcjao` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`)
);

results matching ""

    No results matching ""