[TIL] 2025-02-11(์ˆ˜์ •)

Yuriยท2025๋…„ 2์›” 11์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
46/59
post-thumbnail

๐Ÿ“• Today I Learned - ์˜ค๋Š˜ ๋‚ด๊ฐ€ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“† ์˜ค๋Š˜์˜ ๋ชฉํ‘œ

โœ๏ธ ๊ณผ์ œ

  • Lv5 ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ ์šฉํ•˜๊ธฐ
  • Lv6 ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”

๐Ÿ’ซ ๊ฐœ์ธ๋ชฉํ‘œ

  • 1์ผ 1 ์•Œ๊ณ ๋ฆฌ์ฆ˜

๐Ÿ”ซ ๊ณผ์ œ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

[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);
    }
}

๐Ÿšฉ ๋‚ด์ผ ํ•  ์ผ

โœ๏ธ ๊ณผ์ œ

  • Lv7 ๋Œ“๊ธ€ CRUD
  • Lv8 ์ผ์ • ํŽ˜์ด์ง• ์กฐํšŒ
  • โœš ๊ฐ„๋‹จํ•œ ๋„์„œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ตฌํ˜„

๐Ÿ’ญ ์ผ๊ธฐ

๊ณผ์ œ๋ฅผ ๋‹ค ๋๋‚ผ ์ˆ˜ ์žˆ์„์ง€ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋น ๋“ฏํ•˜๋‹ค. ๐Ÿซ  ๋‚ด์ผ ์ซ“๊ธฐ๋“ฏ ํ•˜๊ธฐ๋ณด๋‹ค ์˜ค๋Š˜ ๋ฐค์— ๋ฏธ๋ฆฌ ํ• ๋‹น๋Ÿ‰์„ ์ฑ„์›Œ๋†“์•„์•ผ๊ฒ ๋‹ค.

profile
์•ˆ๋…•ํ•˜์„ธ์š” :)

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