3. 데이터베이스 접근 로직 구현프로젝트/게시판 서비스2023. 11. 30. 20:24
Table of Contents
package com.sooho.projectboard.domain;
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import lombok.ToString;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Getter
@ToString
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public class AuditingFields {
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME )
@CreatedDate
@Column(nullable = false, updatable = false)
private LocalDateTime createdAt; //생성일시
@CreatedBy
@Column(nullable = false,updatable = false,length = 100)
private String createdBy; // 생성자
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME )
@LastModifiedDate
@Column(nullable = false)
private LocalDateTime modifiedAt; // 수정일시
@LastModifiedBy
@Column(nullable = false, length = 100)
private String modifiedBy; // 수정자
}
AuditingFields 클래스는 JPA 엔티티들이 공통으로 가지는 감사 ( Auditing ) 관련 필드들을 모아둔 공통 클래스 이다.
이 클래스를 추가 함으로 써 몇 가지 장점이 생길수 있다.
1. 코드 재사용 및 중복 제거 :
공통 필드를 별도의 클래스로 분리함으로써 다른 엔티티 클래스에서 이를 상속받아 사용할 수 있다.
이렇게 하면 각 엔티티에서 Auditing 관련 필드를 반복해서 작성하는 번거로움을 줄일 수 있다.
2. 유지보수 및 확장성 향상 :
Auditing 관련 로직이 한곳에 모이므로 변경이 필요할 때 한 곳만 수정하면 된다. 새로운 Auditing 관련 요구 사항이 생길 경우 이 클래스만 수정하여 모든 엔티티에 쉽게 적용할 수 있다.
3. 일관성 :
모든 엔티티에서 Auditing 필드의 이름, 타입, 기본동작 등이 일관 되게 유지된다. 이것은 코드의 일관성을 유지하고 데이터베이스에서 생성된 날짜 및 수정된 날짜에 일관성을 부여한다
4.생성자 및 수정자 정보 관리 :
데이터의 생성자와 수정자를 추적하고 관리하는데 도움이 된다 누가 데이터를 만들고 변경했는지를 추적할 수 있어 데이터의 신뢰성을 높일 수 있다.
위 이유로 인하여 AuditingFields 클래스를 추가하였다.
이로써 다른 코드의 수정은 밑과 같다.
package com.sooho.projectboard.domain;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
@Getter
@ToString
@Table(indexes = {
@Index(columnList = "title"),
@Index(columnList = "hashtag"),
@Index(columnList = "createdAt"),
@Index(columnList = "createdBy"),
})
@Entity
public class Article extends AuditingFields {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Setter @Column(nullable = false) private String title; // 제목
@Setter @Column(nullable = false, length = 10000) private String content; // 본문
@Setter private String hashtag; // 해시태그
@OrderBy("id")
@OneToMany(mappedBy = "article", cascade = CascadeType.ALL)
@ToString.Exclude
private final Set<AricleComment> aricleComments = new LinkedHashSet<>();
protected Article() {}
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);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Article article)) return false;
return id != null && id.equals(article.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
package com.sooho.projectboard.domain;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import java.time.LocalDateTime;
import java.util.Objects;
@Getter
@ToString
@Table(indexes = {
@Index(columnList = "content"),
@Index(columnList = "createdAt"),
@Index(columnList = "createdBy")
})
@Entity
public class AricleComment extends AuditingFields{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Setter @ManyToOne(optional = false) private Article article; //게시글 (ID)
@Setter @Column(nullable = false, length = 500) private String content; // 본문
protected AricleComment() {}
private AricleComment(Article article, String title) {
this.article = article;
this.content = content;
}
public static AricleComment of(Article article, String content) {
return new AricleComment(article, content);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof AricleComment that)) return false;
return id != null && id.equals(that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
'프로젝트 > 게시판 서비스' 카테고리의 다른 글
4. API 테스트 정의 (0) | 2023.12.01 |
---|---|
2. 데이터베이스 접근 로직 테스트 정의 (1) | 2023.11.30 |
1-2 프로젝트 기획 (필요한 기술 정리) (0) | 2023.11.24 |
1-1 프로젝트 기획 (환경,목적) (1) | 2023.11.24 |
@Soohocoding :: Soohocoding
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!