Home > Spring > πŸƒ[Spring] JPA의 μ–΄λ…Έν…Œμ΄μ…˜ - `@JoinColumn`

πŸƒ[Spring] JPA의 μ–΄λ…Έν…Œμ΄μ…˜ - `@JoinColumn`
Spring Framework

πŸƒ[Spring] JPA의 μ–΄λ…Έν…Œμ΄μ…˜ - @JoinColumn

  • @JoinColumn은 JPAμ—μ„œ 두 μ—”ν‹°ν‹° κ°„μ˜ 연관관계λ₯Ό λ§€ν•‘ν•  λ•Œ μ™Έλž˜ ν‚€(Foreign Key) μ»¬λŸΌμ„ μ„€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
  • @JoinColumn은 관계가 μ„€μ •λ˜λŠ” ν…Œμ΄λΈ”μ— μ™Έλž˜ ν‚€(Foreign Key)λ₯Ό μ •μ˜ν•˜κ³ , ν•΄λ‹Ή μ™Έλž˜ ν‚€(Foreign Key) 컬럼이 μ—°κ΄€λœ μ—”ν‹°ν‹°λ₯Ό μ°Έμ‘°ν•˜κ²Œ ν•©λ‹ˆλ‹€.

1️⃣ @JoinColumn의 μ£Όμš” 속성.

  • name
    • μ™Έλž˜ ν‚€(Foreign Key) 컬럼의 이름을 μ§€μ •ν•©λ‹ˆλ‹€.
      • μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 기본적으둜 μ°Έμ‘°ν•˜λŠ” μ—”ν‹°ν‹°μ˜ ν•„λ“œλͺ… λ˜λŠ” ν”„λ‘œνΌν‹°λͺ… + _id ν˜•μ‹μœΌλ‘œ 이름이 μ„€μ •λ©λ‹ˆλ‹€.
  • referencedColumnName
    • μ™Έλž˜ ν‚€(Foreign Key)κ°€ μ°Έμ‘°ν•  λŒ€μƒ μ—”ν‹°ν‹°μ˜ 컬럼λͺ…을 μ§€μ •ν•©λ‹ˆλ‹€.
      • 기본적으둜 μ°Έμ‘° μ—”ν‹°ν‹°μ˜ κΈ°λ³Έ ν‚€κ°€ μ‚¬μš©λ©λ‹ˆλ‹€.
  • nullable
    • μ™Έλž˜ ν‚€(Foreign Key) 컬럼이 NULL을 ν—ˆμš©ν• μ§€ μ—¬λΆ€λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
      • 기본값은 true이며, false둜 μ„€μ •ν•˜λ©΄ λ°˜λ“œμ‹œ 값이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • unique
    • μ™Έλž˜ ν‚€(Foreign Key) 컬럼이 μœ μΌν•œ 값인지 μ„€μ •ν•©λ‹ˆλ‹€.
      • 기본값은 falseμž…λ‹ˆλ‹€.
  • insertable, updatable
    • μ™Έλž˜ ν‚€(Foreign Key) 컬럼의 값이 μ‚½μž…/μ—…λ°μ΄νŠΈ κ°€λŠ₯ν•œμ§€ μ„€μ •ν•©λ‹ˆλ‹€.

2️⃣ @JoinColumn μ˜ˆμ‹œ.

  • νŒ€(Team)κ³Ό νšŒμ›(User)κ°„μ˜ λ‹€λŒ€μΌ(N:1) κ΄€κ³„μ—μ„œ User μ—”ν‹°ν‹°μ˜ team ν•„λ“œλ₯Ό 톡해 Team μ—”ν‹°ν‹°μ™€μ˜ 관계λ₯Ό μ„€μ •ν•˜λ©°, @JoinColumn을 μ‚¬μš©ν•΄ μ™Έλž˜ ν‚€(Foreign Key)λ₯Ό λ§€ν•‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    ```java
    @Entity
    public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = β€œteam_id”) // μ™Έλž˜ ν‚€ 컬럼 μ„€μ •
    private Team team;

    // getter, setter
    }

@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;

// getter, setter } ```

πŸ‘‰ μ„€λͺ….

  • User μ—”ν‹°ν‹°μ—μ„œ team ν•„λ“œλŠ” @ManyToOne 관계λ₯Ό 톡해 Team 엔티티와 μ—°κ²°λ©λ‹ˆλ‹€.
  • @JoinColumn(name = "team_id")λ₯Ό μ‚¬μš©ν•˜μ—¬ User ν…Œμ΄λΈ”μ— team_idλΌλŠ” μ™Έλž˜ ν‚€(Foreign Key) 컬럼이 μƒμ„±λ˜λ„λ‘ μ§€μ •ν–ˆμŠ΅λ‹ˆλ‹€.
    • 이 μ»¬λŸΌμ€ Team μ—”ν‹°ν‹°μ˜ κΈ°λ³Έ ν‚€ idλ₯Ό μ°Έμ‘°ν•˜κ²Œ λ©λ‹ˆλ‹€.

3️⃣ @JoinColumn을 μ‚¬μš©ν•œ μ–‘λ°©ν–₯ 관계 μ˜ˆμ‹œ.

  • @JoinColumn은 μ–‘λ°©ν–₯ κ΄€κ³„μ—μ„œλ„ 자주 μ‚¬μš©λ©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, User와 Team μ—”ν‹°ν‹°κ°€ μ„œλ‘œλ₯Ό μ°Έμ‘°ν•˜λŠ” μ–‘λ°©ν–₯ κ΄€κ³„λ‘œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      ```java
      @Entity
      public class User {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = β€œteam_id”)
    private Team team;
    }

@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;

@OneToMany(mappedBy = "team") // 연관관계 주인이 μ•„λ‹˜μ„ λͺ…μ‹œ
private List<User> users = new ArrayList<>();

// getter, setter } ```

πŸ‘‰ μ„€λͺ….

  • User μ—”ν‹°ν‹°λŠ” team_id μ»¬λŸΌμ„ 톡해 Team 엔티티와 μ—°κ²°λ˜λ©°, 이 μ™Έλž˜ ν‚€(Foreign Key)κ°€ κ΄€κ³„μ˜ 주인이 λ©λ‹ˆλ‹€.
  • Team μ—”ν‹°ν‹°λŠ” users ν•„λ“œλ₯Ό 톡해 User μ—”ν‹°ν‹°λ₯Ό μ°Έμ‘°ν•˜λ©°, mappedBy 속성을 톡해 연관관계 주인이 μ•„λ‹˜μ„ λͺ…μ‹œν–ˆμŠ΅λ‹ˆλ‹€.

4️⃣ μš”μ•½.

  • @JoinColumn은 두 μ—”ν‹°ν‹° κ°„μ˜ κ΄€κ³„μ—μ„œ μ™Έλž˜ ν‚€λ₯Ό μ„€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λ©°, μ™Έλž˜ ν‚€ 컬럼의 이름과 속성을 μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 단방ν–₯, μ–‘λ°©ν–₯ κ΄€κ³„μ—μ„œ λͺ¨λ‘ μ‚¬μš©λ˜λ©°, λͺ…ν™•ν•œ μ™Έλž˜ ν‚€ 섀정을 톡해 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” κ°„μ˜ 관계λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
  • name. nullable, unique λ“± λ‹€μ–‘ν•œ 속성을 μ„€μ •ν•΄ λ°μ΄ν„°λ² μ΄μŠ€ 컬럼의 μ œμ•½ 쑰건을 μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.