๐ŸŒง๏ธ ORM/JPA

JPA Auditing์œผ๋กœ ์ƒ์„ฑ์ผ, ์ˆ˜์ •์ผ ์ž๋™ ์ƒ์„ฑ

iseunghan 2022. 6. 25. 22:43
๋ฐ˜์‘ํ˜•

Auditing ์ด๋ž€?

์—”ํ‹ฐํ‹ฐ๋Š” ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด์„œ ์ƒ์„ฑ์ผ๊ณผ ์ˆ˜์ •์ผ์„ ํ•„์ˆ˜์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ์ผ๊ณผ ์ˆ˜์ •์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ์ผ

public Book saveBook(BookDto bookDto) {
    // BookDto -> Book ๋ณ€ํ™˜
    Book book = ...;

    book.setCreatedAt(LocalDateTime.now());

    ...
}

์ˆ˜์ •์ผ

public Long updateBook(Long bookId, BookDto bookDto) {
    // ์ˆ˜์ • ๋กœ์ง

    book.setModifiedAt(LocalDateTime.now());

    ...
}

์ด๋Ÿฐ์‹์œผ๋กœ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ์ฆ๊ฐ€ํ• ์ˆ˜๋ก ๋‹จ์ˆœ ๋ฐ˜๋ณต ์ฝ”๋“œ๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿด ๋•Œ Auditing์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ํ›จ์”ฌ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

JpaAuditing ์ ์šฉ

@MappedSuperClass
@EntityListners(AuditingEntityListener.class)
public abstract class Test {
    @CreatedDate
    LocalDateTime createdAt;

    @LastModifiedDate
    LocalDateTime modifiedAt;
}

์ด์ œ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ์— ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๋„๋ก ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ JpaAuditing์„ ํ™œ์„ฑํ™”๋˜๋„๋ก ์–ด๋…ธํ…Œ์ด์…˜๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋์ž…๋‹ˆ๋‹ค.

@EnableJpaAuditing  // **
@SpringBootApplication
public class Application {
    ...
}

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

Test ์‹œ ์ฃผ์˜์‚ฌํ•ญ

@EnableJpaAuditing์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œ ํ•˜๋‚˜์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ @WebMvcTest๋ฅผ ํ•˜๋ฉด Entity๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋•Œ๋Š” ๋”ฐ๋กœ @Configuration์ด ๋ถ™์€ ํด๋ž˜์Šค์— ๋ถ„๋ฆฌ์‹œ์ผœ์ฃผ๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Configuration
@EnableJpaAuditing
public class AppConfig {

}

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

REFERENCE

  • ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ AWS๋กœ ํ˜ผ์ž ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค - ์ด๋™์šฑ
๋ฐ˜์‘ํ˜•