T_era

@Entity 엔티티에서 사용하는 어노테이션과 이유 본문

Programing/Spring

@Entity 엔티티에서 사용하는 어노테이션과 이유

블스뜸 2025. 5. 20. 14:27

스프링에서 JPA를 사용할 때 엔티티 클래스에 적용되는 다양한 어노테이션들이 존재하며, 각각 특정 역할과 사용 이유를 갖는다.
주요 어노테이션들과 그 이유를 정리해보자

1. @Entity

  • 사용 이유: 해당 클래스가 데이터베이스 테이블과 매핑되는 엔티티임을 명시한다. JPA는 이 어노테이션이 붙은 클래스의 인스턴스를 데이터베이스의 레코드와 연결하여 관리한다.

2. @Table(name = "테이블_이름")

  • 사용 이유: 엔티티 클래스와 매핑될 데이터베이스 테이블의 이름을 지정한다. 클래스 이름과 테이블 이름이 다를 경우 명시적으로 테이블 이름을 설정해야 한다.

3. @Id

  • 사용 이유: 해당 필드가 엔티티의 기본 키(Primary Key)임을 나타낸다. JPA는 @Id 어노테이션이 붙은 필드를 기준으로 엔티티를 식별하고 관리한다.

4. @GeneratedValue(strategy = GenerationType.IDENTITY/SEQUENCE/TABLE/AUTO)

  • 사용 이유: 기본 키 값의 자동 생성 전략을 지정한다.
    • GenerationType.IDENTITY: 데이터베이스의 자동 증가 기능을 사용한다 (예: MySQL, PostgreSQL의 AUTO_INCREMENT). - 주의 : 자동증가의 시점은 값이 영속화 되었을 때 진행한다. 그 전에 호출하면 null이 반환
    • GenerationType.SEQUENCE: 데이터베이스의 시퀀스(Sequence)를 사용하여 기본 키 값을 생성한다 (예: Oracle, PostgreSQL).
    • GenerationType.TABLE: 별도의 테이블을 사용하여 기본 키 값을 관리한다.
    • GenerationType.AUTO: JPA 구현체가 적절한 자동 생성 전략을 자동으로 선택한다.

5. @Column(name = "컬럼_이름", unique = true, nullable = false, length = 255 등)

  • 사용 이유: 엔티티 클래스의 필드와 매핑될 데이터베이스 컬럼의 상세 설정을 지정한다.
    • name: 데이터베이스 컬럼의 이름을 명시한다. 필드 이름과 컬럼 이름이 다를 경우 사용한다.
    • unique: 해당 컬럼에 유일 제약 조건(Unique Constraint)을 설정한다.
    • nullable: 해당 컬럼의 Null 허용 여부를 설정한다. false로 설정하면 Not Null 제약 조건이 적용된다.
    • length: 문자열 타입 컬럼의 길이를 제한한다.
    • columnDefinition: 데이터베이스 컬럼의 타입을 직접 정의할 수 있다.

6. @Basic(fetch = FetchType.LAZY/EAGER)

  • 사용 이유: 필드의 기본적인 매핑 설정을 정의한다.
    • fetch: 연관된 데이터를 로딩하는 방식을 지정한다.
      • FetchType.LAZY: 해당 필드에 접근할 때까지 로딩을 지연시킨다.
      • FetchType.EAGER: 엔티티를 로딩할 때 함께 로딩한다. 일반적으로 연관 관계에서 많이 사용된다.

7. @Temporal(TemporalType.DATE/TIME/TIMESTAMP)

  • 사용 이유: 날짜 및 시간 관련 필드의 타입을 명시한다.
    • TemporalType.DATE: 날짜 정보만 매핑한다 (예: 2023-10-26).
    • TemporalType.TIME: 시간 정보만 매핑한다 (예: 14:30:00).
    • TemporalType.TIMESTAMP: 날짜와 시간 정보를 모두 매핑한다 (예: 2023-10-26 14:30:00).

8. @Enumerated(EnumType.ORDINAL/STRING)

  • 사용 이유: Enum 타입 필드를 데이터베이스에 매핑하는 방식을 지정한다.
    • EnumType.ORDINAL: Enum 값의 순서(index)를 데이터베이스에 저장한다.
    • EnumType.STRING: Enum 값의 이름을 문자열로 데이터베이스에 저장한다. STRING 방식이 더 직관적이고 유지보수에 용이하다.

9. @Lob

  • 사용 이유: 크기가 큰 데이터(Large Object)를 저장하는 데 사용된다. String, byte[] 타입의 필드에 적용할 수 있으며, 데이터베이스의 CLOB 또는 BLOB 타입으로 매핑된다.

10. @Transient

  • 사용 이유: 해당 필드를 데이터베이스 컬럼에 매핑하지 않도록 지정한다. 엔티티 클래스 내에서 임시로 사용되는 필드에 적용한다.

11. 관계형 매핑 어노테이션 (@ManyToOne, @OneToMany, @ManyToMany, @OneToOne)

  • 사용 이유: 엔티티 간의 관계를 설정하고 매핑한다. 각 어노테이션은 다대일, 일대다, 다대다, 일대일 관계를 나타내며, mappedBy, JoinColumn, JoinTable 등의 속성을 사용하여 관계를 상세하게 정의한다.

12. @MappedSuperclass

  • 사용 이유: 공통 속성을 가진 여러 엔티티 클래스에서 상속하여 사용할 수 있는 기반 클래스를 정의한다. @MappedSuperclass 어노테이션이 붙은 클래스는 엔티티가 아니며, 해당 클래스의 속성들은 상속받는 엔티티 클래스의 컬럼으로 매핑된다.

13. @Embeddable

  • 사용 이유: 하나의 엔티티에 포함될 수 있는 값 타입(Value Type) 클래스를 정의한다. @Embeddable 어노테이션이 붙은 클래스는 @Embedded 어노테이션을 사용하여 엔티티 클래스의 필드로 포함될 수 있다.

14. @Embedded

  • 사용 이유: @Embeddable로 정의된 값 타입 클래스를 엔티티 클래스의 필드로 포함시킨다.

이 외에도 엔티티의 생명주기(Lifecycle)와 관련된 @PrePersist, @PostPersist, @PreUpdate, @PostUpdate, @PreRemove, @PostRemove 등의 어노테이션들이 있으며, 엔티티의 특정 시점에 콜백 함수를 실행하도록 정의하는 데 사용된다.

이러한 어노테이션들을 적절히 사용하여 엔티티 클래스를 설계함으로써, 객체와 데이터베이스 테이블 간의 매핑을 효율적으로 관리하고 JPA의 다양한 기능을 활용할 수 있다.