JPA에서 자주 사용되는 어노테이션

.·2024년 7월 7일

JPA

목록 보기
6/6

@Entity(name = “디폴트는 클래스 이름”)

  • @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라 부른다.
  • 적용 시 주의 사항
  1. 기본 생성자는 필수
  2. final, enum, interface, inner 클래스에는 사용할 수 없다.
  3. 저장할 필드에 final을 사용하면 안 된다.

@Table

  • 엔티티와 매핑할 데이터베이스 테이블을 지정합니다.
  • 속성
  1. name : 매핑할 테이블 이름 ⇒ 기본값 엔티티 이름을 사용
  2. catalog : catalog 기능이 있는 데이터베이스에서 catalog를 매핑
  3. schema : 기능이 있는 데이터베이스에서 스키마를 매핑

@Id

  • 엔티티의 기본 키를 지정합니다.

@Column

  • 객체 필드를 테이블 컬럼에 매핑한다.
  • 속성
    • name : 필드와 매핑할 테이블의 컬럼 이름 ⇒ 기본 값은 객체의 필드 이름
    • nullable : null 값의 혀용 여부를 설정한다. ⇒ 기본 값은 true
    • unique : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. 만약 두 컬럼 이상을 사용해서 유니크 제약조건을 사용하려면 클래스 레벨에서 @Table.uniqueConstraints를 사용해야 한다.

@Enumerated

  • enum 타입을 매핑합니다.
  • 속성
    • value : EnumType.ORDINAL(기본값): enum 순서를 데이터베이스에 저장, EnumType.STRING: enum 이름을 데이터베이스에 저장
  • EnumType.ORDINAL은 enum에 정의된 순서대로 ADMIN은 0, USER는 1 값이 데이터베이스에 저장된다.
    • 장점: 데이터베이스에 저장되는 데이터 크기가 작다.
    • 단점: 이미 저장된 enum의 순서를 변경할 수 없다.
  • EnumType.STRING은 enum 이름 그대로 ADMIN은 ‘ADMIN’, USER는 ‘USER’라는 문자로 데이터베이스에 저장된다.
    • 장점: 저장된 enum의 순서가 바뀌거나 enum이 추가되어도 안전하다.
    • 단점: 데이터베이스에 저장되는 데이터 크기가 ORDINAL에 비해서 크다

💡 기본값인 ORDINAL은 주의해서 사용해야 한다.
ADMIN(0번), USER(1번) 사이에 enum이 하나 추가되서 ADMIN(0번), NEW(1번), USER(2번)
로 설정되면 이제부터 USER는 2로 저장되지만 기존에 데이터베이스에 저장된 값은 여전히 1로남아 있다. 따라서 이런 문제가 발생하지 않는 EnumType.STRING을 권장한다.

@Temporal

  • 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
  • 속성 value ⇒ 값을 필수로 지정
    • TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑(예: 2013–10–11)
    • TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑(예: 11:11:11)
    • TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스timestamp 타입과 매핑(예: 2013–10–11 11:11:11)
@Temporal(TemporalType.DATE)
private Date date; //날짜

@Temporal(TemporalType.TIME)
private Date time; //시간

@Temporal(TemporalType.TIMESTAMP)
private Date timestamp; //날짜와 시간

//==생성된 DDL==//
date date,
time time,
timestamp timestamp,

@Lob

  • 데이터베이스 BLOB, CLOB 타입과 매핑한다.
  • 따로 지정하는 속성은 없고 매핑 타입이 문자면 CLOB, 나머지는 BLOB

@Transient

  • 이 필드는 데이터베이스에 저장하지 않고 조회하지도 않는다.
  • 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.

@Access

  • 엔티티 데이터에 접근하는 방식을 설정
  • AccessType.FIELD (필드 접근)
  • AccessType.PROPERTY(프로퍼티 접근) : 접근자Getter를 사용한다.
  • @Access를 설정하지 않으면 @Id의 위치를 기준으로 접근 방식이 설정된다.
# 필드, 프로퍼티 접근 함께 사용

@Entity
public class Member {

 @Id
 private String id;
 
 @Transient
 private String firstName;

 @Transient
 private String lastName;
 
 @Access(AccessType.PROPERTY)
 public String getFullName() {
 return firstName + lastName;
 }
 ...
}

⇒ @Id가 필드에 있으므로 기본은 필드 접근 방식을 사용하고 getFullName()만 프로퍼티 접근 방식을 사용한다. 따라서 회원 엔티티를 저장하면 회원 테이블의 FULLNAME 컬럼에 firstName + lastName의 결과가 저장

@ManyToOne

다대일 관계에서 사용한다.

속성기능기본값
optionalfalse로 설정하면 연관된 엔티티가 항상 있어야 함true
fetch글로벌 페치 전략을 설정.@ManyToOne=FetchType.EAGER
@OneToMany=FetchType.LAZY
cascade영속성 전이 기능을 사용.-
💡 다대일(@ManyToOne)과 비슷한 일대일(@OneToOne) 관계도 있다.

단방향 관계를 매핑할 때 둘 중 어떤 것을 사용해야 할지는 반대편 관계에 달려 있다. 반대편이 일대다 관계면 다대일을 사용하고 반대편이 일대일 관계면 일대일을 사용하면 된다.

@JoinColumn

외래키를 매핑할 때 사용한다.

속성기능기본값
name매핑할 외래 키 이름필드명 + _ + 참조하는 테이블의 기본 키 컬럼명
referencedColumnName외래 키가 참조하는 대상 테이블의 컬럼명참조하는 테이블의 기본 키 컬럼명
foreignKey(DDL)외래 키 제약조건을 직접 지정할 수 있음
unique, nullable 등@Column의 속성과 같다.

💡 @JoinColumn 생략
@ManyToOne
private Team team;

  • 기본 전략: 필드명 + _ + 참조하는 테이블의 컬럼명
  • 필드명(team) + _(밑줄) + 참조하는 테이블의 컬럼명(TEAM_ID) =
    ⇒ team_TEAM_ID 외래 키를 사용한다.
profile
Tech

0개의 댓글