본문 바로가기
spring/JPA

[JPA] 값타입

by H.초보개발자 2023. 12. 12.
반응형

이 글은 인프런의 김영한 강사님 자바 ORM 표준 JPA 프로그래밍-기본 편 강의 내용을 바탕으로 작성되었습니다.

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

K-개빈 킹 이 수식어가 어울리는 강사, 대한민국에서 사투리가 가장 섹시한 강사, 내 프로젝트에 의존성으로 추가하고 싶은 강사 강의결제를 고민하는 분들께 1) 너무 훌륭한 강의입니다. 무엇보

www.inflearn.com

임베디드 타입 이란?

  • 새로운 값 타입을 직접 정의 할수 있음
  • JPA는 임베디드 타입이라 함
  • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
  • int, String 과 같은 값 타입
  • 쉽게 말해 하나의 오브젝트 타입이라고 생각하면 편함
  • @Embeddable : 값 타입을 정의하는 곳에 표시
  • @Embedded : 값 타입을 사용하는 곳에 표시
  • 기본 생성자 필수

ex)

저번 예제에 이어서 Address를 임베디드 타입으로 따로 분류를 해놨다. 따라서 Member 테이블과 Delivery테이블에서 활요할수 있따.

 

Member

@Entity
public class Member extends BaseEntity{
    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    private String name;
    @Embedded
    private Address address;
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public List<Order> getOrders() {
        return orders;
    }
    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }
}

 

Delivery

@Entity
public class Delivery extends BaseEntity{

    @Id
    @GeneratedValue
    private Long id;
    @Embedded
    private Address address;
    private DeliveryStatus status;
    @OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY)
    private Order order;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public DeliveryStatus getStatus() {
        return status;
    }
    public void setStatus(DeliveryStatus status) {
        this.status = status;
    }
    public Order getOrder() {
        return order;
    }
    public void setOrder(Order order) {
        this.order = order;
    }
}

 

Address

@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipCode;
    public String fullAddress(){
        return getCity() + "" + getStreet() + "" + getZipCode();
    }
    private void setCity(String city) {
        this.city = city;
    }
    private void setStreet(String street) {
        this.street = street;
    }
    private void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }
    public String getCity() {
        return city;
    }
    public String getStreet() {
        return street;
    }
    public String getZipCode() {
        return zipCode;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Address address = (Address) o;
        return Objects.equals(getCity(), address.getCity()) && Objects.equals(getStreet(), address.getStreet()) && Objects.equals(getZipCode(), address.getZipCode());
    }
    @Override
    public int hashCode() {
        return Objects.hash(getCity(), getStreet(), getZipCode());
    }
}

이런식으로 Member, Delivery 테이블에는 @Embedded, Address테이블에는 @Embeddable 어노이션으로 표기해줬다.

 

컬랙션타입

컬랙션 타입이란, DB에서는 리스나 해쉬맵으로 저장하는 방법이 없지만, 객체에서는 가능함, 때문에 객체에서 컬랙션타입으로 지정을 해주면 새로운 테이블로 별도로 지정이 됨.

 

ex)

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

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "MEMBER_ID")
    private List<AddressEntity> addressHistroy = new ArrayList<>();

이런식으로 해쉬맵과 리스트로 지정에 ElementCollection어노테이션으로 지정을 해준다. 그리고 JoinColumn으로 컬럼 이름을 지정해주면, FAVORITE_FOOD에 joinColumn에 조인이되는 컬럼의 이름이 지정이 됨. 다음은 리스트의 AddressEntity 부분이다.

@Entity
@Table(name = "ADDRESS")
public class AddressEntity {
    @Id
    @GeneratedValue
    private Long id;
    private Address address;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
}

이런식으로 지정을 해줬다. 이걸 티비 테이블상 본다면

이런식으로 모델링 되는것을 확인 할수 있다

반응형

'spring > JPA' 카테고리의 다른 글

[JPA] 객체지향 쿼리 언어(JPQL)  (0) 2023.12.14
[JPA] 프록시와 연관관계 관리  (1) 2023.12.11
[JPA] 고급매핑  (0) 2023.12.11
[JPA] 다양한 연관관계 매핑  (0) 2023.12.08
[JPA] 연관관계 매핑 기초  (2) 2023.12.07