백엔드/spring boot

[JPA] @MappedSuperclass

STUFIT 2024. 2. 6. 15:32
반응형

@MappedSuperclass 어노테이션은 JPA (Java Persistence API)에서 매우 유용한 어노테이션 중 하나이다.

이 어노테이션은 엔티티 클래스들이 공통으로 사용하는 필드나 메소드(예: id, createdAt, updatedAt 등)를 부모 클래스에 정의하고 싶을 때 사용되는데  이 부모 클래스를 상속받는 자식 클래스들이 이러한 공통된 필드나 메소드를 재사용할 수 있게 한다.

하지만 @MappedSuperclass로 지정된 클래스는 직접적으로 엔티티로 사용될 수 없는데, 테이블로 매핑되지 않으므로 단독으로 인스턴스를 생성하거나 쿼리의 대상이 될 수 없다는 특징이 있다.

@MappedSuperclass 특징

1. 재사용성 : 공통 매핑 정보를 부모 클래스에서 정의함으로써, 여러 엔티티에서 이를 재사용할 수 있다는 장점이 있다. 이는 코드 중복을 줄이면서 유지보수성을 향상시키는 역할을 한다.

2. 테이블과의 직접 매핑 없음 : @MappedSuperclass로 지정된 클래스는 DB 테이블과 직접 매핑되지 않는다. 이 클래스의 속성은 상속받는 엔티티 클래스의 테이블에만 매핑되는 특징을 갖는다.

3. 엔티티가 아님 : @MappedSuperclass를 사용한 클래스는 엔티티로 간주되지 않으므로 EntityManager의 find, persist 같은 작업에 직접 사용될 수 없다는 특징을 갖고 있다.

 

코드 예시

import javax.persistence.MappedSuperclass;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import java.time.LocalDateTime;

@MappedSuperclass
public abstract class BaseEntity {
    @Id
    @GeneratedValue
    private Long id;

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    // getters and setters
}

이렇게 기본적인 엔티티를 만들어 놓으면 위의 코드는 엔티티가 아니면서 테이블과 직접 매핑되지 않고, 부모 클래스에 상속받아서 공통 로직으로서 항상 디폴트 값으로 사용될 수 있다.

import javax.persistence.Entity;

@Entity
public class SomeEntity extends BaseEntity {
    private String name;
    // 기타 필드 및 메소드
}

이렇게 SomeEntity에 상속되어서 사용되면 SomeEntity는 name, createdAt, updateAt 의 값을 리턴값으로 보낼 수 있다.

 

반응형