스프링 부트를 활용한 게시판 만들기 프로젝트입니다.
목차는 다음 링크에서 확인 가능합니다.
[Spring] 게시판 #0. 게시판 사이트 프로젝트 시작
Django로 게시판을 만들었을 때와 달리 스프링 강의는 뭔가 너무 어려운 내용들이 많아 쉽게 뭔가 만들지를 못했다. 하지만 그렇게 지내다 보니 어느덧 4학년 개강을 앞두고 있고, 결과물은 하나
somefood.tistory.com
자세한 코드는 아래 링크에서 확인할 수 있습니다.
GitHub - somefood/spring-study
Contribute to somefood/spring-study development by creating an account on GitHub.
github.com
간단한 화면 구성을 끝냈으니, 이제 엔티티 구성을 해볼 차례이다.
아직은 초간단 게시판 예제라 크게 구성할건 없다 생각한다. 로그인 기능을 통한 글쓰기는 좀 더 뒤로 미루고 게시판의 구성은 다음과 같다.
- board 엔티티: 제목과 글, 그리고 추후 작성자 컬럼이 들어갈 것이다.
- category 엔티티: 게시글의 카테고리가 될 엔티티이다. 게시글도 여러 분야가 많으니 넣어줬다.
생각나는 엔티티들이 없어 아직 다 못 넣긴 했는데, 엔티티들 중에 공통적으로 사용되는 컬럼들이 있을 것이다.
대표적으로 생성시각, 수정시각, 작성자 이렇게 있을 것이다. 이 컬럼들을 엔티티마다 노가다성으로 넣어주는 것은 비효율적일 것이다.
(개발자들은 항상 중복을 싫어하니까 ㅎㅎ)
그렇기에 기저 클래스가 하나 만들어 두도록 하자.
package com.somefood.board.domain;
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
public LocalDateTime getCreatedDate() {
return createdDate;
}
public LocalDateTime getModifiedDate() {
return modifiedDate;
}
}
@MappedSuperclass - JPA Entity 클래스들이 해당 추상 클래스를 상속할 경우, 선언한 필드들을 자신들의 컬럼으로 반영해준다.
@EntityListenrs(AuditingEntityListner.class)를 사용하여 Audit 기능 활성화 한다. audit의 의미가 감시 한다는 의민데 이를 통해 변화가 생기면 값을 반영해주는거 같다.
Auditing 기능을 활성화 하려면 애플리케이션에 다음과 같은 어노테이션도 달아주어야 한다.
@EnableJpaAuditing
@SpringBootApplication
public class BoardApplication {
public static void main(String[] args) {
SpringApplication.run(BoardApplication.class, args);
}
}
Auditing 기능을 통해 엔티티가 영속성 컨텍스트에 저장 후 트랜잭션 커밋 시점에 플러시가 호출할 때 하이버네이트가 자동으로 시간 값을 채워준다. (기회가 되면 영속성 컨텍스트도 정리해봐야겠다.)
자, 그러면 기저 클래스를 board 엔티티에 반영해보도록 해보자.
package com.somefood.board.domain;
@Entity
@Getter
@Setter
@Table(name = "boards")
public class Board extends BaseTimeEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "board_id")
private Long id;
private String title;
private String content;
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
}
- @Entity: 해당 클래스가 Entity임을 선언해주는 거다. 이를 활용하여 DB 관리도 하고 한다.
- @Getter, @Setter: Lombok 어노테이션들로 자바 프로퍼티 형식으로 getter, setter 메서드들을 만들어 준다. 무척 편리한 라이브러리다.
- @Table: 어느 테이블로 매핑시킬지 정해준다. name을 선언해주지 않으면 기본적으로 @Entity 이름을 따르는데, 기본값이 클래스명이라 보면 된다.
- @Id: 테이블에는 주 키(Primary Key)가 필요한데 보통 id를 지정한다. 해당 어노테이션을 통해 id를 지정한다.
- @GeneratedValue(straegy = GenerationType.IDENTITY): 영속성 컨텍스트에서 키 값을 어떻게 줄 지 선언하는 건데, IDENTITY를 넣어주어 DB에서 식별해서 넣어주도록 해주었다.
- @Column: 컬럼명을 바꾸기 위해 써주었다.
- @ManyToOne, @JoinColumn: FK값을 지정해주기 위해 썼다. 카테고리와 연결해주어 사용할 것이다.
카테고리는 시각 칼럼에 대해 필요없을거 같아 상속받지 않았다.
package com.somefood.board.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Getter @Setter
public class Category {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "category_id")
private Long Id;
private String name;
}
왜 반대에서는 board에 대한 레퍼런스가 없냐 궁금할 수도 있는데, 사실 DB 입장에서는 필요가 없기 때문이다. 카테고리를 활용해 게시판을 조회한다 하면, where문과 join만 활용해도 되기 때문이다. 하지만 스프링에서도 이를 활용해야할 경우도 있을 수 있기에 아래처럼 매핑해주면 된다.
@OneToMany(mappedBy = "category")
private List<Board> boards = new ArrayList<>();
카테고리 입장에서는 게시글이 1:N 관계니까 OneToMany로 해주었고, 리스트로 돌려 받는다.
이렇게 해서 간단한 게시글 구조는 맞춰주었다. 이를 활용해 Controller, Service, Repository들을 구성해보자.
'Spring > project' 카테고리의 다른 글
[Spring] 게시판 #4. Controller, Service, Repository 구성 (0) | 2022.02.24 |
---|---|
[Spring] 게시판 #2. 화면 구성하기 with 템플릿 (0) | 2022.02.23 |
[Spring] 게시판 #1. 프로젝트 생성 & 설정 (0) | 2022.02.23 |
[Spring] 게시판 #0. 게시판 사이트 프로젝트 시작 (0) | 2022.02.22 |
댓글