JAVA/JPA

[ JPA ] - Jpa entity 관련 어노테이션

algml0703 2023. 11. 3. 20:21
반응형

JPA entity 관련 어노테이션

@MappedSuperclass

엔티티 클래스에 공통적으로 사용되는 필드나 상속관계를 정의하기 위해 사용하는 어노테이션이다. @MappedSuperclass를 사용한 클래스를 상속한 자식 클래스에서 슈퍼클래스에 정의된 필드들을 상속받게 된다. 예를 들어 데이터 생성시점, 생성자 등 모든 엔티티 클래스에서 공통적으로 사용될 필요가 있는 필드들을 따로 모아 @MappedSuperclass로 생성 후 하위 엔티티 클래스에서 상속받게 하면 공통적인 필드 등에 대한 중복적인 코드를 줄일 수 있다.

import jakarta.persistence.MappedSuperclass;

import java.io.Serializable;
import java.time.LocalDateTime;

@MappedSuperclass
public class BaseEntity implements Serializable{
    private Long createdBy;
    private LocalDateTime createdAt;
    private Long lastModifiedBy;
    private LocalDateTime lastModifiedAt;
}

@Entitiy

클래스에 붙어, JPA 엔티티 클래스를 정의할 때 사용된다. 해당 어노테이션이 붙은 클래스는 (엔티티로써) JPA에서 관리되며, 해당 클래스의 인스턴스는 데이터베이스 테이블의 레코드와 매핑된다. 

@Table

클래스에 붙어, JPA에서 엔티티 클래스와 데이터베이스 테이블을 매핑하는데 사용되는 어노테이션이다. @Entity 어노테이션과 헷갈릴 수 있는데, @Entity 어노테이션만 사용한 경우에는 클래스명 자체가 해당 엔티티의 데이터베이스 테이블명이 되며, @Table 어노테이션과 함께 사용한 경우 클래스명과 별도로 table명을 설정하여 줄 수 있다.

@Id

필드에 붙어, 해당 필드가 기본키로 사용됨을 알리는 어노테이션이다., 기본적으로 기본키는 유일해야 하고, null 값이 아니어야 한다.

@GeneratedValue

기본키 필드에 붙으며, 해당 (기본키)필드가 생성될 때 자동으로 값을 생성하도록 해주는 어노테이션이다. 

@Column

필드에 붙으면, 각 필드와 테이블의 컬럼과 매핑해주기 위해 사용하는 어노테이션이다. 해당 어노테이션을 통해 컬럼명, 길이, 데이터 속성 등을 설정할 수 있다.

@ElementCollection

필드의 타입의 Map, Set, List 등과 같은 컬렉션 타입인 경우에 해당 필드를 위한 별도의 테이블을 생성하여 주는 어노테이션이다. 아래의 예시 코드를 보면, inCategories의 경우 별도로 테이블이 생성되어 해당 필드의 값을 별도 테이블에 저장되고, 외래키를 통해 Category 테이블과 연결된다.

@Data
@Entity
@Table(name="category")
@NoArgsConstructor()
public class Category extends BaseEntity {
    @Id
    @GeneratedValue
    private UUID id;
    @Column(name="NAME", length=20, nullable=false, unique=false)
    private String name;
    @Column(name="CODE", length=20, nullable=false, unique=true)
    private String code;
    @ElementCollection
    @Column(name = "IN_CATEGORIES", nullable = false)
    private List<String> inCategories = new ArrayList<>();

    public Category(String code, String name, List<String> inCategories){
        this.code = code;
        this.name = name;
        this.inCategories = inCategories;
    }
}
반응형

'JAVA > JPA' 카테고리의 다른 글

[ JPA ] - Jpa 기본 사용 방법과 Repository 인터페이스  (0) 2023.11.01