오늘 공부할 주제
Github 코드 보기
1. Model package 생성
먼저 MVC(Model-View-Controller)패턴 중 model을 만들기 위해 myblog 하위에 model package를 생성해 준다.
2. Board Entity만들기
package com.coon.myblog.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false, length = 100)
private String title;
@Lob
private String content;
private int count;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "userId")
private User user;
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
@JsonIgnoreProperties({"board"})
@OrderBy("id desc")
private List<Reply> replys;
@CreationTimestamp
private Timestamp createTime;
}
Board 테이블에는 게시물 아이디, 제목, 내용, 조회수, 작성자, 댓글, 작성시간의 컬럼을 추가하였다.
id
게시물 아이디는 primary key, auto_increment를 위해 @Id, @GeneratedValue(strategy = GenerationType.IDENTITY)를 사용.
title
제목은 null값 불가와 100자까지 허용하기 위해 @Column(nullable = false, length = 100)를 사용.
content
내용은 255자 이상의 글을 가능하게 하기 위해 @Lob를 사용.
user (자세한 설명)
여러 게시물을 하나의 user가 생성할 수 있게 하기위해 @ManytoOne 사용.
게시물 사용자의 다른 정보를 같이 조회하기 위해 Eager전략을 사용.
reply
하나의 게시물에 여러 댓글이 달릴 수 있게하기 위해 @OnetoMany 사용.
댓글에 따른 게시물의 정보를 모두 한번에 가져오기 위해 Eager전략 사용.
댓글의 id로 내림차순 정렬하기 위해 @OrderBy("id desc") 사용.
reply는 FK이기 때문에 Board테이블에 컬럼으로 나타나지 않는다.
createTime
insert쿼리가 작동시 현재 시간을 저장하기 위해 @CreationTimestamp 사용.
3. User Entity만들기
package com.coon.myblog.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Builder
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false, length = 100, unique = true)
private String username;
@Column(nullable = false, length = 100)
private String password;
@Column(nullable = false, length = 50)
private String email;
@Enumerated(EnumType.STRING)
private RoleType roleType;
}
User 테이블에는 유저 아이디, 유저이름, 비밀번호, 이메일, 권한의 컬럼을 추가하였다.
id
게시물 아이디는 primary key, auto_increment를 위해 @Id, @GeneratedValue(stategy=GenerationType.IDENTITY)를 사용.
username
제목은 null값 불가, 100자 허용, 중복방지를 위해 @Column(nullable=false, length = 100, unique = true)를 사용.
password
비밀번호는 null값 불가와 100자까지 허용하기 위해 @Column(nullable = false, length = 100)를 사용
이메일은 null값 불가와 50자까지 허용하기 위해 @Column(nullable = false, length = 50)를 사용.
roleType
정해진 범위의 권한을 부여하기 위해 @Enumerated(EnumType.STRING)사용.
4. Reply Entity만들기
package com.coon.myblog.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.sql.Timestamp;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Builder
public class Reply {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false, length = 200)
private String content;
@ManyToOne
@JoinColumn(name = "board")
private Board board;
@ManyToOne
@JoinColumn(name = "userId")
private User user;
@CreationTimestamp
private Timestamp createTime;
}
Reply 테이블에는 댓글 아이디, 내용, 게시물 아이디, 작성자 아이디, 작성시간의 컬럼을 추가하였다.
id
게시물 아이디는 primary key, auto_increment를 위해 @Id, @GeneratedValue(strategy = GenerationType.IDENTITY)를 사용.
content
내용은 null값 불가, 200자 허용, 중복방지를 위해 @Column(nullable = false, length = 200)를 사용.
board (자세한 설명)
여러 댓글을 하나의 게시물에 달릴 수 있게 하기위해 @ManytoOne 사용.
@ManytoOne의 기본적략이 Eager이기 때문에 생략.
user(자세한 설명)
여러 댓글을 유저한명이 쓸 수 있도록 @ManytoOne 사용.
@ManytoOne의 기본적략이 Eager이기 때문에 생략.
createTime
insert쿼리가 작동시 현재 시간을 저장하기 위해 @CreationTimestamp 사용.
'개인 프로젝트 > 블로그 만들기' 카테고리의 다른 글
나의 블로그 만들기 프로젝트 (6일차) - 글쓰기 완료 (0) | 2023.04.05 |
---|---|
나의 블로그 만들기 프로젝트 (5일차) - 로그인 처리 (0) | 2023.04.02 |
나의 블로그 만들기 프로젝트 (4일차) - 회원가입 처리 (0) | 2023.04.01 |
나의 블로그 만들기 프로젝트 (3일차) - index 페이지 로딩 (0) | 2023.03.31 |
나의 블로그 만들기 프로젝트 (1일차) - yml, gradle 설정 (0) | 2023.03.28 |