멍두의 개발새발

[JPA] Entity에서 사용되는 Annotation 정리 (@Table, @Entity, @Column, @Enumerated, @Temporal .. ) 본문

Programming/Spring

[JPA] Entity에서 사용되는 Annotation 정리 (@Table, @Entity, @Column, @Enumerated, @Temporal .. )

멍두 2025. 5. 26. 03:08
반응형


@Table

  • DB에 지정되는 Table의 이름

 

@Entity

  • Entity로 관리
  • name을 지정해주면 JPQL에서 해당 명으로 사용할 수 있음
참고 : [JPA] Entity에서 @Table, @Entity, @Column의 name을 정의해주어야할까?

 

@Id

  • PrimaryTable의 PrimaryKey를 지정해준다

 

@GeneratedValue

  • primary 생성 전략 제공
  • @Id에 @GeneratedValue 없으면 insert할 때 반드시 id도 직접 넣어주어야함
이름 종류 기능
startegy AUTO(default) JPA가 알아서 DBMS에 따라 하위 4가지 전략중 택 1
  TABLE @TableGenerator로 함께 쓰인다. 모든 DBMS에서 사용가능하지만 ID가 필요할 때마다 select, update를 해야하고 Lock로 필요하므로 성능이 좋지 않음
  IDENTITY DB가 기본키를 관리한다. AUTO_INCREMENT를 통해 생성한다.(MySQL, SQL server)
  SEQUENCE DB가 기본키를 관리한다. Sequence 객체를 통해 생성함(Oralce, PostgreSQL .. ) 얘는 메모리 수준에서의 연산으로 매우 매우 매우 빠르다 (락, io 이런거 다 없음)
  UUID 만약 기본키가 UUID이고, AUTO라면 이 방식을 선택한다. UUID는 애플리케이션 코드에서 생성되므로 빠르다.

 

@Column

이름 기능 정의해주지 않은 경우
name column name 정의 “”
table table name 정의 @Entity가 매핑되는 기본 테이블로 지정됨
nullable null 값 가능 / 불가능 true(널 가능)
unique unique 속성 추가 false
columnDefinition DDL문 추가하고 싶은 내용 ex default value “”
length 최대 길이 (String value에만 적용) 255
insertable insert문에서 제외 / 포함 true (insert문에 해당 field 포함)
updatable update문에서 제외 / 포함 true (update문에 해당 field 포함)

 

 

@NotNull

  • @NotNull은 Jakarata.validation의 어노테이션이다.
  • 하지만 Entity의 column에 달려있으면 NotNull을 DDL에도 반영해준다
참고 :@NotNull VS @Column(nullable = false)

 

@Enumerated

  • enum 타입 field를 DB에 어떻게 저장할지 지정
EnumType   정의해주지않으면
.ORDINAL enum을 선언한 순서대로 저장됨 Ordinal
.STRING enum 이름을 저장  
  • Ordinal은 enum선언순서가 변경되면 데이터가 불일치될 수 있어서 권장되지 않음

 

@Embedded, @Embadable

  • 클래스가 참조하고 있는 클래스를 평면화하여 현재 엔티티 테이블의 컬럼으로 추가할 수 있음
  • 평면화 되는 테이블은 반드시 @Embeddable을 선언해주어야함
@Embeddable
public class EmploymentPeriod {
    private Date startDate;
    private Date endDate;
}

@Entity
public class Employee {

    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "startDate", column = @Column(name = "EMP_START")),
        @AttributeOverride(name = "endDate", column = @Column(name = "EMP_END"))
    })
    private EmploymentPeriod employmentPeriod;

    // ...
}

// → 위의 employmentPeriod 필드는 Employee 테이블의 두 컬럼 EMP_START, EMP_END에 매핑됨

 

@Temporal

  • java의 시간정보가 포함된 필드를 DB에 어떤 값으로 매핑할건지 지정해준다
  • Date, Calendar 타입일때만 사용할 수 있는데, JPA 2.2이상에서는 LocalDate, LocalTime, Instant등 사용가능
public enum TemporalType {
    DATE, //java.sql.Date (날짜)
    TIME, //java.sql.Time (시간)
    TIMESTAMP //java.sql.Timestamp (날짜 + 시간)
}

 

 

출처

https://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html

https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#naming

https://www.baeldung.com/hibernate-notnull-vs-nullable

https://jakarta.ee/specifications/persistence/3.1/jakarta-persistence-spec-3.1.html

반응형