| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 정규식
- 이클립스
- Eclipse
- IntelliJ
- Java
- 자바
- js
- 자바문법
- math
- 문자열
- Array
- javascript
- 단위테스트
- 인텔리제이
- CSS
- ArrayList
- junit5
- 자바스크립트
- json
- junit
- Visual Studio Code
- 배열
- java테스트
- string
- 테스트자동화
- input
- vscode
- html
- list
- HashMap
- Today
- Total
어제 오늘 내일
[Spring Boot 입문 - 10] 게시판 작성일/수정일 자동화하기 (JPA Auditing) 본문
개발을 하다 보면 테이블마다 공통적으로 들어가는 컬럼이 있습니다.
바로 생성 시간(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)하고 포스트맨으로 테스트해 봅니다.
- 게시글 등록 (POST) -> 기존과 동일하게 요청
- 게시글 조회 (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)으로 디자인 입히기
'IT > SpringBoot' 카테고리의 다른 글
| [Spring Boot 입문 - 11] 화면 만들기 1 - 타임리프(Thymeleaf) & 목록 조회 (0) | 2026.02.15 |
|---|---|
| [Spring Boot 입문 - 9] 게시판(CRUD) 기능 만들기 - 백엔드 API 구현 (0) | 2026.02.14 |
| [Spring Boot 입문 - 8] 데이터베이스 연동? SQL 몰라도 됩니다 (feat. JPA, H2) (0) | 2026.02.13 |
| [Spring Boot 입문 - 3] 5분 컷! IntelliJ로 첫 프로젝트 만들고 실행하기 (0) | 2026.02.13 |
| [Spring Boot 입문 - 7] 어노테이션(@) 지옥 탈출! 자주 쓰는 핵심 5총사 정리 (0) | 2026.02.12 |
