๋ธ๋ก๊ทธ์ ์ฌ์ฉํ Entity ๋ง๋ค๊ธฐ!
User, Board, Reply(๋๊ธ) ์ด ํ์ํ๋ค.
์ฐ๊ด๊ด๊ณ ๋งคํ
// JPA๋ ORM -> Java(๋ค๋ฅธ ์ธ์ด ํฌํจ) Object๋ฅผ ํ
์ด๋ธ๋ก ๋งคํํด์ฃผ๋ ๊ธฐ์
// ๊ฐ๋ฐ์๊ฐ Object๋ฅผ ๋ง๋ค๋ฉด JPA๊ฐ ํ
์ด๋ธ์ ๋ง๋ค์ด์ค
@Data // getter setter
@NoArgsConstructor // ๋น ์์ฑ์
@AllArgsConstructor // ์ ์ฒด ์์ฑ์
@Builder // ๋น๋ ํจํด
@Entity // User ํด๋์ค๊ฐ MySQL์ ์๋์ผ๋ก ํ
์ด๋ธ์ด ์์ฑ๋๋ค.
// @DynamicInsert // insert ํ ๋ null์ธ ํ๋ ์ ์ธ
public class User {
@Id // Primary key
@GeneratedValue(strategy = GenerationType.IDENTITY) // ํ๋ก์ ํธ์์ ์ฐ๊ฒฐ๋ DB์ ๋๋ฒ๋ง ์ ๋ต์ ๋ฐ๋ผ๊ฐ๋ค. (์ค๋ผํด์ด๋ MySQL์ด๋ .. ๋ฑ๋ฑ), ๋ด DB๋ MySQL์ด๋๊น auto_increment๊ฐ ๋จ
private int id; // ์ค๋ผํด-์ํ์ค, MySQL-auto_increment
@Column(nullable = false, length = 30) // null์ด ๋ ์ ์๊ณ , 30์๊น์ง ๋ฐ์ ์๋๋ค.
private String username; // ์์ด๋
@Column(nullable = false, length = 100) // null์ด ๋ ์ ์๊ณ , 100์๊น์ง ๋ฐ์ ์๋๋ค. (100์ ๋ฃ๋ ์ด์ : ํด์ฌ(๋น๋ฐ๋ฒํธ ์ํธํ)ํ ๊ฒ์ ๋๋นํด์ ๋๋ํ๊ฒ ๋ง๋ค๊ธฐ)
private String password;
@Column(nullable = false, length = 50) // null์ด ๋ ์ ์๊ณ , 50์๊น์ง ๋ฐ์ ์๋๋ค.
private String email;
// @ColumnDefault("'user'") // default๊ฐ ๋ง๋ค๊ธฐ, ๋ฌธ์๋ผ๋ ๊ฒ ์๋ ค์ฃผ๊ธฐ ์ํด ''๋ก ๊ฐ์ธ๊ณ ""๋ก ๋ค์ ๊ฐ์ธ๊ธฐ
@Enumerated(EnumType.STRING) // DB์๋ RoleType์ด๋ผ๋๊ฒ ์์ด์ ์ด๊ฑธ ๋ถ์ฌ์ค์ผํจ
private RoleType role; // Enum์ ์ฐ๋ฉด ๋ฐ์ดํฐ์ ๋๋ฉ์ธ(๋ฒ์)์ ๋ง๋ค์ด ์ค ์ ์๋ค. (๋๋ฉ์ธ : admin, user, manager ...) -> ํ์ง๋ง ์ฐ์ String์ผ๋ก.. -> ์ถํ Enum์ผ๋ก ์ค์
@CreationTimestamp // ์๊ฐ์ด ์๋์ผ๋ก ์
๋ ฅ
private Timestamp createDate;
}
User ํ ์ด๋ธ์๋ id, username, password, email, role, createDate ๋ฅผ ๋ง๋ค์๋ค.
@Data // getter setter
@NoArgsConstructor // ๋น ์์ฑ์
@AllArgsConstructor // ์ ์ฒด ์์ฑ์
@Builder // ๋น๋ ํจํด
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment ์ฌ์ฉํจ (MySQL)
private int id;
@Column(nullable = false, length = 100)
private String title;
@Lob // ๋์ฉ๋ ๋ฐ์ดํฐ
private String content; // ์ฌ๋จธ๋
ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ - ์ด ๊ธ์ด ๋์์ธ ๋๋๋ฐ <html> ํ๊ทธ๊ฐ ์์ฌ์ ๋์์ธ์ด ๋จ -> ๊ธ์์ ์ปค์ง -> ๋์ฉ๋
@ColumnDefault("0") // String์ด ์๋์ฌ์ ''๋ก ์ ๊ฐ์ธ๋ ๋จ
private int count; // ์กฐํ์
// ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ค๋ธ์ ํธ(๊ฐ์ฒด)๋ฅผ ์ ์ฅํ ์ ์์ด์ FK๋ฅผ ์ฌ์ฉํ๋ค. BUT ์๋ฐ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์๋ค. -> ๋ ๊ฐ์ ์ถฉ๋!
// ๋ฐ๋ผ์ ์๋ฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง์ถฐ FK(int)๋ก ์ ์ฅ -> private int userId;
// ํ์ง๋ง JPA๋ฅผ ์ฌ์ฉํ๋ฉด! ORM์์๋ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ ์ฅํ ์ ์๋ค. -> FK๋ก ์ฐพ๋๊ฒ ์๋๋ผ User ๊ฐ์ฒด ๋ฐ๋ก ๋ฃ์
@ManyToOne(fetch = FetchType.EAGER) // ์ฐ๊ด๊ด๊ณ Many = Board, One = User, ๊ธฐ๋ณธํจ์น์ ๋ต FetchType.EAGER (1๊ฑด)
@JoinColumn(name = "userId") // ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ค๊ฐ ๋ง๋ค ํ๋ ์ด๋ฆ(= ์นผ๋ผ๋ช
) ์ ํ ๋ ์ฌ์ฉ
private User user; // ๊ธ ์์ฑํ ์ฌ๋์ id, ์๋์ผ๋ก FK๋ก ๋ง๋ค์ด์ง๋ ๊ฒ
// @JoinColumn(name = "replyId") -> FK ํ์์์, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปฌ๋ผ ๋ง๋ค์ด์ง ์ ์์
// @OneToMany(mappedBy = "board", fetch = FetchType.LAZY)
// mappedBy -> ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ์๋๋ค. (๋ FK๊ฐ ์๋์์!! DB์ ์นผ๋ผ์ ๋ง๋ค์ง ๋ง์ธ์!!), ๊ทธ์ Board๋ฅผ selectํ ๋ ๊ฐ์ ์ป๊ธฐ ์ํด ํ์ํ ๊ฒ
// @OneToMany์ ๊ธฐ๋ณธํจ์น์ ๋ต FetchType.LAZY (ํ์ํ ๋๋ง..)
// But!!
// Board (๊ฒ์๊ธ์์ธํ์ด์ง)์ ๋ค์ด๊ฐ๋ฉด ์์ฑ์(User)์ ๋๊ธ(Reply)๋ ๋ฌด์กฐ๊ฑด ๋ถ๋ฌ์์ผ ํ๋ค. ๋ฐ๋ผ์ ํจ์น์ ๋ต์ ์๋์ผ๋ก ๋ถ๋ฌ์ค๋ EAGER์ ์ฌ์ฉํ์.
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
private List<Reply> reply;
@CreationTimestamp // ์๋์ผ๋ก ํ์ฌ์๊ฐ์ด ๋ค์ด๊ฐ
private Timestamp createDate;
}
Board ํ
์ด๋ธ์๋ id, title, content, count, user(User), reply(Reply), createDate ๋ฅผ ๋ง๋ค์๋ค.
User์ Reply๋ ์ฐ๊ด๊ด๊ณ ๋งคํ์ ํด๋์๋ค.
๋ง์ฝ, Board(๊ฒ์๊ธ)์ ์์ธํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ์์ฑ์(User)์ ๋๊ธ(Reply)๊ฐ ๋ณด์ฌ์ผํ๊ธฐ ๋๋ฌธ์ด๋ค!
@Data // getter setter
@NoArgsConstructor // ๋น ์์ฑ์
@AllArgsConstructor // ์ ์ฒด ์์ฑ์
@Builder // ๋น๋ ํจํด
@Entity
public class Reply {
@Id // Primary Key
@GeneratedValue(strategy = GenerationType.IDENTITY) // ํ๋ก์ ํธ์์ ์ฐ๊ฒฐ๋ DB์ ๋๋ฒ๋ง ์ ๋ต์ ๋ฐ๋ผ๊ฐ๋ค. auto_increment ์ฌ์ฉํจ (MySQL)
private int id;
@Column(nullable = false, length = 200)
private String content;
@ManyToOne // ์ฐ๊ด๊ด๊ณ Many = Reply, One = Board
@JoinColumn(name = "boardId")
private Board board; // ๋๊ธ ๋ฌ ๊ฒ์๊ธ
@ManyToOne // ์ฐ๊ด๊ด๊ณ Many = Reply, One = User
@JoinColumn(name = "userId")
private User user; // ๋๊ธ ๋จ ์ฌ๋
@CreationTimestamp
private Timestamp createDate;
}
Reply๋ ๋๊ธ์ ์๋ฏธํ ํ
์ด๋ธ์ด๋ค.
id, content(๋ด์ฉ), board(Board), user(User), creatDate ๋ฅผ ๋ง๋ ๋ค.
์ฌ๊ธฐ์ board๋ ๋๊ธ์ ๋จ ๊ฒ์๋ฌผ ์ด๊ณ , user๋ ๋๊ธ์ ๋จ ์์ฑ์ ์ด๋ค.