스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초

스프링 부트 핵심 가이드(장정우 지음) - Spring Data JPA 활용 4(JPA Auditing 적용)

개발학생 2025. 9. 2. 16:53
반응형

*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성  

 

[Java] 차근차근 Java 설치하기 (JDK17, Window 11)

자바 개발 도구 설치 방법에 대해서 알아보겠습니다. Java17은 LTS(Long Term Support : 장기 지원) 릴리즈로 1년 후까지 기술 지원 및 버그를 개선한 서비스를 제공받을 수 있습니다. 업데이트 버전을 꾸

yungenie.tistory.com

 

[Windows] Spring Tool Suite 4(STS 4) 다운로드 및 설치

STS란?Spring Tool Suite(STS)는 스프링 프로젝트를 생성하고, 개발할 수 있게 해주는 도구입니다. STS 설치 과정에 대해 설명드리겠습니다. 설치 파일 다운로드STS 공식 사이트에서 설치 파일을 다운로

priming.tistory.com

 

MySQL :: Download MySQL Community Server

Select Version: 9.3.0 Innovation 8.4.5 LTS 8.0.42 Select Operating System: Select Operating System… Microsoft Windows Ubuntu Linux Debian Linux SUSE Linux Enterprise Server Red Hat Enterprise Linux / Oracle Linux Fedora Linux - Generic Oracle Solaris mac

dev.mysql.com

  • Gradle

**STS에서 Gradle 프로젝트 생성한 과정 

*** 함께 보면 좋은 글

2025.07.10 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - 스프링 부트 개요

 

스프링 부트 핵심 가이드(장정우 지음) - 스프링 부트 개요

1. 스프링 프레임워크자바(Java) 기반 애플리케이션 프레임워크로, 엔터프라이즈급(기업 환경 대상 개발) 애플리케이션을 위한 다양한 기능 제공-> 오픈소스 경량급 애플리케이션 프레임워크로

keep-programming-study.tistory.com

2025.07.11 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - 개발에 앞서 알면 좋은 기초 지식

 

스프링 부트 핵심 가이드(장정우 지음) - 개발에 앞서 알면 좋은 기초 지식

1. 서버 간 통신마이크로서비스 아키텍처에서 한 서버가 다른 서버에 통신을 요청하는 것을 의미-> 한 대는 서버/다른 한 대는 클라이언트가 됨 가장 많이 사용되는 방식은 HTTP/HTTPS 방식(TCP/IP, SOA

keep-programming-study.tistory.com

2025.08.15 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - Spring Data JPA 활용 1(JPQL, 쿼리 메서드 살펴보기, 정렬과 페이징 처리)

 

스프링 부트 핵심 가이드(장정우 지음) - Spring Data JPA 활용 1(JPQL, 쿼리 메서드 살펴보기, 정렬과

*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성 Windows11(윈도우 11) 환경자바 JDK 17 버전 설치 https://yungenie.tistory.com/11 [Java] 차근차근 Java 설치하기 (JDK17, Window 11)자바 개발 도구 설치 방법

keep-programming-study.tistory.com

2025.08.19 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - Spring Data JPA 활용 2(@Query 어노테이션 사용하기, QueryDSL 적용하기)

 

스프링 부트 핵심 가이드(장정우 지음) - Spring Data JPA 활용 2(@Query 어노테이션 사용하기, QueryDSL 적

*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성 Windows11(윈도우 11) 환경자바 JDK 17 버전 설치 https://yungenie.tistory.com/11 [Java] 차근차근 Java 설치하기 (JDK17, Window 11)자바 개발 도구 설치 방법

keep-programming-study.tistory.com

2025.08.28 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - Spring Data JPA 활용 3(QueryDSL 적용하기2)

 

스프링 부트 핵심 가이드(장정우 지음) - Spring Data JPA 활용 3(QueryDSL 적용하기2)

*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성 Windows11(윈도우 11) 환경자바 JDK 17 버전 설치 https://yungenie.tistory.com/11 [Java] 차근차근 Java 설치하기 (JDK17, Window 11)자바 개발 도구 설치 방법

keep-programming-study.tistory.com

 

1. JPA  Auditing 개요

  • JPA에서 'Audit'이란 감시한다는 의미로, 각 데이터마다 '누가', '언제' 데이터를 생성하고 변경했는지 감시하는 역할을 함
  • 엔티티 클래스에는 공통적으로 들어가는 필드(생성 주체, 생성 일자, 변경 주체, 변경 일자)가 있는데,
    매번 엔티티를 생성하거나 변경할 때마다 이들의 값을 주입해야 하는 번거로움이 있음
    -> Spring Data JPA에서 이러한 값을 자동으로 넣어주는 기능 제공
  • 엔티티에 이 기능을 적용하는 것

2. JPA  Auditing 기능 활성화

 
  • main() 메서드가 있는 애플리케이션 클래스에 다음과 같이 @EnableJpaAuditing 어노테이션 추가
// src/main/java/com.example.demo/StudyApplication.java
package com.example.demo;

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

@EnableJpaAuditing
@SpringBootApplication
public class StudyApplication {

	public static void main(String[] args) {
		SpringApplication.run(StudyApplication.class, args);
	}

}
  • 테스트 코드를 작성해서 애플리케이션을 테스트 할 경우,
    @WebMvcTest 어노테이션을 지정하는 상황에서는 애플리케이션 클래스를 호출하는 과정에서 예외가 발생할 수 있음
    -> 아래처럼 별도의 Configuration 클래스를 생성해서 애플리케이션 클래스의 기능과 분리해서 활성화하는 것이 좋음
package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

/**
 * JPA Auditing을 활성화하기 위한 설정 클래스
 * 이 설정을 통해 @CreatedDate, @LastModifiedDate 등의 어노테이션이 작동
 */
//Spring의 Configuration 클래스로 지정하여, 이 클래스가 설정 정보를 담고 있음을 나타냄
@Configuration 
//JPA Auditing 기능을 활성화하기 위한 어노테이션: 엔티티의 생성일자, 수정일자 등을 자동으로 관리
@EnableJpaAuditing 
public class JpaAuditingConfiguration {
    // 현재는 별도의 설정이 없지만, 필요 시 AuditorAware 등을 정의
}

3. BaseEntity 만들기

  • 코드의 중복을 없애기 위해서는 각 엔티티에 공통으로 들어가게 되는 칼럼(필드)을 하나의 클래스로 빼는 작업을 수행해야 함
    -> 자주 활용되는 기법

1) 생성 일자와 변경 일자만 추가하여 BaseEntity 생성 

package com.example.demo.jpa.data.entity;

import java.time.LocalDateTime;

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter // 모든 필드에 대한 getter 메서드 자동 생성
@Setter // 모든 필드에 대한 setter 메서드 자동 생성
@ToString // toString 메서드 자동 생성
@MappedSuperclass // 이 클래스를 상속받는 엔티티 클래스에 필드가 매핑되도록 지정
@EntityListeners(AuditingEntityListener.class) // 생성일-수정일 자동 설정을 위해 Auditing 기능 활성화
public class BaseEntity {

    @CreatedDate // 엔티티가 처음 저장될 때 자동으로 현재 시간이 설정됨
    @Column(updatable = false) // 생성일은 수정되지 않도록 설정
    private LocalDateTime createdAt; // 생성일시

    @LastModifiedDate // 엔티티가 수정될 때 자동으로 현재 시간이 설정됨
    private LocalDateTime updatedAt; // 최종 수정일시
}

2) BaseEntity를 상속받은 Product 엔티티 클래스

// Product.java
package com.example.demo.jpa.data.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

//클래스의 모든 필드에 대해 Getter 메서드를 자동 생성
@Getter
//클래스의 모든 필드에 대해 Setter 메서드를 자동 생성
@Setter
//파라미터가 없는 기본 생성자를 자동 생성
@NoArgsConstructor
//모든 필드를 파라미터로 받는 생성자를 자동 생성
@AllArgsConstructor
//이 클래스는 JPA 엔티티로 데이터베이스 테이블과 매핑
@Entity
// 객체 생성 시 빌더 패턴을 사용할 수 있게 해주는 어노테이션
@Builder
// toString() 메서드를 자동 생성하되, name 필드는 출력에서 제외
@ToString(exclude="name")
//엔티티가 매핑될 테이블 이름을 명시적으로 지정 (기본값은 클래스 이름)
@Table(name="product")
// BaseEntity를 상속하여, LocalDateTime.now() 메서드로 시간을 주입하지 않아도 자동으로 생성 일시/수정 일시의 값 생성
public class Product extends BaseEntity {
	// 기본 키(PK)로 지정된 필드. 데이터베이스의 고유 식별자 역할
    @Id
    // ID 값을 자동 생성함. GenerationType.IDENTITY는 DB가 직접 AUTO_INCREMENT 방식으로 생성하도록 함(insert 후에 pk 자동생성)
    // -> IDENTITY외에도 AUTO(기본값, 사용하는 데이터베이스에 맞게 기본값 자동 생성), 
    //    SEQUENCE(Oracle, PostgreSQL 등 시퀀스를 지원하는 DB에서 별도 시퀀스 객체를 생성해 PK값 증가), 
    //    TABLE(키 값을 관리하는 별도 테이블을 생성해 PK값 증가-성능 낮음)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
	private long number;

    // 엔티티 클래스의 필드는 자동으로 테이블 칼럼으로 매핑되므로, 별다른 설정을 하지 않을 경우 @Column을 생략해도 됨
    // 상품 이름 (Null 허용하지 않음)
    @Column(nullable = false)
    private String name;
    
    // 가격 (Null 허용하지 않음)
    @Column(nullable = false)
    private int price;
    
    // 재고 수량 (Null 허용하지 않음)
    @Column(nullable = false)
    private int stock;

    // 상품 생성 일시와 상품 수정 일시 자동 설정
}

3) JPA  Auditing 테스트

// src/test/java/com.example.demo/ProductRepositoryTest.java
package com.example.demo;

... 생략 ...


public class ProductRepositoryTest {
	
	//필요한 의존 객체의 “타입"에 해당하는 빈을 찾아 주입
	@Autowired
	ProductRepository productRepository;

	... 생략 ...
	
	// JPA Auditing 테스트
	@Test
	public void auditingTest() {
		Product product = new Product();
		product.setName("펜");
		product.setPrice(1000);
		product.setStock(100);
		
		Product savedProduct = productRepository.save(product);
		
		System.out.println("productName: " + savedProduct.getName());
		System.out.println("createdAt: " + savedProduct.getCreatedAt());
	}
}

*ProductRepositoryTest.java를 우클릭해서 Run As -> JUnit Test를 클릭한 결과

반응형