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

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

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

  • @Column은 JPA(Java Persistence API)μ—μ„œ μ‚¬μš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ, μ—”ν‹°ν‹°(Entity) 클래슀의 ν•„λ“œλ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ” 컬럼(Column, μ—΄)에 맀핑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • 즉, μžλ°” 클래슀의 ν•„λ“œμ™€ λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ˜ νŠΉμ • 컬럼(Column, μ—΄) κ°„μ˜ 맀핑을 μ •μ˜ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈμ—”ν‹°ν‹°(Entity)λŠ” λ¬΄μ—‡μΌκΉŒμš”?

1️⃣ μ£Όμš” νŠΉμ§•.

1️⃣ 컬럼(Column, μ—΄)κ³Ό ν•„λ“œ 맀핑.

  • @Column μ–΄λ…Έν…Œμ΄μ…˜μ€ μ—”ν‹°ν‹°(Entity) 클래슀의 ν•„λ“œκ°€ λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ˜ μ–΄λŠ 컬럼(Column, μ—΄)κ³Ό 맀핑될지λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.
  • λ§€ν•‘λ˜λŠ” 컬럼(Column)의 이름, 길이 nullable μ—¬λΆ€, 고유 μ œμ•½μ‘°κ±΄ 등을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μ˜΅μ…˜ μ„€μ •.

  • @Column을 μ‚¬μš©ν•˜μ—¬ 컬럼(Column)의 속성(길이, nullable μ—¬λΆ€ λ“±) μ„Έλ°€ν•˜κ²Œ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ§Œμ•½ @Column을 μƒλž΅ν•˜λ©΄ JPA(Java Persistence API)κ°€ μžλ™μœΌλ‘œ ν•„λ“œ 이름을 컬럼(Column, μ—΄) μ΄λ¦„μœΌλ‘œ μ‚¬μš©ν•˜κ³ , κΈ°λ³Έκ°’μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

2️⃣ μ£Όμš” 속성.

πŸ‘‰ name

  • 맀핑할 λ°μ΄ν„°λ² μ΄μŠ€ 컬럼(Column, μ—΄)의 이름을 λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.
    • μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄, ν•„λ“œ 이름이 κ·ΈλŒ€λ‘œ 컬럼(Column, μ—΄) μ΄λ¦„μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

πŸ‘‰ nullable

  • 컬럼(Column, μ—΄)이 NULL 값을 ν—ˆμš©ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
    • 기본값은 true둜, nullable = false둜 μ„€μ •ν•˜λ©΄ NOT NULL μ œμ•½μ‘°κ±΄μ΄ κ±Έλ¦½λ‹ˆλ‹€.

πŸ‘‰ unique

  • 컬럼(Column, μ—΄)에 고유 μ œμ•½μ‘°κ±΄μ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 기본값은 false이며, unique = true둜 μ„€μ •ν•˜λ©΄ ν•΄λ‹Ή 컬럼(Column, μ—΄)에 κ³ μœ ν•œ κ°’λ§Œ μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ‘‰ length

  • λ¬Έμžμ—΄ 컬럼(Column, μ—΄)의 μ΅œλŒ€ 길이λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
    • 기본값은 255μž…λ‹ˆλ‹€.
    • 주둜 VARCHAR νƒ€μž… 컬럼(Column, μ—΄)μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

πŸ‘‰ precision

  • μ†Œμˆ˜μ μ΄ ν¬ν•¨λœ 숫자(예: BigDecimal)의 정밀도λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
    • precision은 μ†Œμˆ˜μ  μ•žμ˜ 전체 자릿수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

πŸ‘‰ scale

  • μ†Œμˆ˜μ  μ΄ν•˜ 자릿수λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
    • scale은 μ†Œμˆ˜μ  μ΄ν•˜μ˜ 자릿수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

3️⃣ μ˜ˆμ‹œ.

1️⃣ 기본적인 μ‚¬μš©.

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Column;

@Entity
public class User {
    
    @Id
    private Long id;
    
    // 맀핑할 λ°μ΄ν„°λ² μ΄μŠ€ 컬럼의 이름을 "user_name"으둜 지정.
    // NOT NULL μ œμ•½ 쑰건을 걸음.
    // λ¬Έμžμ—΄ 컬럼의 μ΅œλŒ€ 길이λ₯Ό 100으둜 μ„€μ •.
    @Column(name = "user_name", nullable = false, length = 100) 
    private String name;
    
    // 고유 μ œμ•½μ‘°κ±΄μ„ μ„€μ •.
    // κ³ μœ ν•œ κ°’λ§Œ μ €μž₯될 수 있음.
    @Column(unique = true)
    private String email;
    
    // κΈ°λ³Έ μƒμ„±μž, getter, setter
    public User() {}
    
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getEmail() {
        return email;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
}
  • @Column(name = "user_name", nullable = false, length = 100)
    • 이 μ–΄λ…Έν…Œμ΄μ…˜μ€ name ν•„λ“œλ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ˜ user_name μ»¬λŸΌμ— λ§€ν•‘ν•©λ‹ˆλ‹€.
    • 이 μ»¬λŸΌμ€ NOT NULL μ œμ•½μ‘°κ±΄μ΄ 적용되며, μ΅œλŒ€ κΈΈμ΄λŠ” 100자둜 μ œν•œλ©λ‹ˆλ‹€.
  • @Column(unique = true)
    • 이 μ–΄λ…Έν…Œμ΄μ…˜μ€ email ν•„λ“œμ— 고유 μ œμ•½μ‘°κ±΄μ„ μ„€μ •ν•˜μ—¬, email 값이 μœ μΌν•˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€.

2️⃣ precisionκ³Ό scale μ‚¬μš© μ˜ˆμ‹œ(μ†Œμˆ˜μ  처리)

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.BigDecimal;

@Entity
public class Product {
    
    @Id
    private Long id;
    
    @Column(precision = 10, scale = 2)
    private BigDecimal price;
    
    // κΈ°λ³Έ μƒμ„±μž, getter, setter
    public Product() {}
    
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public BigDecimal getPrice()  {
        return price;
    }
    
    public void setPrice(BigDecimal price) {
        this.price = price;
    }
}
  • @Column(precision = 10, scale = 2)
    • price ν•„λ“œλŠ” μ†Œμˆ˜μ  μ΄ν•˜ 두 자리λ₯Ό ν¬ν•¨ν•˜λŠ” μ΅œλŒ€ 10자리의 숫자둜 μ €μž₯λ©λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄, 가격이 12345678.99와 같은 값을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ—¬κΈ°μ—μ„œ precision은 숫자의 전체 자릿수λ₯Ό, scale은 μ†Œμˆ˜μ  μ΄ν•˜ 자릿수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

4️⃣ @Column의 κΈ°λ³Έκ°’.

  • @Column μ–΄λ…Έν…Œμ΄μ…˜μ„ μƒλž΅ν•΄λ„ JPA(Java Persistence API)λŠ” μžλ™μœΌλ‘œ 이름을 컬럼(Column, μ—΄) μ΄λ¦„μœΌλ‘œ μ‚¬μš©ν•˜κ³ , κΈ°λ³Έ 속성을 μ μš©ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, μ•„λž˜ μ½”λ“œμ—μ„œ name ν•„λ“œλŠ” μžλ™μœΌλ‘œ nameμ΄λΌλŠ” 컬럼(Column, μ—΄)κ³Ό λ§€ν•‘λ©λ‹ˆλ‹€.
@Entity
public class User {
    
    @Id
    private Long id;
    
    private String name; // @Column을 μƒλž΅ν–ˆμ§€λ§Œ ν•„λ“œ 이름이 컬럼 μ΄λ¦„μœΌλ‘œ μ‚¬μš©λ¨
    
    // κΈ°λ³Έ μƒμ„±μž, getter, setter
}

5️⃣ μš”μ•½.

  • @Column μ–΄λ…Έν…Œμ΄μ…˜μ€ μ—”ν‹°ν‹° ν•„λ“œμ™€ λ°μ΄ν„°λ² μ΄μŠ€ 컬럼(Column, μ—΄) κ°„μ˜ 맀핑을 μ •μ˜ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
  • 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ 컬럼(Column, μ—΄)의 이름, nullable μ—¬λΆ€, 고유 μ œμ•½μ‘°κ±΄ 등을 μ„Έλ°€ν•˜κ²Œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν•„μˆ˜λŠ” μ•„λ‹ˆμ§€λ§Œ, λͺ…μ‹œμ μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€ 컬럼(Column, μ—΄)의 속성을 지정해야 ν•  경우 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 κ°œλ°œμžλŠ” λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” ꡬ쑰에 λ§žμΆ”μ–΄ μ—”ν‹°ν‹° 클래슀λ₯Ό μ„€κ³„ν•˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€ 컬럼(Column, μ—΄)과의 맀핑을 μ •ν™•ν•˜κ²Œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.