런닝 코스 공유 서비스

[런닝 코스 공유 서비스] - 9. 공통 엔티티 - BaseEntity

sson-coding 2025. 12. 21. 16:34

개발 요약

  • 엔티티에서 반복적으로 사용되는 공통 필드들을 BaseEntity 로 만들어 각 엔티티가 이를 상속 받도록 구현했다.

개발 내용

1) BaseEntity

  • 엔티티 생성 시 중복되는 속성 id, uuid, createdAt, updatedAt 필드를 공통으로 관리하기 위해 생성했다.
@Getter
@MappedSuperclass // 해당 BaseEntity를 엔티티로 인식되지 않게 하며, 데이터베이스에 테이블이 생성되지 않게 한다.
@EntityListeners(AuditingEntityListener.class) // Auditing 을 적용, Entity 의 변화를 감지하여 Entity 와 매핑된 테이블의 데이터 조작
public abstract class BaseEntity {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id; // 내부 pk

	@Column(nullable = false, updatable = false, unique = true)
	private UUID uuid; // 외부 노출용

	@CreatedDate
	@Column(name = "created_at",nullable = false, updatable = false) // 초기 값이 update 되지 않음
	private LocalDateTime createdAt;

	@LastModifiedDate
	@Column(name = "updated_at",nullable = false)
	private LocalDateTime updatedAt;

	/**
	 * 엔티티가 영속화 되기 직전에 실행된다.
	 * UUID 가 설정되지 않은 경우 자동으로 UUID 를 생성한다.
	 */
	@PrePersist
	protected void onCreate() {
		if(uuid == null) {
			uuid = UUID.randomUUID();
		}
	}
}

BaseEntity

  • @MappedSuperclass
    • 객체 상속을 통해 사용하고 공통 매핑 정보가 필요할 때 사용한다.
    • 해당 BaseEntity 를 엔티티로 인식되지 않게 하며, 데이터베이스에 테이블이 생성되지 않게 한다.
    • 직접 생성해서 사용할 일이 없으므로 추상 클래스로 만들었다.
  • @EntityListeners(AuditingEntityListener.class)
    • Auditing 기능을 적용하기 위해 사용하는 어노테이션이다.
    • 엔티티의 영속 및 수정 이벤트를 감지해 엔티티와 매핑된 테이블의 데이터를 조작한다.
    • AuditingEntityListener 클래스.
      • Spring Data JPA 에서 제공하는 이벤트 리스너로 엔티티의 영속,수정 이벤트를 감지하는 역할을 한다.

id / uuid

  • GeneratedValue
    • 자동 증가 값으로 생성한다.
  • @PrePersist
    • 엔티티가 영속화되기 직전에 실행되는 JPA 생명주기 콜백이다.
    • 엔티티 저장 시점에 필요한 초기화 작업을 수행하기 위해 사용한다.
  • onCreate()
    • @PrePersist 와 함께 사용되는 메서드이다.

createdAt

  • @CreatedDate
    • 엔티티가 생성됨을 감지하고 그 시점을 설정한 필드에 기록한다.
    • 생성시간은 수정되지 않도록 updatable=false 를 추가

updatedAt

  • @LastModifiedDate
    • 엔티티가 수정됨을 감지하고 그 시점을 설정한 필드에 기록한다.

2) AuditingConfig

@EnableJpaAuditing
@Configuration
public class AuditingConfig {
}

Auditing

  • 감사, 심사의 의미를 가지고 있으며, Spring Data JPA 에서는 Auditing 기능을 기본으로 제공한다.
  • 엔티티가 생성, 수정되는 시점을 감지하여 그 시간과 생성, 수정 한 사람을 기록하여 그 이력을 남길 수 있다.

@EnableJpaAuditing

  • Auditing 활성화

Configuration 분리

  • 메인 Application 에 @EnableJpaAuditing 사용 시 테스트를 진행할 때 에러가 발생할 수 있다.
  • @DataJpaTest 사용시 @EnableJpaAuditing 어노테이션이 존재하는 클래스를 @Import를 통해 추가시켜주어야 하는데 메인 Application 을 추가하게 되면 모든 Bean 이 등록 되게 되어 @SpringBootTest 와 차이점이 없어져 단일테스트의 의미가 사라진다.
  • 분리 후 테스트 클래스에 Import 클래스를 다르게 해주면 해결된다.

참고자료

https://tao-tech.tistory.com/14

https://toychip.tistory.com/51

https://ict-nroo.tistory.com/129