게시글 클래스에 이어서 게시글댓글 클래스를 정의해보자.
게시글 클래스와 비슷한 형식으로 만들어준다.
#ArticleComment.java
package com.fastcampus.projectboard.domain;
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 javax.persistence.*;
import java.time.LocalDateTime;
import java.util.Objects;
@Getter
@ToString
@Table(indexes = {
@Index(columnList = "content"),
@Index(columnList = "createdAt"),
@Index(columnList = "createdBy")
})
@Entity
public class ArticleComment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; //게시글 id
@Setter @ManyToOne(optional = false) private Article article; //게시글 객체
@Setter @Column(nullable = false, length=500) private String content; //댓글 내용
// 아래의 필드들은 자동으로 auditing해주기위해 아래와같은 애노테이션을 붙임
@CreatedDate @Column(nullable = false) private LocalDateTime createdAt; //댓글 생성일시
@CreatedBy @Column(nullable = false, length=100) private String createdBy; //댓글 작성자
@LastModifiedDate @Column(nullable = false)private LocalDateTime modifiedAt; //댓글 수정일시
@LastModifiedBy @Column(nullable = false, length=100) private String modifiedBy; //댓글 수정자
protected ArticleComment() {
}
private ArticleComment(Article article, String content) {
this.article = article;
this.content = content;
}
public static ArticleComment of(Article article, String content) {
return new ArticleComment(article, content);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ArticleComment that)) return false;
return id != null && id.equals(that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
위와 같이 만들어준후, projectBoardApplication을 run해주면
Db에 article,article_comment 테이블이 생성된것을 확인할 수 있다.
JPA Buddy에서 DTO를 선택해준다.
DTO란?
DTO(Data Transfer Object) 는 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)입니다.
유저가 입력한 데이터를 DB에 넣는 과정을 보겠습니다.
- 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송합니다.
- 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣습니다.
DAO란?
DAO(Data Access Object) 는 데이터베이스의 data에 접근하기 위한 객체입니다. DataBase에 접근 하기 위한 로직 & 비지니스 로직을 분리하기 위해 사용합니다.
article의 DTO를 생성해주는데, id는 체크를 해제하고 java Record는 체크를 한다.
ArticleDto 가 생성됐다. 하지만 현재는 필요없다.
Article과 ArticleComment를 만들었으므로 연관관계 매핑을 진행하자.
댓글에서 게시글로는 매핑을 했기때문에
양방향 바인딩을 해야한다.
cascade 옵션이란 @OneToMany 나 @ManyToOne에 옵션으로 줄 수 있는 값이다.
Entity의 상태 변화를 전파시키는 옵션이다.
만약 Entity의 상태 변화가 있으면 연관되어 있는(ex. @OneToMany, @ManyToOne) Entity에도 상태 변화를 전이시키는 옵션이다.
기본적으로는 아무 것도 전이시키지 않는다.
해당 프로젝트에서는 게시글과 댓글이 연관되어있으므로 어떤 게시글이 삭제될때 연관되어있는 해당게시글의 댓글들이 알아서 자동으로 삭제되도록 하는기능이라고 이해하면 될 것 같다.
게시글->댓글로 매핑을 하기위해 articleComments를 추가해준다.
테스트를 위한 레포지토리를 정의하기 위해 생성해준다.
두 jpa repository가 생성되었다.
test를 위해 ctrl + shift + t 를 사용하여 새로운 test를 생성한다.