Spring boot를 학습하기위해 게시판프로젝트를 만들어 보려고한다.
API 구현 문서와 erd는 미리 작성해 두었다.
erd에 따라 게시글(article)클래스를 정의한다.
각각의 필드들에 대해서 살펴보자
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) 클래스를 만들어야한다.