๐Ÿ”ฅ #2 User, Board, Reply ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ

myeonjiยท2022๋…„ 2์›” 15์ผ
0

๋ธ”๋กœ๊ทธ์— ์‚ฌ์šฉํ•  Entity ๋งŒ๋“ค๊ธฐ!
User, Board, Reply(๋Œ“๊ธ€) ์ด ํ•„์š”ํ•˜๋‹ค.
์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘

User

// 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 ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

Board

@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)๊ฐ€ ๋ณด์—ฌ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

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๋Š” ๋Œ“๊ธ€์„ ๋‹จ ์ž‘์„ฑ์ž ์ด๋‹ค.

profile
๐Ÿ“š

0๊ฐœ์˜ ๋Œ“๊ธ€