게시판 서비스 DB접근 로직2

ttaho·2023년 2월 14일
0

Project-board

목록 보기
2/16

게시글 클래스에 이어서 게시글댓글 클래스를 정의해보자.
게시글 클래스와 비슷한 형식으로 만들어준다.

#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 테이블이 생성된것을 확인할 수 있다.

DTO

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란?

cascade 옵션이란 @OneToMany 나 @ManyToOne에 옵션으로 줄 수 있는 값이다.
Entity의 상태 변화를 전파시키는 옵션이다.
만약 Entity의 상태 변화가 있으면 연관되어 있는(ex. @OneToMany, @ManyToOne) Entity에도 상태 변화를 전이시키는 옵션이다.
기본적으로는 아무 것도 전이시키지 않는다.

해당 프로젝트에서는 게시글과 댓글이 연관되어있으므로 어떤 게시글이 삭제될때 연관되어있는 해당게시글의 댓글들이 알아서 자동으로 삭제되도록 하는기능이라고 이해하면 될 것 같다.

게시글->댓글로 매핑을 하기위해 articleComments를 추가해준다.

테스트를 위한 레포지토리를 정의하기 위해 생성해준다.


두 jpa repository가 생성되었다.
test를 위해 ctrl + shift + t 를 사용하여 새로운 test를 생성한다.

profile
백엔드 꿈나무

0개의 댓글