게시판 서비스 DB접근 로직

ttaho·2023년 2월 13일
0

Project-board

목록 보기
1/16

Spring boot를 학습하기위해 게시판프로젝트를 만들어 보려고한다.
API 구현 문서와 erd는 미리 작성해 두었다.

erd에 따라 게시글(article)클래스를 정의한다.

각각의 필드들에 대해서 살펴보자

  • id(notnull) - 게시글의 id 고유번호로 사용
  • title(notnull) - 게시글의 제목
  • content(notnull) - 게시글의 내용
  • hashTag(nullable) - 해시태그
  • createdAt(notnull) - 게시글 생성일시
  • createdBy(notnull) - 게시글을 작성한 사람
  • modifiedAt(notnull) - 게시글 수정일시
  • modifiedBy(notnull) - 게시글 수정한 사람

id는 JPA persistence context가 자동으로 부여해주는 고유 번호
title,content,hashTag는 직접 입력해줘야 하고
createdAt,createdBy,modifiedAt,modifiedBy는 자동으로 생성되게 하기위해 auditing기능을 사용한다.

auditing기능을 사용하기위해 config클래스에 @EnableJpaAuditing 애노테이션을 사용
createdBy를 위한 AuditorAware부분에 임시로 pazu라는 사람이름을 넣어주자. 나중에 수정예정

#JpaConfig.java
package com.fastcampus.projectboard.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import java.util.Optional;
//Auditing을 사용하기위해 아래의 애노테이션 사용
@EnableJpaAuditing
//각종 설정을 잡기위해 config사용
@Configuration
public class JpaConfig {

    @Bean
    public AuditorAware<String> auditorAware() {//auditorAware이 만든사람인식하는거인듯
        return () -> Optional.of("pazu"); //auditing할때마다 사람이름은 pazu가 들어간다. TODO: 스프링 시큐리티로 인증 기능을 붙이게 될때, 수정하자
    }

}
#Article.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 = "title"),
        @Index(columnList = "hashtag"),
        @Index(columnList = "createdAt"),
        @Index(columnList = "createdBy")
})
@Entity
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; //게시글 id
    //위에까지가 id를 잡아준거임 id에 setter를 안걸어준 이유는 JPA persistence context가 자동으로 부여해주는 고유 번호이기떄문임

    //setter를 전체 클래스에 걸지않고 각필드(title,content ....)에 거는 이유는
    //일부러 사용자가 특정 필드에 접근해서 setting하는것을 막기위해서 임.
    //@Column(nullable = false)은 디폴드가 true인데, 널값을 넣을수 없는 필드에만 해당 애노테이션을 추가한다.
    @Setter @Column(nullable = false) private String title; //게시글 제목
    @Setter @Column(nullable = false, length=10000) private String content; //게시글 내용

    @Setter private String hashtag; //해시태그

    // 아래의 필드들은 자동으로 auditing해주기위해 아래와같은 애노테이션을 붙임
    @CreatedDate @Column(nullable = false) private LocalDateTime createdAt; //게시글 생성일시
    //위의 Date는 시스템시간을 하면된다고 치고, 밑의 게시글생성자는 어떻게 auditing을 해줄까?
    //JpaConfig에서 AuditorAware을 사용하여 잡아주는것 같다.
    @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 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); //id가 부여되지않았다(영속화 되지 않았다)면 false,
        // id가 부여됐다면 id가 같은지 보고 id가 같다면 두개가 같은 게시글일것이다.-> 동일성검사 id로만 한다.
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

다음으로 게시글 댓글(ArticleComment) 클래스를 만들어야한다.

profile
백엔드 꿈나무

0개의 댓글