본문 바로가기
Spring/boot

spring JPA 엔티티 Entity 어노테이션 정리

by 코딩균 2021. 12. 24.

@ManyToOne

1:다 관계의 엔티티에서 다쪽 엔티티에 설치되는 필드의 어노테이션

DB 테이블 적으로 보면 외래키를 가지고 있으므로 JoinColumn 또한 해주어야 함

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id") // 외래키 이름
private Product product;

 

@OneToMany

1:다 관계의 엔티티에서 1쪽 엔티티에 설치되는 필드의 어노테이션

mapped by를 통해 다쪽의 엔티티에서 어떠한 값과 매핑이 되는지 표시

@OneToMany(fetch = FetchType.LAZY, mappedBy = "product")
private List<Order> orders = new ArrayList<Order>();

 

@Embeddable - @Embedded

entity 내부의 객체형 필드 

객체와 테이블을 정교하게 매핑할 수 있음

객체지향적으로 응집력을 높일 수 있음

@Embedded
private Address address
@Embeddable
class Address{
	private String zipCode;
	private String city;
    private String street;
    
    protected Address(){} // 보안상 protected로 설정하는 것이 안전 -> JPA 리플랙션 위해
    
    public Address(String city, String street, String zipCode){
    	this.city = city;
        this.street = street;
        this.zipCode = zipCode;
	}
}

 

 

@Inheritance(strategy = InheritanceType.XXX)

DB를 객체 상속적으로 표현하기 위함

  • JOINED - 가장 정규화된 스타일로 상속 : 하위 테이블 입장에서는 상위 테이블의 id를 pk이자 외래키로 인지
  • SINGLE_TABLE - 상속 엔티티들의 필드를 하나의 테이블에 넣기
  • TABLE_PER_CLASS - 하위 클래스가 각각의 테이블로 나누어짐 - 부모테이블 속성이 하위테이블 속성으로 중복되어 들어감

확장성이 높으면 일반적으로 JOINED 전략을 채택

비즈니스 로직이 심플하고 확장성도 낯으면 SINGLE_TABLE 전략 채택

 

@DiscriminatorColumn(name = "하위연결위한키이름")

DB에는 name에 들어간 값으로 속성 이름이 결정됨

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="dtype")
@Getter
public class Item{
	
    @Id @GeneratedValue
    @Column(name = "item_id")
    private Long id;
    
    private String title;
    
    priavte int price;
    
    private int stack;
    
  }

@DiscriminatorValue("값")

상위 테이블 엔티티를 반드시 상속받아야 한다.

JOINED 전략이나 SINGLE_TABLE 전략 채택 시, 상위 테이블(JOINED 전략)과 단일테이블(SINGLE_TABLE 전략)에 외래키 혹은 필드로 들어간 속성의 값에 들어가는 값 

 

@Entity
@DiscriminatorValue("M")
@Getter 
public class Movie extends Item{
	
    private String director;
    private String actor;
    
}

 

@Enumerated(EnumType.XXX)

상태 등등 정해진 항목이 있는 값들을 표현하기 위해 enum을 사용하는 경우 

  • ORDIINAL - enum의 순서 값 int를 DB에 저장 (1, 2, 3....)
  • STRING - enum에 선언된 이름 string 자체를 DB에 저장
@Entity
@Getter
public class order{
	
    @Id 
    @GeneratedValue
    private Long id;
    
    ///생략
    
    @Enumerated(EnumType.STRING)
    private Status status;
    
 }
 
 public enum Status{
 	READY, DELIVERY, COMPLETE
 }

하지만 이러한 방법은 나중에 enum의 상태가 변경되었을 때, 혼란스러워진다는 단점이 있다고 한다

AttributeConverter가 대안이라는데 이는 참고 블로그 링크만 남겨두고 나중에 공부해야겠다

https://lng1982.tistory.com/279

 

8. [JPA] Attribute Converter

Attribute Converter에 대해서 알아보자. 말 그대로 속성 변환기이다. 다음 그림과 같이 엔티티와 DB 사이에서 동작한다. 흔히 개발을 진행하다 보면 DB에는 코드성의 데이터가 쌓이게 된다. 가령 gender

lng1982.tistory.com