Spring Data JPA μν°ν° κ° μ°κ΄κ΄κ³ λ§€ν λ°©λ² μ 리 with μμ
λ€μ΄κ°λ©΄μ
κ°μΈμ μΌλ‘ 곡λΆν λ΄μ©κ³Ό μκ°ν λ΄μ©μ λ΄μ μμ±ν ν¬μ€ν
μ
λλ€.
νλ¦° λ΄μ©μ΄ μλ€λ©΄ λκΈλ‘ 곡μ ν΄μ£ΌμΈμ!
β κ°λ 체ν¬
- λ°μ΄ν°λ² μ΄μ€μμλ μΈλ ν€λ‘ μ°κ΄ κ΄κ³λ₯Ό λνλ΄κ³ , κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμλ κ°μ²΄ κ°μ μ°Έμ‘°λ‘ λνλΈλ€.
- JPAλ₯Ό νμ©νλ€λ κ²μ RDB μΈλ ν€λ₯Ό κ°μ²΄ κ° μ°κ΄κ΄κ³λ‘ λ§€ννλ€λ κ².
- μν°ν°: λ°μ΄ν°λ² μ΄μ€μ ν
μ΄λΈκ³Ό 1:1λ‘ λμλλ κ°λ
μ΄λ€.
- ν μΈμ€ν΄μ€λ DB ν μ΄λΈμ ν rowμ ν΄λΉνλ€.
- JPAμμλ μμμ± μ»¨ν μ€νΈμ μν΄ κ΄λ¦¬λλ€.
- μν°ν° ν΄λμ€μλ λ°λμ PK μλ³μκ° μλ€. (@Id μ΄λ Έν μ΄μ μΌλ‘ μ μνλ€.)
- κΈ°λ³Έ μμ±μλ₯Ό νμλ‘ κ°μ ΈμΌ νλ€. (@NoArgsConstructor μ΄λ Έν μ΄μ μ μ¬μ©νλ€.)
- μν°ν°μ νλλ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ 컬λΌκ³Ό λμλλ€.
- μλ°©ν₯: λ κ°μ²΄κ° μλ‘ μ°Έμ‘°μ© νλλ₯Ό κ°μ§κ³ μλ€.
- A β B, B β A λ λ€ μ°Έμ‘° κ°λ₯
- λ¨λ°©ν₯: λ κ°μ²΄ μ¬μ΄μ νλμ κ°μ²΄λ§ μ°Έμ‘°μ© νλλ₯Ό κ°κ³ μ°Έμ‘°νλ€.
- A β Bλ κ°λ₯νμ§λ§, B β Aλ λΆκ°λ₯
- DB ꡬ쑰μ λ¨λ°©ν₯μ΄λ©΄ λ°λμ JPA Entityλ λ¨λ°©ν₯μΌλ‘ ꡬννλκ°?
- No
- DB ν μ΄λΈμμλ ν μ΄λΈ μ¬μ΄μ μ°κ΄κ΄κ³λ₯Ό FKλ‘ λ§Ίμ μ μκ³ λ°©ν₯ μκ΄μμ΄ μ‘°νκ° κ°λ₯νλ€.
- JPAμμλ μλ μν°ν°λ₯Ό μ°Έμ‘°νκ³ μμ΄μΌλ§ μλ μν°ν°λ₯Ό μ‘°νν μ μλ€. "λΉμ¦λμ€ λ‘μ§μ λ°λ λ°©ν₯μ μ‘°νλ νμν λ"μ°κ΄λ λ°μ΄ν°λ₯Ό λ μ½κ² μ‘°νν μ μλλ‘ νκΈ° μν΄ μλ°©ν₯μΌλ‘ μ€μ ν μ μλ€.
- μ°κ΄κ΄κ³μ μ£ΌμΈ: λ κ°μ²΄μ κ΄κ³ μ€ μ μ΄μ κΆν(λ°μ΄ν° μ‘°ν, μ μ₯, μμ , μμ )μ κ°μ§λ κ°μ²΄
- FKλ₯Ό κ΄λ¦¬νλ(FKλ₯Ό νλλ‘ κ°μ§κ³ μλ) μν°ν°λ₯Ό μ°κ΄κ΄κ³μ μ£ΌμΈμΌλ‘ λ³Έλ€.
π― 1:1 κ΄κ³(One-to-One)
ν κ°μ μν°ν°κ° λ€λ₯Έ νλμ μν°ν°μ λ¨ νλμ κ΄κ²λ₯Ό κ°μ§λ κ²½μ°μ΄λ€.
μ¦, μν°ν° Aμ μΈμ€ν΄μ€ νλλ μν°ν° Bμ μΈμ€ν΄μ€ νλμ λμλλ€.
λ¨λ°©ν₯μΈ κ²½μ°μ μλ°©ν₯μΈ κ²½μ°λ₯Ό λλμ΄ μκ°ν΄λ³΄κ² λ€.
λ¨λ°©ν₯
DBμμ λͺ¨λ μ¬μ©μλ users ν μ΄λΈμ, μλΉμ€μ λ±λ‘λ λͺ¨λ μ¬μ§μ photos ν μ΄λΈμ μ μ₯λμ΄ μλ€κ³ νμ. photos ν μ΄λΈμλ μ¬μ©μμ νλ‘ν μ΄λ―Έμ§λ ν¬ν¨λμ΄ μλ€.
μ¬μ©μ(User) 1λͺ
μ 1κ°μ νλ‘ν μ΄λ―Έμ§(Photo)μ κ°μ§ μ μλ€.
1κ°μ νλ‘ν μ΄λ―Έμ§λ μ¬μ©μ 1λͺ
μκ² μνλ€.
λ¨λ°©ν₯μΈ μ΄μ
μΌλ°μ μΈ μλΉμ€μμ νλ‘ν μ¬μ§μ μ¬μ©μ μ 보λ₯Ό λΆλ¬μ¬ λλ§ κ°μ Έμ¨λ€.
νλ‘ν μ¬μ§μ΄ λ°λ‘ λ
립μ μΌλ‘ νμν κ²½μ°, νλ‘ν μ¬μ§μ΄ μ¬μ©μ μ 보κΉμ§ κ°μ ΈμμΌ νλ κ²½μ°λ μλ€.
Userλ μμ μ΄ κ°μ§ Photoλ₯Ό μμμΌ νμ§λ§
Photoλ μμ μ κ°μ§ Userλ₯Ό λͺ°λΌλ λλ€.
μ΄λ¬ν μ΄μ λ‘ User -> Photo λ¨λ°©ν₯μΌλ‘ μ€μ νλ€.
JPAμμ λ¨λ°©ν₯, μλ°©ν₯μ μ ν λλ "κ°μ²΄κ° μλ‘λ₯Ό μμμΌ νλκ°?"λ₯Ό μκ°ν΄λ³΄λ©΄ λλ€.
μ΄λ ν μ΄λΈμ΄ FKλ₯Ό κ°μ ΈμΌ ν κΉ?
μΌλ°μ μΌλ‘ FKμ μ£ΌμΈμ 1:NμΈ κ΄κ³μμλ NμΈ μͺ½μ μνμ§λ§,
1:1μΈ κ΄κ³μμλ μ΄λ μͺ½μ΄ FKλ₯Ό κ΄λ¦¬ν μ§,
μ¦ μ΄λ μν°ν°κ° μ°κ΄ κ΄κ³μ μ£ΌμΈμ΄ λ μ§ μ ν΄μΌ νλ€.
λ€μν μ΄μ κ° μκ² μ§λ§
λ€μκ³Ό κ°μ μ΄μ λ‘ μ νλ€.
1. μλ―Έμ κ΄κ³: λκ° μ΄ κ΄κ³λ₯Ό κ΄λ¦¬ν μ μλ?
κ°μ₯ λ¨Όμ λ μ€λ₯΄λ μ΄μ λ€.
Userμ Photoμ μλ―Έλ μ¬μ©μμ μ¬μ©μμ νλ‘ν μ΄λ―Έμ§μ΄λ€.
μ¬μ©μκ° μ¬μ©μμ νλ‘ν μ΄λ―Έμ§μ ν¬ν¨λκΈ° 보λ€λ, νλ‘ν μ΄λ―Έμ§κ° μ¬μ©μ μ 보μ ν¬ν¨λλ μͺ½μ΄ μ³λ€.
μ¬μ§μ΄ "μμλ μ¬μ©μ"λ₯Ό λ±λ‘νκ³ κ΄λ¦¬νλ κ²λ³΄λ€
μ¬μ©μκ° νλ‘ν μ¬μ§μ μ€μ νκ±°λ λ³κ²½νλ κ°λ
μ΄ μμ°μ€λ½λ€.
Userκ° Photo κ°μ²΄λ₯Ό μμ νκ³ , Photo κ°μ²΄λ νΉμ User κ°μ²΄μ μ’
μλλ€.

π‘ μ£Όμ²΄κ° λλ μν°ν°(μμ μ)κ° μν°ν°λ₯Ό κ΄λ¦¬νλ κ² μΌλ°μ -> μμ μκ° FKλ₯Ό κ°μ§λ€.
μ΄ κ²½μ°μλ Userκ° Photoμ id 컬λΌκ³Ό λ§€νλλ photo_idλ₯Ό κ°μ§λ κ² λ§λ€.
2. μ‘°ν μ±λ₯ κ³ λ €
λλΆλΆμ κ²½μ° User μ 보λ₯Ό κ°μ Έμ¬ λ νλ‘ν μ¬μ§μ ν¨κ» μ‘°νν κ²μ΄λ€.
μ΄ μν©μ΄ νλ‘ν μ¬μ§μ μ‘°νν λ μ μ μ 보λ₯Ό κ°μ Έμ€λ κ°λ
λ³΄λ€ μ΅μνλ€.
μ΄λ Userμ FKκ° μλ€λ©΄ μ¦μ Photoμ joinν΄μ User μ 보μ νΉμ Photoλ₯Ό μ‘°ννκΈ° νΈνλ€.
λ§μ½ Photoμ FKλ₯Ό λλ€λ©΄, λ¨Όμ User μ 보λ₯Ό κ°μ Έμ¨ ν user_idλ₯Ό κ°μ§ Photoλ₯Ό ν
μ΄λΈ μ 체μμ μ‘°νν΄μΌ νλ€.
π μ£Όμ ν€μλ
- @OneToOne: 1:1 κ΄κ³λ₯Ό λͺ μνλ μ΄λ Έν μ΄μ μ΄λ€.
- @JoinColumn: μ°κ΄ κ΄κ³μ μ£ΌμΈμ΄ FKλ₯Ό λͺ
μμ μΌλ‘ μ§μ νλ μ΄λ
Έν
μ΄μ
μ΄λ€.
- @JoinColumn(name = food_id) μ΄λ° μμΌλ‘ 컬λΌλͺ μ μνλλλ‘ μ§μ νκ³ μΆμ λ μ¬μ©νλ€.
- FKλ₯Ό κ°μ§λ κ°μ²΄μμλ§ μ¬μ©νλ€.
μ½λ
User Entity
@Entity
@Table(name="users")
@NoargsConstructor // Entityλ₯Ό λ§λ€κΈ° μν΄μλ κΈ°λ³Έ μμ±μκ° νμμ μ
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name = "photo_id")
private Photo photo;
...
}
Photo Entity
@Entity
@Table(name="photos")
@NoargsConstructor
public class Photo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String fileName;
private String contentType;
private Long size;
...
}
μλ°©ν₯
κ·Έλ λ€λ©΄ μν°ν°κ° μλ‘ 1:1λ‘ λμνκ³ , μλ‘μ μ‘΄μ¬λ₯Ό μμμΌ νλ μμλ 무μμ΄ μμκΉ?
μλΉμμ 1λͺ μ κ³ κ°μ 1κ°μ μμλ§ μ£Όλ¬Έν μ μλ€κ³ ν΄λ³΄μ.
κ³ κ°μ λμ€μ κ²°μ νλ €λ©΄ μμ μ΄ μ£Όλ¬Έν μμμ μμμΌ νλ€.
μμλ μ¨μ΄ν°κ° μλΉνλ €λ©΄ μμ μ μ£Όλ¬Έν κ³ κ°μ μμμΌ νλ€.
λ°λΌμ κ³ κ° - μμμ μλ‘ κ°μ²΄λ₯Ό μκ³ μμ΄μΌ νλ κ΄κ³μ΄λ―λ‘ μλ°©ν₯μ΄λ€.
μ΄λλ μλ‘μ μν°ν°λ₯Ό μ°Έμ‘°νκ³ μμ΄μΌ νλ€.
κ³ κ°μ Customer, μμμ FoodλΌκ³ νμ.

μ°Έκ³ λ‘ DBμμλ λ¨λ°©ν₯ κ΄κ³λ‘ μ€κ³κ° κ°λ₯νμ§λ§
μ‘°ν(μμ μλΉ) κΈ°λ₯μ νΈνκ² νκΈ° μν΄ JPAμμ μλ°©ν₯ κ΄κ³λ‘ μ€μ νλ κ²μ΄λ€.
μ΄ κ΄κ³μ μ£ΌμΈμ λꡬμΌκΉ?
μλ―Έμ μΌλ‘ λ΄€μ λ, κ³ κ°μ΄ νΉμ μμμ μ£Όλ¬Ένκ±°λ μ ννλ "κ΄λ¦¬ 주체"μ΄λ―λ‘ Customerκ° μ£ΌμΈμ΄λ€. Customer ν΄λμ€κ° FKλ₯Ό κ°μ ΈμΌ νλ€.
π μ£Όμ ν€μλ
- mappedBy: μλ°©ν₯ κ΄κ³μμ μ΄ μΈλ ν€λ₯Ό κ΄λ¦¬νλ μν°ν°(μ£ΌμΈ)κ° λꡬμΈμ§ μ§μ ν λ μ¬μ©νλ μ΅μ
μ΄λ€.
- μ£ΌμΈμ΄ μλ μͺ½μμ μ€μ νλ€.
- μ°κ΄ κ΄κ³λ₯Ό κ΄λ¦¬νλ νλ μ΄λ¦μ μ§μ ν΄μΌ νλ€.
- DB ν μ΄λΈ λ΄ FK μ»¬λΌ μ΄λ¦μ΄ μλλΌ μ£ΌμΈ μν°ν° ν΄λμ€μ μ°Έμ‘° νλ μ΄λ¦μ΄λ€!
μ½λ
Customer Entity
@Entity
@Table(name="customers")
@NoargsConstructor
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int seatIndex;
...
// κ³ κ°μ΄ μν€λ 1κ°μ λ©λ΄
@OneToOne
@JoinColumn(name="food_id")
private Food food;
}
Food Entity
μ£ΌμΈμΈ Customerμμ Foodλ₯Ό μ°Έμ‘°νλ νλλ foodμ΄λ€.
λ°λΌμ Food μν°ν°μμ mappedBy μ΅μ
μΌλ‘ Customerμμ food νλκ° μ°κ΄κ΄κ³μ μ£ΌμΈμμ λͺ
μνλ€.
@Entity
@Table(name="food")
@NoargsConstructor
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int price;
...
// κ³ κ°μ΄ μν€λ 1κ°μ λ©λ΄
@OneToOne(mappedBy = "food")
private Customer customer;
}
π― 1:N/N:1 κ΄κ³(One-to-Many/Many-to-One)
μν°ν° Aμ 1κ°μ μΈμ€ν΄μ€κ° μν°ν° Bμ Nκ°μ μΈμ€ν΄μ€μ λμν λ Aμ Bμ κ΄κ³λ₯Ό 1:Nμ΄λΌκ³ νλ€.
1λͺ
μ μ¬μ©μκ° μ¬λ¬ κ°μ κ²μκΈμ μμ±ν μ μλ€.
μ¬μ©μλ₯Ό User, κ²μκΈμ PostλΌκ³ ν΄λ³΄μ.

DB μμμμ ꡬ쑰λ μμ κ°λ€.
Postμμ FKλ₯Ό κ°μ§λ―λ‘ μ°κ΄κ΄κ³μ μ£ΌμΈμ Postμ΄λ€.
λ¨λ°©ν₯
Postλ μμ μ μμ±ν User μ 보λ₯Ό μμμΌ νμ§λ§
Userλ μμ μ΄ μμ±ν Post μ λ³΄κ° νμμ μΈ κ±΄ μλ λλ λ¨λ°©ν₯μΌλ‘ κ°λ₯νλ€.
π μ£Όμ ν€μλ
- @ManyToOne: N:1 κ΄κ³λ₯Ό λνλΈλ€.
- μ¬λ¬ κ°μ Postκ° νλμ Userλ₯Ό κ°λ¦¬ν€λ μν©μ΄λ€.
- FKλ Nμͺ½μμ κ΄λ¦¬, μ¦ Postκ° μ£ΌμΈμ΄λ€.
- Manyμ ν΄λΉνλ Postμμ μ¬μ©νλ€.
μ½λ
User Entity
@Entity
@Table(name="users")
@NoargsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
...
}
Post Entity
@Entity
@Table(name="posts")
@NoargsConstructor
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
...
@ManyToOne
@JoinColumn(name="author_id")
private User user;
}
μλ°©ν₯
λ§μ½ Postκ° μμ±μ Userλ₯Ό μκ³ μμ΄μΌ νκ³ ,
Userλ μμ μ΄ μ΄ Postλ₯Ό μμμΌ ν λλ μλ°©ν₯ κ΄κ³λ‘ μ€κ³νλ€.
μΌλ°μ μΈ μλΉμ€μμλ μ΄ κ²½μ°κ° λ§μ§ μμκΉ?
π μ£Όμ ν€μλ
- @OneToMany: 1:N κ΄κ³λ₯Ό λνλ΄λ μ΄λ
Έν
μ΄μ
μ΄λ€.
- 1κ°μ μν°ν°κ° μ¬λ¬ κ°μ μν°ν°λ₯Ό κ°μ§λ€λ μλ―Έμ΄λ€.
- ν λͺ μ Userλ μ¬λ¬ κ°μ Postλ₯Ό κ°μ§ μ μλ€.
- 1μͺ½μ μνλ μν°ν°μμ μ¬μ©νλ€.
- λ°λμ mappedBy μ΅μ μΌλ‘ μ£ΌμΈ(@ManyToOneμ κ°μ§ μν°ν°)μ λͺ μν΄μΌ νλ€.
μ½λ
User Entity
1:NμΈ κ΄κ³λ NμΈ κ°μ²΄λ₯Ό List, λ°°μ΄ κ°μ κ°μΌλ‘ μ μ₯νλ€.
@Entity
@Table(name="users")
@NoargsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
...
@OneToMany(mappedBy="author")
List<Post> posts;
}
Post Entity
@Entity
@Table(name="posts")
@NoargsConstructor
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
...
@ManyToOne
@JoinColumn(name="author_id")
private User author;
}
π― N:M κ΄κ³(Many-to-Many)
μν°ν° Aμ Nκ°μ μΈμ€ν΄μ€κ° μν°ν° Bμ Mκ°μ μΈμ€ν΄μ€μ λμν λ Aμ Bμ κ΄κ³λ₯Ό N:Mμ΄λΌκ³ νλ€.
κ°μ₯ λ§μ΄ λλ μμλ λνκ΅μμ "νμκ³Ό κ°μ"μ κ΄κ³μ΄λ€.
ν λͺ
μ νμμ μ¬λ¬ κ°μ μμ
μ μκ°ν μ μλ€. β N:1 κ΄κ³ (Student β Course)
ν κ°μ μμ
μλ μ¬λ¬ λͺ
μ νμμ΄ λ±λ‘λ μ μλ€. β 1:N κ΄κ³ (Course β Student)
λ°λΌμ, N:M κ΄κ³λ₯Ό νμ±νλ€.
μ΄λλ λ κ°μ²΄ κ°μ μ°κ²° ν
μ΄λΈμ΄ λ°λ‘ νμνλ€.
N:M κ΄κ³λ μ§μ ννν μ μκΈ° λλ¬Έμ΄λ€.
μ΄ ν
μ΄λΈμ μ€μ λ‘ μ μλ―Έν κ°μ²΄λ₯Ό μ μ₯νλ ν
μ΄λΈμ΄ μλλΌ
νμκ³Ό κ°μμ κ΄κ³λ§μ μ μ₯νλ μν μ νλ€.

μ΄λ μ°κ΄ κ΄κ³μ μ£ΌμΈμ λͺ
νν λ§νκΈ°λ μ‘°κΈ μ΄λ ΅λ€.
students, courses ν
μ΄λΈ λͺ¨λ μλ‘λ₯Ό FKλ‘ κ°κ³ μμ§ μκΈ° λλ¬Έμ΄λ€.
κ·Έλ₯ λ μ€ νΈν κ²μ μ£ΌμΈμΌλ‘ νλ€.
νμ κΈ°μ ν @JoinTableμ μ΄ μͺ½μ μ£ΌμΈμ΄λΌκ³ λ³Έλ€.
μ€λ¬΄μμλ λ€λλ€ κ΄κ³λ₯Ό μ§μνλ―λ‘ μ΄ μ λλ§ ν΄λ μΆ©λΆν λ― νλ€.
μ°Έκ³ : μΈνλ° QnA
π μ£Όμ ν€μλ
- @ManyToMany: μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ JPAκ° μλμΌλ‘ μ°κ²° ν
μ΄λΈμ μμ±ν΄μ€λ€.
- μμͺ½ μν°ν° λͺ¨λμ μ¬μ©νλ€.
- @JoinTable: λͺ
μμ μΌλ‘ μ°κ²° ν
μ΄λΈμ μ€μ νκ³ μΆμ λ μ¬μ©νλ€.
- μ£ΌμΈ μν°ν°, ν μν°ν°μμλ§ λͺ μνλ©΄ λλ€.
- name: μ°κ²° ν μ΄λΈ μ΄λ¦
- joinColumns: νμ¬ μν°ν°μμ μλ κ° μ€ μ°κ²° ν
μ΄λΈμμ FKλ‘ μΈ μ»¬λΌλͺ
λ€
- Student μν°ν°μμ μ°κ²° ν μ΄λΈμ λ§λ λ€λ©΄ Studentμ id νλλ₯Ό μ°κ²° ν μ΄λΈμ FKλ‘ μ΄λ€.
- inverseJoinColumns: λ°λ μν°ν°μμ μλ κ° μ€ μ°κ²° ν
μ΄λΈμμ FKλ‘ μΈ μ»¬λΌλͺ
λ€
- Student μν°ν°μμ μ°κ²° ν μ΄λΈμ λ§λ λ€λ©΄ Courseμ id νλλ₯Ό μ°κ²° ν μ΄λΈμ FKλ‘ μ΄λ€.
- mappedBy: @JoinTableμ μ°μ§ μμ λ€λ₯Έ ν μͺ½μμλ mappedBy μ΅μ
μ μ¬μ©νμ¬ μ°κ΄ κ΄κ³μ μ£ΌμΈ/λΉμ£ΌμΈμ ꡬλΆνλ€.
- Studentκ° μ£ΌμΈ, Courseκ° λΉμ£ΌμΈμ΄λ―λ‘ Courseμμ μ¬μ©νλ€.
μ½λ
Student Entity
@Entity
@Table(name="students")
@NoargsConstructor
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String department;
private String email;
...
@ManyToMany // N:M κ΄κ³ λͺ
μ
// μ°κ²° ν
μ΄λΈ μ§μ
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses;
}
Course Entity
@Entity
@Table(name="courses")
@NoargsConstructor
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String department;
private String semester;
private String professor;
...
@ManyToMany(mappedBy="courses") // N:M κ΄κ³ λͺ
μ
private List<Student> students;
}
μ°Έκ³ μλ£
[JPA] μ°κ΄κ΄κ³ λ§€ν μ£ΌμΈμ λν΄μ (mappedBy)
TIL-15 JPA Entity μ°κ΄κ΄κ³ 1λ1 κ΄κ³
+κΈ°ν μμ μλ£