Home > Spring > πŸƒ[Spring] JPAλ₯Ό ν™œμš©ν•˜μ—¬ 객체지ν–₯적으둜 κ°œλ°œν•œλ‹€λŠ” 의미.

πŸƒ[Spring] JPAλ₯Ό ν™œμš©ν•˜μ—¬ 객체지ν–₯적으둜 κ°œλ°œν•œλ‹€λŠ” 의미.
Spring Framework

πŸƒ[Spring] JPAλ₯Ό ν™œμš©ν•˜μ—¬ 객체지ν–₯적으둜 κ°œλ°œν•œλ‹€λŠ” 의미.

  • JPA(Java Persistence API)λ₯Ό ν™œμš©ν•˜μ—¬ 객체지ν–₯적으둜 κ°œλ°œν•œλ‹€λŠ” μ˜λ―ΈλŠ”, λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”μ„ 직접 λ‹€λ£¨λŠ” λ°©μ‹μ—μ„œ λ²—μ–΄λ‚˜, 객체 μ§€ν–₯적인 κ°œλ…μ„ μ‚¬μš©ν•΄ 데이터와 관계λ₯Ό κ΄€λ¦¬ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.
  • JPAλ₯Ό ν™œμš©ν•˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€μ™€ 객체 λͺ¨λΈ κ°„μ˜ 간극을 쀄여 더 직관적이고 μœ μ—°ν•œ μ½”λ“œ μž‘μ„±μ΄ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ ν•˜λ©΄μ„œλ„ 객체지ν–₯ μ„€κ³„μ˜ 원칙을 λ”°λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ μ£Όμš” κ°œλ…κ³Ό νŠΉμ§•.

1️⃣ 엔티티와 관계 쀑심 섀계.

  • JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”μ„ μžλ°” 객체(μ—”ν‹°ν‹°)둜 λ§€ν•‘ν•˜λ©°, ν…Œμ΄λΈ” κ°„μ˜ 관계λ₯Ό 객체 κ°„μ˜ κ΄€κ³„λ‘œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, @OneToMany, @ManyToOne, @OneToOne λ“±μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 객체 κ°„μ˜ μ—°κ΄€ 관계λ₯Ό μ„€μ •ν•˜κ³ , 이λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ™Έλž˜ ν‚€, 쑰인 등을 톡해 ν‘œν˜„ν•©λ‹ˆλ‹€.

2️⃣ 객체지ν–₯적 CRUD μž‘μ—….

  • JPAλŠ” EntityManagerλ‚˜ CrudRepository와 같은 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 기본적인 CRUD μž‘μ—…(Create, Read, Update, Delete)을 λ©”μ„œλ“œλ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.
  • κ°œλ°œμžλŠ” SQL 쿼리λ₯Ό 직접 μž‘μ„±ν•˜λŠ” λŒ€μ‹  λ©”μ„œλ“œ ν˜ΈμΆœμ„ 톡해 데이터 μ‘°μž‘μ„ μˆ˜ν–‰ν•˜λ©°, μ΄λŠ” 객체λ₯Ό μ‘°μž‘ν•˜λŠ” 것과 μœ μ‚¬ν•©λ‹ˆλ‹€.

3️⃣ μΆ”μƒν™”λœ 데이터 μ—‘μ„ΈμŠ€ 계측.

  • JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€ 접근을 μΆ”μƒν™”ν•˜μ—¬ νŠΉμ • DBMS에 μ’…μ†λ˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 μ½”λ“œμ˜ μœ μ—°μ„±κ³Ό 이식성이 λ†’μ•„μ§€λ©°, λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ³€κ²½ν•΄μ•Ό ν•  κ²½μš°μ—λ„ μ΅œμ†Œν•œμ˜ μˆ˜μ •μœΌλ‘œ λŒ€μ²΄κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

4️⃣ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)

  • JPAλŠ” μ—”ν‹°ν‹°λ₯Ό μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ‘œ κ΄€λ¦¬ν•˜μ—¬ 1μ°¨ μΊμ‹œλ₯Ό ν™œμš©ν•œ μ΅œμ ν™”λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • λ™μΌν•œ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œλŠ” λ™μΌν•œ 객체λ₯Ό λ°˜ν™˜ν•˜μ—¬ 객체 일관성을 μœ μ§€ν•  수 있으며, μ—”ν‹°ν‹°κ°€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μžˆλŠ” λ™μ•ˆ μžλ™μœΌλ‘œ λ³€κ²½ 사항이 κ°μ§€λ˜κ³  λ°˜μ˜λ©λ‹ˆλ‹€.

5️⃣ 객체지ν–₯ 쿼리 μ–Έμ–΄(JPQL)

  • JPAλŠ” JPQL(Java Persistence Query Language)을 μ‚¬μš©ν•˜μ—¬ 객체지ν–₯적 쿼리 μž‘μ„±μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • JPQL은 SQLκ³Ό μœ μ‚¬ν•˜μ§€λ§Œ ν…Œμ΄λΈ”κ³Ό 컬럼이 μ•„λ‹Œ 엔티티와 ν•„λ“œλ₯Ό λŒ€μƒμœΌλ‘œ μž‘λ™ν•˜μ—¬, λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ•„λ‹Œ μžλ°” 객체λ₯Ό λ‹€λ£¨λŠ” λ°©μ‹μœΌλ‘œ 쿼리λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

6️⃣ μ§€μ—° λ‘œλ”©(Lazy Loading)

  • JPAλŠ” μ—°κ΄€λœ μ—”ν‹°ν‹°λ₯Ό ν•„μš”ν•œ μ‹œμ μ— λ‘œλ“œν•˜λŠ” μ§€μ—° λ‘œλ”©μ„ μ§€μ›ν•˜μ—¬ 객체 κ·Έλž˜ν”„λ₯Ό 효율적으둜 λ‘œλ“œν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • λΆˆν•„μš”ν•œ 쿼리 싀행을 쀄이고 μ„±λŠ₯을 μ΅œμ ν™”ν•  수 있으며, ν•„μš”ν•  λ•Œλ§Œ μ—°κ΄€λœ 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ JPA의 객체지ν–₯ 개발 μž₯점.

1️⃣ 높은 가독성.

  • μ½”λ“œκ°€ 객체 μ€‘μ‹¬μœΌλ‘œ κ΅¬μ„±λ˜λ―€λ‘œ 가독성이 λ†’μ•„μ Έ 도메인 λͺ¨λΈμ„ λͺ…ν™•ν•˜κ²Œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 집쀑.

  • SQL μž‘μ„±μ΄λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€ λ§€ν•‘ μ½”λ“œ μž‘μ„±μ— μ‹œκ°„μ„ 덜 듀이고, λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 집쀑할 수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ μž¬μ‚¬μš©μ„± 및 μœ μ§€λ³΄μˆ˜μ„± 증가.

  • 객체 μ§€ν–₯적인 계측 ꡬ쑰둜 κ΅¬μ„±ν•˜μ—¬ μž¬μ‚¬μš©μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.

4️⃣ μ˜ˆμ‹œ

  • JPAλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•„λž˜μ™€ 같은 ν…Œμ΄λΈ” 쀑심이 μ•„λ‹Œ 객체 μ€‘μ‹¬μ˜ 섀계λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ 기반 개발

-- λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” μ •μ˜
CREATE TABLE employee (
    employee_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    department_id BIGINT,
    FOREIGN KEY (department_id) REFERENCES department(department_id)
)

JPA 객체지ν–₯ 개발

@Enity
public class Employee {
    @Id
    @GeneratedValue(stratege = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
    
    // getters and setters
}
  • 객체지ν–₯적으둜 κ°œλ°œν•  경우, λ°μ΄ν„°λ² μ΄μŠ€ 쀑심이 μ•„λ‹Œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μ€‘μ‹¬μœΌλ‘œ μ½”λ“œλ₯Ό 섀계할 수 μžˆμ–΄, 도메인 λͺ¨λΈκ³Ό λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ λΆˆν•„μš”ν•œ λ§€ν•‘ λ³΅μž‘μ„±μ„ 쀄이고, μ½”λ“œκ°€ 더 직관적이고 ν™•μž₯ κ°€λŠ₯ν•˜κ²Œ λ©λ‹ˆλ‹€.