๐ Today I Learned - ์ค๋ ๋ด๊ฐ ๊ณต๋ถํ ๊ฒ์ ์ ๋ฆฌํฉ๋๋ค.
๐ ์ค๋์ ๋ชฉํ
โ๏ธ ๊ณผ์
๐ซ ๊ฐ์ธ๋ชฉํ
๐ซ ๊ณผ์ ํธ๋ฌ๋ธ์ํ
[Spring] filter ์์ธ์ฒ๋ฆฌ
โ๏ธ JPA ์ฐ๊ด๊ด๊ณ ๊ตฌํ
์ผ๋์ผ(1:1) ๊ด๊ณ (@OneToOne)
- ๋๋ถ๋ถ ์ธ๋ ํค๋ฅผ ์ด๋ ํ
์ด๋ธ์ ๋ ๊ฒ์ธ์ง ๊ฒฐ์ ํด์ผ ํ๋ค.
- ๋ํ์ ์ธ ์: ์ฌ์ฉ์(User)์ ํ๋กํ(UserProfile) ๊ด๊ณ
- @OneToOne(mappedBy = "user")๊ณผ ๊ฐ์ด ์ค์ ํ์ฌ ์๋ฐฉํฅ ๋งคํ์ ํ ์๋ ์๋ค.
์ผ๋๋ค(1:N) / ๋ค๋์ผ(N:1) ๊ด๊ณ (@OneToMany, @ManyToOne)
- ๋ค๋์ผ(@ManyToOne) ๊ด๊ณ๋ ์ธ๋ ํค๊ฐ ์๋ ์ชฝ์์ ์ค์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
- ์ผ๋๋ค(@OneToMany)๋ฅผ ๋จ๋
์ผ๋ก ์ฌ์ฉํ๋ฉด ์ธ๋ ํค ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง๊ณ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
- ์ค๋ฌด์์๋ ๊ฐ๋ฅํ๋ฉด ๋ค๋์ผ(@ManyToOne)์ ์ฌ์ฉํ๊ณ , ํ์ํ ๋๋ง ์ผ๋๋ค(@OneToMany)๋ฅผ ์ถ๊ฐํ๋ค.
๋ค๋๋ค(N:M) ๊ด๊ณ (@ManyToMany)
- JPA์์๋ ๋ค๋๋ค ๊ด๊ณ๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
- ๋งคํ(์ค๊ฐ) ํ
์ด๋ธ์ ์์ฑํ์ฌ ์ผ๋๋ค-๋ค๋์ผ(N:M โ 1:N + N:1) ๊ด๊ณ๋ก ํ์ด๋ด๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
- ์๋ฅผ ๋ค์ด, Book๊ณผ Author๋ ์ง์ @ManyToMany๋ก ์ฐ๊ฒฐํ๋ ๋์ , BookAuthor๋ผ๋ ๋งคํ(์ค๊ฐ) ์ํฐํฐ๋ฅผ ์์ฑํ์ฌ ๊ด๊ณ๋ฅผ ๋งคํํ๋ค.
๐ก ์ธ๋ ํค ๊ด๋ฆฌ ์ฃผ์ฒด๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค
- ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ์ ์ธ๋ ํค๋ฅผ ๊ฐ์ง ํ
์ด๋ธ์ด ๋๋ค.
- mappedBy๋ฅผ ํ์ฉํ์ฌ ์ด๋ ์ชฝ์ด ์ฃผ์ธ(Owner)์ด๊ณ , ์ด๋ ์ชฝ์ด ์ฝ๊ธฐ ์ ์ฉ์ธ์ง ์ค์ ํ ์ ์๋ค.

@Getter
@Entity
@Table(name = "book_author")
public class BookAuthor extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "book_id")
private Book book;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id")
private Author author;
public BookAuthor() {
}
private BookAuthor(Book book, Author author) {
this.book = book;
this.author = author;
}
public static BookAuthor of(Book book, Author author) {
return new BookAuthor(book, author);
}
}
๐ฉ ๋ด์ผ ํ ์ผ
โ๏ธ ๊ณผ์
๐ญ ์ผ๊ธฐ
๊ณผ์ ๋ฅผ ๋ค ๋๋ผ ์ ์์์ง ์๊ฐ์ด ๋๋ฌด ๋น ๋ฏํ๋ค. ๐ซ ๋ด์ผ ์ซ๊ธฐ๋ฏ ํ๊ธฐ๋ณด๋ค ์ค๋ ๋ฐค์ ๋ฏธ๋ฆฌ ํ ๋น๋์ ์ฑ์๋์์ผ๊ฒ ๋ค.