JAVA의 ORM
기술인 JPA
를 사용해서 도메인을 관계형 데이터베이스 테이블에 매핑할 수 있다.
ORM (Object Relational Mapping) : 객체와 관계형 DB의 테이블을 연결한다는 뜻이며 둘이 개념적으로 일치하지 않는 부분을 해결하기 위함
JPA (Java Persistence API) : JAVA ORM 기술에 대한 API 표준 명세, ORM을 사용하기 위한 인터페이스의 모음
JPA의 구현체인 Hibernate를 주로 사용
Auditing은 Audit(감시하다)의 뜻 그대로 Entity를 보고있다가 DB에 저장하거나 업데이트를 하는 경우 생성일자, 생성자, 수정일자, 수정자 등 중요한 메타데이터를 자동으로 데이터베이스에 반영해주는 기능이다.
AuditingFields.java
@EntityListners(AuditingEntityListner.class)
@MappedSuperclass
public abstract class AuditingFields {
@CreatedDate
private LocalDateTime createdAt; // 생성일시
@CreatedBy
private String createdBy; // 생성자
@LastModifiedDate
private LocalDateTime modifiedAt; // 수정일시
@LastModifiedBy
private String modifiedBy; // 수정자
}
Article.java
@Entity
public class Article extends AuditingFields{
private Long id;
private String title; // 제목
private String content; // 본문
private String hashtag; // 해시태그
private Article(String title, String content, String hashtag) {
this.title = title;
this.content = content;
this.hashtag = hashtag;
}
public static Article of(String title, String content, String hashtag) {
return new Article(title, content, hashtag);
}
...
}
SpringBootApplication.java
@EnableJpaAuditing
@SpringBootApplication
public class BoardSpringbootApplication {
public static void main(String[] args {
SpringApplication.run(BoardSpringbootApplication.class, args);
}
}
위 코드처럼 메인 메소드가 존재하는 클래스에 선언을 해도 상관없지만 테스트 코드에 영향을 줘서 테스트가 실패할 수 있고 웬만하면 메인 메소드를 건들지 않는 것이 좋다고해서,, 클래스를 따로 분리하는게 좋다.
JpaConfig.java
@EnableJpaAuditing
@Configuration
public class JpaConfig {
@Bean
public AuditorAware<String> auditorAware() {
return () -> Optional.of(SecurityContextHolder.getContext().getAuthentication().getName());
//Spring Security의 Authentication을 가져와서 사용자명 반환
}
}
AuditorAware()를 빈으로 등록하면 @CreatedBy, @LastModifiedBy가 붙은 필드에 현재 로그인한 사용자의 정보를 주입할 수 있다.
JPA Auditing 기능을 사용해서 생성, 수정 일자 자동화하기
[JPA ] Auditing 기능 살펴보기
JPA Auditing
Spring Data Jpa로 DB에 생성일, 수정일 자동화 하기