๐ ๊ณต๋ถํ๊ฒ ๋ ๊ณ๊ธฐ
Entity ๋ฅผ ์์ฑํ ๋๋ง๋ค ์ปฌ๋ผ์ ๊ด๊ณ๋ฅผ ๋ช ์ํด ์ฃผ์ด์ผ ํ ๋ @ManyToOne ๊ณผ @ManyToMany ์ค ์ด๋ค ๊ฒ์ ์ฌ์ฉํด์ผ ํ ์ง ๊ณ ๋ฏผ์ด ๋์๋๋ฐ QNA ์๋น์ค ๊ธฐ๋ฅ ๋ณต์ต ์ค์ ์ด์ ๊ด๋ จํด์ ์ ์ ๋ฆฌ๊ฐ ๋ ๋ถ๋ถ์ด ์์ด์ ์ฐจ์ด๋ฅผ ๋น๊ตํด๋ณด๊ณ ์ ํ๋ค.
๐ ๊ธฐ๋ณธ Entity ์ ์
โก๏ธ ๋ ๊ด๊ณ์ ์ฐจ์ด๋ฅผ ํ์ธ ํ ์ ์์ ์ ๋๋ง์ ๊ฐ๋จํ Entity ๊ตฌ์ฑ์ด๋ค.
โ SiteUser
@Entity
public class SiteUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String username;
private String password;
}
โก Question
@Entity
public class Question {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(length = 200)
private String content;
@ManyToOne
private SiteUser author;
@ManyToMany
private Set<SiteUser> voter;
}
โข Answer
@Entity
public class Answer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column (columnDefinition = "TEXT")
private String content;
@ManyToOne
private Question question;
@ManyToOne
private SiteUser author;
@ManyToMany
private Set<SiteUser> voter;
}
๐ ๋ด์ฉ ์ ๋ฆฌ
1๏ธโฃ ManyToOne
โก๏ธ ์ง๋ฌธ (Question Entity) ๊ณผ ๋ต๋ณ (Answer Entity) ์ ๊ด๊ณ๋ฅผ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ๋ ์ฌ์ด์ ๊ด๊ณ๋ ์๋์ ๊ฐ๋ค.
์ง๋ฌธ1 : ๋ต๋ณ1 (O)
์ง๋ฌธ2 : ๋ต๋ณ2 (O)
์ง๋ฌธ2 : ๋ต๋ณ3 (O)
์ง๋ฌธ1 : ๋ต๋ณ2 (X) โก๏ธ ๋ต๋ณ2 ์ ์ด๋ฏธ ์ง๋ฌธ2 ์ ๋ต๋ณ์ผ๋ก ์ง์ ๋์๊ธฐ ๋๋ฌธ์ ์ง๋ฌธ1 ์ ๋ต๋ณ์ ๋ ์ ์๋ค.
์ง๋ฌธ ํ๋์ ์ฌ๋ฌ ๊ฐ์ ๋ต๋ณ์ด ๋ฌ๋ฆด ์ ์์ง๋ง ๊ฐ ๋ต๋ณ์ ํ๋์ ์ง๋ฌธ์๋ง ์ข ์ ๋ ์ ์๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ @ManyToOne ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ N ์ ํด๋นํ๋ Answer ์ ์ฐธ์กฐํ๋ Question ์ id ๊ฐ์ ์ ์ฅํจ์ผ๋ก์ ์ฝ๊ฒ ํํ ๊ฐ๋ฅํ๋ค.

2๏ธโฃ ManyToMany
โก๏ธ ์ง๋ฌธ (Question Entity) ๊ณผ ์ถ์ฒ์ธ (Set<SiteUser> voter) ์ ๊ด๊ณ๋ฅผ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ๋ ์ฌ์ด์ ๊ด๊ณ๋ ์๋์ ๊ฐ๋ค.
์ง๋ฌธ1 : ์ถ์ฒ์ธ1 (O)
์ง๋ฌธ1 : ์ถ์ฒ์ธ2 (O)
์ง๋ฌธ1 : ์ถ์ฒ์ธ3 (O)
์ง๋ฌธ2 : ์ถ์ฒ์ธ 1 (O) โก๏ธ ์ถ์ฒ์ธ 1 ์ด ์ง๋ฌธ1 ์ ์ถ์ฒ ํ๋๋ผ๋ ์ง๋ฌธ2 ๋ ์ถ์ฒ ํ ์ ์๋ค.
์ง๋ฌธ2 : ์ถ์ฒ์ธ 2 (O) โก๏ธ (์์ ๋์ผ)
1๏ธโฃ ๊ณผ๋ ๋ค๋ฅธ ์ํฉ์ด๋ผ๋ ๊ฒ์ ์ฝ๊ฒ ์ ์ ์๋ค. ์ง๋ฌธ ํ๋์ ์ฌ๋ฌ ์ ์ ๊ฐ ์ถ์ฒ์ ํ ์ ์์ง๋ง ๊ทธ๋ ๋ค๊ณ ๊ฐ ์ถ์ฒ์ธ์ด ํ๋์ ์ง๋ฌธ์ ์ข ์๋๋ ๊ฒ์ ์๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ @ManyToMany ๋ผ๊ณ ํ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฐ ๊ฒฝ์ฐ๋ ์ฐธ์กฐ๊ด๊ณ๊ฐ ์ด๋ป๊ฒ ํํ๋ ๊น?
์์ โ : 1๏ธโฃ ์์์ ์ํฉ์ ์๊ฐํ๋ค๋ฉด Question Entity ์ ์ถ์ฒํ ์ ์ ์ id ๋ฅผ ๋ฐฐ์ด์ ํํ๋ก ์ ์ฅํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ํ์ง๋ง DB ์ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ฒ์ ์ข์ง์์ ๋ฟ๋๋ฌ ์ถ์ฒ์ธ์ ์ ๋ณด๋ฅผ ํ์ธํ๋ ค๋ฉด ์ฌ๋ฌ๋ฒ์ ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ์ผํ๋ค.
์์ โก (์ ๋ตโ๏ธ) : ManyToMany ๊ด๊ณ์์๋ ๋ ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ ์ค๊ฐ ํ ์ด๋ธ์ด ํ์ฑ๋๋ค. ์ค์ ๋ก ์์ฑ๋ ํ ์ด๋ธ๋ค์ ๋ณด๋ฉด ์ค๊ฐ ํ ์ด๋ธ์ด ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.

ํ ์ด๋ธ์ ์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด๋ณด๋ฉด ๊ฐ๊ฐ์ ๋งคํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.

ํ ์ด๋ธ์ ๋ณด๋ฉด ์ฝ๊ฒ 1๋ฒ ์ง๋ฌธ์ 1๋ฒ ์ ์ ์ 2๋ฒ ์ ์ ๊ฐ ์ถ์ฒ์ ํ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ป๊ฒ ๋ณด๋ฉด @ManyToMany ๊ด๊ณ๋ ์ค๊ฐ ํ ์ด๋ธ์ ManyToOne ๊ด๊ณ์ ์กฐํฉ์ด๋ผ๊ณ ํ ์ ์๋ค.