본문 바로가기
백엔드개발자/SPRING, JPA 등...

@Embedded, @Embeddable, @Enumerated

by 보혀니 2022. 2. 5.

@Embedded, @Embeddable

 사용 예 

@Embeddable
@Getter
public class Adress {

	private String city;
	private String street;
	private String zipcode;

	protected Address() {
	 }
     
	public Adress(String city, String street, String zipcode) {
		super();
		this.city = city;
		this.street = street;
		this.zipcode = zipcode;
	}

}

 

@Entity
@Getter
@Setter
public class Delivery {
	@Id
	@GeneratedValue
	@Column(name = "delivery_id")
	private Long id;

	@OneToOne(mappedBy = "delivery")
	private Order order;

	@Embedded
	private Adress adress;
	
	@Enumerated(EnumType.STRING)
	private DeliveryStatus status;
	// READY(준비), COMP(배송)

}

 

 

 

 앞의 Adress 클래스에 주소를 표현하는 3개의 데이터가 있다. 그 데이터를 1개의 '주소'라는 의미의 객체로 표현, 가독성이 좋은 코드로 만들 수 있다.

JPA Entity안의 Column을 하나의 객체로서 사용하고 싶다면 두 어노테이션을 사용하여야 한다. 

 

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

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

 

 

 

 값타입은 변경 불가능하게 설계해야 한다.

@Setter를 제거하고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스로 만들어야 함.

기본생성자를 public또는 protexted로 설정해야한다. 

 

 

 

 

 

@Enumerated

public enum DeliveryStatus {
	READY, COMP
}

 

 

자바 enum 타입을 텐티티 클래스의 속성으로 사용할 수 있다.

@Enumerated 어노테이션에는 두가지 EnumType이 존재

 

1. @Enumerated(EnumType.ORDINAL)

  => enum 순서 값을 저장, 순서를 Integer값으로 변환하여 DB에 저장.

  ex) 위의 DeliveryStatus.COMP 값으로 셋팅하면 2가 DB에 저장된다.

2. @Enumerated(EnumType.STRING)

  => enum 이름을 저장, String 타입으로 변환하여 DB에 저장. 

  ex) COMP 라는 문자열 자체가 저장 된다.