어제 오늘 내일

[Spring Boot 입문 - 10] 게시판 작성일/수정일 자동화하기 (JPA Auditing) 본문

IT/SpringBoot

[Spring Boot 입문 - 10] 게시판 작성일/수정일 자동화하기 (JPA Auditing)

hi.anna 2026. 2. 14. 12:00

개발을 하다 보면 테이블마다 공통적으로 들어가는 컬럼이 있습니다.

바로 생성 시간(CreatedDate)수정 시간(ModifiedDate)입니다.

이걸 매번 수동으로 넣는 것은 비효율적입니다.

Spring Data JPA에서는 이 시간을 자동으로 넣어주는 Auditing 기능을 제공합니다.

이번 포스팅에서는 BaseTimeEntity를 만들어 모든 Entity의 상위 클래스로 적용하는 방법을 소개합니다.


Step 1. BaseTimeEntity 만들기

모든 Entity의 상위 클래스가 될 추상 클래스를 만듭니다. Board 뿐만 아니라 나중에 Member, Comment 등을 만들 때도 이 클래스만 상속받으면 시간이 자동으로 관리됩니다.

  • 위치: src/main/java/com/example/board/domain/entity/BaseTimeEntity.java
package com.example.board.domain.entity;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Getter
@MappedSuperclass // 1. 상속받는 자식 클래스에게 매핑 정보(속성)만 제공
@EntityListeners(AuditingEntityListener.class) // 2. Auditing(자동 값 매핑) 기능 포함
public abstract class BaseTimeEntity {

    @CreatedDate // 생성될 때 시간 자동 저장
    @Column(updatable = false) // 수정 시에는 관여 안 함
    private LocalDateTime createdDate;

    @LastModifiedDate // 조회한 Entity의 값을 변경할 때 시간 자동 저장
    private LocalDateTime modifiedDate;
}
  • @MappedSuperclass: 이 클래스를 상속받는 Entity들은 createdDate, modifiedDate 컬럼을 자동으로 인식하게 됩니다.
  • @EntityListeners: 스프링 데이터 JPA의 감사(Auditing) 기능을 이 클래스에 적용합니다.

Step 2. Board 클래스에 상속 적용하기

이제 우리가 만든 게시판(Board) Entity가 시간을 관리하도록 BaseTimeEntity를 상속받게 수정합니다.

  • 위치: src/main/java/com/example/board/domain/entity/Board.java
// ... 기존 import 생략 ...

// extends BaseTimeEntity 추가!
public class Board extends BaseTimeEntity { 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // ... 나머지 코드는 그대로 두세요 ...
}

딱 한 줄(extends BaseTimeEntity)만 추가하면 끝입니다!


Step 3. 메인 클래스 설정 확인 (중요!)

지난 9편에서 미리 추가해 두었지만, 혹시 빠뜨렸을 수 있으니 다시 확인합니다.
메인 애플리케이션 클래스에 @EnableJpaAuditing 어노테이션이 반드시 있어야 작동합니다.

  • 위치: src/main/java/com/example/board/BoardApplication.java
package com.example.board;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing // <--- 이 친구가 있어야 시간이 자동으로 기록됩니다!
@SpringBootApplication
public class BoardApplication {
    public static void main(String[] args) {
        SpringApplication.run(BoardApplication.class, args);
    }
}

Step 4. 조회 결과(DTO)에 시간 추가하기

DB에는 시간이 잘 들어가겠지만, API 조회 결과(JSON)에서도 시간을 보고 싶다면 DTO에도 필드를 추가해야 합니다.

  • 위치: src/main/java/com/example/board/dto/BoardResponseDto.java
package com.example.board.dto;

import com.example.board.domain.entity.Board;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
public class BoardResponseDto {
    private Long id;
    private String title;
    private String content;
    private String author;
    private LocalDateTime createdDate; // 생성일 추가
    private LocalDateTime modifiedDate; // 수정일 추가

    public BoardResponseDto(Board entity) {
        this.id = entity.getId();
        this.title = entity.getTitle();
        this.content = entity.getContent();
        this.author = entity.getAuthor();
        // BaseTimeEntity를 상속받았기 때문에 getCreatedDate() 사용 가능
        this.createdDate = entity.getCreatedDate();
        this.modifiedDate = entity.getModifiedDate();
    }
}

✅ 테스트 및 결과 확인

이제 프로젝트를 다시 실행(Run)하고 포스트맨으로 테스트해 봅니다.

  1. 게시글 등록 (POST) -> 기존과 동일하게 요청
  2. 게시글 조회 (GET) -> http://localhost:8080/api/v1/posts/1

[예상 결과]

{
    "id": 1,
    "title": "테스트 게시글",
    "content": "내용",
    "author": "홍길동",
    "createdDate": "2024-05-21T10:15:30.123456",
    "modifiedDate": "2024-05-21T10:15:30.123456"
}

이제 내가 시간을 넣지 않아도, 스프링 부트가 알아서 나노초 단위까지 정확하게 기록해 주는 것을 볼 수 있습니다.


마무리

오늘 작업으로 우리는 "게시글 생성/수정/조회" + "시간 자동 기록"까지 되는 완벽한 백엔드 API를 가지게 되었습니다.

다음 11편부터는 드디어 지루한 검은 화면(터미널)을 벗어나, Thymeleaf(타임리프)를 이용해 사용자가 볼 수 있는 웹 화면을 만들어 보겠습니다!

 

[다음 포스팅 예고]

  • Thymeleaf 설정 및 index.html 만들기
  • 부트스트랩(Bootstrap)으로 디자인 입히기
반응형
Comments