T_era
@Entity 엔티티에서 사용하는 어노테이션과 이유 본문
스프링에서 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: 엔티티를 로딩할 때 함께 로딩한다. 일반적으로 연관 관계에서 많이 사용된다.
- fetch: 연관된 데이터를 로딩하는 방식을 지정한다.
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의 다양한 기능을 활용할 수 있다.
'Programing > Spring' 카테고리의 다른 글
| 쿼리를 직접적으로 작성하는 건 아쉬워서 DSL을 사용해봤다 근데 왜 업데이트가 반영이 안되지? (1) | 2025.05.23 |
|---|---|
| 매번 인증 코드를 넣어야하는데 이를 하나로 해결해주는 ArgumentResolver를 사용해보자 (0) | 2025.05.22 |
| Spring Data JPA 인터페이스 메서드 자동 실행 원리 (0) | 2025.05.16 |
| Spring Data JPA Query Methods 및 JPA Auditing 정리 (0) | 2025.05.16 |
| JPA vs Spring Data JPA (0) | 2025.05.16 |