@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 의 값을 리턴값으로 보낼 수 있다.
'백엔드 > spring boot' 카테고리의 다른 글
스프링 빈을 등록하는 2가지 방법 (0) | 2024.02.22 |
---|---|
@Builder 어노테이션 (1) | 2023.12.18 |
@Valid 어노테이션 (0) | 2023.11.08 |
Spring) @EnableJpaAuditing 이란? (0) | 2023.10.17 |
UserDetails 커스텀을 통한 @AuthenticationPrincipal 어노테이션 사용 (0) | 2023.10.13 |