Home > CS > 2024 > πŸ’Ύ [CS] ORMμ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸ’Ύ [CS] ORMμ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?
CS

πŸ’Ύ [CS] ORMμ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • ORM(Object-Relational Mapping)은 객체-관계 맀핑을 μ˜λ―Έν•˜λ©°, 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄(예: Java, Python λ“±)μ—μ„œ μ‚¬μš©ν•˜λŠ” 객체와 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ” κ°„μ˜ 데이터λ₯Ό λ§€ν•‘ν•˜λŠ” κΈ°μˆ μ„ λ§ν•©λ‹ˆλ‹€.
  • ORM(Object-Relational Mapping)은 객체 지ν–₯ 방식과 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ˜ 데이터 ꡬ쑰가 μ„œλ‘œ λ‹€λ₯΄λ‹€λŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ μ†”λ£¨μ…˜μœΌλ‘œ, ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 세뢀적인 SQL 쿼리 없이 객체 λͺ¨λΈμ„ 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

1️⃣ ORM(Object-Relational Mapping)의 μ£Όμš” κΈ°λŠ₯.

1️⃣ 객체와 ν…Œμ΄λΈ” κ°„μ˜ 맀핑.

  • 객체 지ν–₯ μ–Έμ–΄μ—μ„œλŠ” 데이터가 객체둜 ν‘œν˜„λ˜κ³ , κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλŠ” 데이터가 ν…Œμ΄λΈ” ν˜•νƒœλ‘œ μ €μž₯λ©λ‹ˆλ‹€.
    • ORM(Object-Relational Mapping)은 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ 객체와 λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”μ„ μžλ™μœΌλ‘œ λ§€ν•‘ν•˜μ—¬, 객체λ₯Ό μ΄μš©ν•΄ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

2️⃣ SQL 좔상화.

  • ORM(Object-Relational Mapping)은 SQL 쿼리λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³ , ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό 쑰회, μ‚½μž…, μ‚­μ œ, μˆ˜μ •ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆκ²Œν•©λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 SQL 없이도 λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μ‰½κ²Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ SQLμ΄λž€?
πŸ™‹β€β™‚οΈ λ°μ΄ν„°λ² μ΄μŠ€λž€?

3️⃣ λ°μ΄ν„°λ² μ΄μŠ€ 독립성.

  • ORM(Object-Relational Mapping)은 νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€μ— μ’…μ†λ˜μ§€ μ•Šκ³ , λ‹€μ–‘ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ™μΌν•œ μ½”λ“œλ‘œ λ™μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ³€κ²½ν•˜λ”λΌλ„ ORM을 μ‚¬μš©ν•˜λ©΄ μ½”λ“œλ₯Ό 거의 μˆ˜μ •ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

4️⃣ 객체 λͺ¨λΈ μ€‘μ‹¬μ˜ 개발.

  • ORM을 μ‚¬μš©ν•˜λ©΄ 객체 λͺ¨λΈμ„ 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜κΈ° λ•Œλ¬Έμ—, λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ΄ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 방식과 일관성을 μœ μ§€ν•©λ‹ˆλ‹€.
    • μ΄λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 λ°μ΄ν„°λ² μ΄μŠ€ μƒν˜Έμž‘μš©μ„ μžμ—°μŠ€λŸ½κ²Œ ν†΅ν•©ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Business Logic)μ΄λž€?
πŸ™‹β€β™‚οΈ API 섀계, κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜, νŠΈλžœμž­μ…˜, μ—”ν‹°ν‹°(Entity), λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ˜ 차이점.

2️⃣ ORM의 λ™μž‘ 원리.

1️⃣ 객체와 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” 맀핑.

  • 객체의 속성은 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ˜ 컬럼(Column, μ—΄)에 λŒ€μ‘ν•˜κ³ , 객체의 μΈμŠ€ν„΄μŠ€λŠ” ν…Œμ΄λΈ”μ˜ 둜우(Row, ν–‰)에 λŒ€μ‘λ©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, 객체 λͺ¨λΈμ— User ν΄λž˜μŠ€κ°€ μžˆλ‹€λ©΄, λ°μ΄ν„°λ² μ΄μŠ€μ—λŠ” User ν…Œμ΄λΈ”μ΄ 있고, κ·Έ 속성 id, name, email 등은 ν…Œμ΄λΈ”μ˜ 컬럼(Column, μ—΄)κ³Ό λ§€ν•‘λ©λ‹ˆλ‹€.

2️⃣ SQL μžλ™ 생성.

  • ORM(Object-Relational Mapping) λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 객체λ₯Ό 기반으둜 SELECT, INSERT, UPDATE, DELETE와 같은 SQL 쿼리λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, User 객체λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄, ORM(Object-Relational Mapping)이 μžλ™μœΌλ‘œ INSERT SQL 쿼리λ₯Ό μƒμ„±ν•˜μ—¬ ν…Œμ΄λΈ”μ— ν•΄λ‹Ή 데이터λ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€.

3️⃣ λ°μ΄ν„°λ² μ΄μŠ€ 연동.

  • ORM(Object-Relational Mapping)은 객체 μƒνƒœλ₯Ό μΆ”μ ν•˜κ³ , λ³€κ²½ 사항이 μžˆμ„ 경우 이λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ™€ λ™κΈ°ν™”ν•©λ‹ˆλ‹€.
    • 객체의 속성값이 λ³€κ²½λ˜λ©΄, ORM(Object-Relationl Mapping)은 μžλ™μœΌλ‘œ UPDATE 쿼리λ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

3️⃣ ORM의 μž₯점.

1️⃣ 생산성 ν–₯상.

  • ORM(Object-Relational Mapping)을 μ‚¬μš©ν•˜λ©΄ SQL μž‘μ„±μ„ 쀄이고, 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ²˜λ¦¬ν•  수 있기 λ•Œλ¬Έμ—, κ°œλ°œμžλŠ” 더 적은 μ½”λ“œλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ΄λŠ” 개발 속도λ₯Ό 높이고 μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œν•©λ‹ˆλ‹€.

2️⃣ λ°μ΄ν„°λ² μ΄μŠ€ 독립성.

  • ORM(Object-Relational Mapping)은 νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€μ— μ˜μ‘΄ν•˜μ§€ μ•ŠμœΌλ©°, λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ³€κ²½ν•˜λ”λΌλ„ ORM(Object-Relational Mapping) 라이브러리만 λ§žμΆ”λ©΄ ν”„λ‘œκ·Έλž¨ μ½”λ“œλ₯Ό 거의 μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ λ‹€μ–‘ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ™μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ λ³΄μ•ˆμ„±

  • ORM(Object-Relational Mapping)은 μžλ™μœΌλ‘œ SQL 쿼리λ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— SQL μΈμ μ…˜ 곡격과 같은 λ³΄μ•ˆ 취약점을 λ°©μ§€ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.
    • 직접 SQL을 μž‘μ„±ν•  ν•„μš”κ°€ 쀄어듀기 λ•Œλ¬Έμ—, λ³΄μ•ˆμ„±μ΄ ν–₯μƒλ©λ‹ˆλ‹€.

4️⃣ μœ μ§€λ³΄μˆ˜μ„±.

  • 객체 지ν–₯ 섀계λ₯Ό μœ μ§€ν•˜λ©΄μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•  수 μžˆμ–΄, μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
    • λ°μ΄ν„°λ² μ΄μŠ€ κ΄€λ ¨ 변경이 ν•„μš”ν•  λ•Œλ„ 객체 λͺ¨λΈμ„ 톡해 μ‰½κ²Œ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4️⃣ ORM의 단점.

1️⃣ λ³΅μž‘ν•œ 쿼리 μž‘μ„±μ˜ ν•œκ³„.

  • ORM은 λ³΅μž‘ν•œ 쿼리 μ΅œμ ν™”λ‚˜ νŠΉμ •ν•œ SQL κΈ°λŠ₯을 μΆ©λΆ„νžˆ μ§€μ›ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 맀우 λ³΅μž‘ν•œ 쿼리가 ν•„μš”ν•œ 경우 ORM λŒ€μ‹  직접 SQL을 μž‘μ„±ν•΄μ•Ό ν•  λ•Œλ„ μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μ„±λŠ₯ 이슈.

  • μžλ™μœΌλ‘œ SQL 쿼리λ₯Ό μƒμ„±ν•˜λŠ” ORM은 직접 μƒμ„±ν•œ SQL에 λΉ„ν•΄ μ„±λŠ₯이 λ‹€μ†Œ λ–¨μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • λŒ€κ·œλͺ¨ νŠΈλž˜ν”½μ΄λ‚˜ 데이터 μ²˜λ¦¬κ°€ λ§Žμ€ ν™˜κ²½μ—μ„œλŠ” ORM(Object-Relational Mapping) μ‚¬μš©μ΄ λΉ„νš¨μœ¨μ μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ μΆ”μƒν™”λ‘œ μΈν•œ μ œμ–΄λ ₯ κ°μ†Œ.

  • ORM(Object-Relational Mapping)은 SQL을 μΆ”μƒν™”ν•˜κΈ° λ•Œλ¬Έμ—, λ°μ΄ν„°λ² μ΄μŠ€μ˜ 세뢀적인 μ œμ–΄κ°€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
    • SQL의 μ„ΈλΆ€ λ™μž‘μ„ 직접 κ΄€λ¦¬ν•˜κ³  싢을 λ•ŒλŠ” ORM(Object-Relational Mapping)보닀 직접 SQL μž‘μ„±μ΄ 더 λ‚˜μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ 좔상화(abstraction)
πŸ™‹β€β™‚οΈ DIP의 μ •μ˜μ—μ„œ λ§ν•˜λŠ” β€˜μΆ”μƒν™”λœ κ²ƒβ€™μ΄λž€ λ¬΄μ—‡μΌκΉŒ?
πŸ™‹β€β™‚οΈ DIP의 μ •μ˜μ—μ„œ λ§ν•˜λŠ” β€˜μΆ”μƒν™”λœ 것’과 β€˜μΆ”μƒν™”β€™μ˜ κ°œλ…μ˜ 차이점.

5️⃣ λŒ€ν‘œμ μΈ ORM 라이브러리.

Hibernate

  • Java와 JPA(Java Persistence API)λ₯Ό μ§€μ›ν•˜λŠ” κ°€μž₯ 널리 μ‚¬μš©λ˜λŠ” ORM ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.
    • HibernateλŠ” 객체와 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 맀핑을 μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜λ©°, λ‹€μ–‘ν•œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ JPAλž€ λ¬΄μ—‡μΈκ°€μš”?
πŸ™‹β€β™‚οΈ JPAλ₯Ό μ‚¬μš©ν•˜λŠ” 이유.

6️⃣ κ²°λ‘ .

  • ORM(Object-Relational Mapping)은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 객체와 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 맀핑을 κ΄€λ¦¬ν•˜λŠ” 기술둜, κ°œλ°œμžκ°€ 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 κ°œλ°œμžλŠ” SQL μž‘μ„±μ˜ λ²ˆκ±°λ‘œμ›€μ„ 쀄이고, 생성성, μœ μ§€λ³΄μˆ˜μ„±, λ³΄μ•ˆμ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.
      • κ·ΈλŸ¬λ‚˜ λ³΅μž‘ν•œ 쿼리 μ²˜λ¦¬λ‚˜ μ„±λŠ₯ λ¬Έμ œμ— μžˆμ–΄μ„œλŠ” SQL을 μž₯μ„±ν•˜λŠ” 것이 더 λ‚˜μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • ORM(Object-Relation Mapping)을 적절히 ν™œμš©ν•˜λ©΄ μ½”λ“œμ˜ 가독성과 νš¨μœ¨μ„±μ„ 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.