개발 요약
- 엔티티에서 반복적으로 사용되는 공통 필드들을 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
'런닝 코스 공유 서비스' 카테고리의 다른 글
| [런닝 코스 공유 서비스] - 11. JWT 로그인 (1) | 2026.01.02 |
|---|---|
| [런닝 코스 공유 서비스] - 10. 공통 예외 처리 (0) | 2025.12.21 |
| [런닝 코스 공유 서비스] - 8. 프로젝트 초기 설정 (0) | 2025.12.21 |
| [런닝 코스 공유 서비스] - 7. 1차 스프린트 (0) | 2025.12.18 |
| [런닝 코스 공유 서비스] - 6. 개발 일정 (0) | 2025.12.18 |