Search
Duplicate

ORM

ORM(Object-Relational Mapping)

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(RDB)λ₯Ό μ‚¬μš©ν•  λ•Œ 객체(Object)와 λ°μ΄ν„°λ² μ΄μŠ€μ˜ 관계(Relation)λ₯Ό λ§€ν•‘ν•˜λŠ” 기술
객체와 ν…Œμ΄λΈ”μ„ 1:1둜 λ§€ν•‘ν•˜μ—¬ SQL을 직접 μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‘°μž‘ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” κΈ°μˆ μž…λ‹ˆλ‹€.
β€’
Persistence Framework
β—¦
ORM
β—¦
SQL Mapper
β€’
ORM vs SQL Mapper

Persistence Framework

β€’
ORM
β€’
SQL Mapper

Persistence Framework

데이터λ₯Ό 영ꡬ적으둜 μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬λ‘œ, ORM(JPA, Hibernate)κ³Ό SQL Mapper(MyBatis) 등이 ν¬ν•¨λ˜λ©°, SQL μž‘μ„± 방식과 객체 λ§€ν•‘ 방식에 따라 κ΅¬λΆ„λ©λ‹ˆλ‹€.

ORM (Object-Relational Mapping)

ORMμ΄λž€?

객체와 λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”μ„ μžλ™μœΌλ‘œ λ§€ν•‘ν•˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€. κ°œλ°œμžκ°€ SQL을 직접 μž‘μ„±ν•˜μ§€ μ•Šκ³ , 객체λ₯Ό μ‘°μž‘ν•˜λ©΄ ORM이 μžλ™μœΌλ‘œ SQL을 μƒμ„±ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ™€ ν†΅μ‹ ν•©λ‹ˆλ‹€.

ORM νŠΉμ§• (ν‘œ)

ꡬ뢄
μ„€λͺ…
객체(Entity)와 ν…Œμ΄λΈ”(Table)의 μžλ™ λ§€ν•‘
객체와 ν…Œμ΄λΈ”μ„ 1:1 λ˜λŠ” N:1 λ“±μ˜ κ΄€κ³„λ‘œ λ§€ν•‘
SQL을 직접 μž‘μ„±ν•  ν•„μš” μ—†μŒ
객체의 CRUD(Create, Read, Update, Delete) μž‘μ—…μ΄ λ©”μ„œλ“œ 호좜만으둜 κ°€λŠ₯
νŠΈλžœμž­μ…˜ 관리 μžλ™ν™”
ORM이 νŠΈλžœμž­μ…˜μ„ μžλ™μœΌλ‘œ 관리
μ§€μ—° λ‘œλ”©(Lazy Loading), μ¦‰μ‹œ λ‘œλ”©(Eager Loading)
μ—°κ΄€λœ 데이터λ₯Ό μ–Έμ œ λΆˆλŸ¬μ˜¬μ§€ μ„€μ • κ°€λŠ₯

ORM의 μž₯단점 (ν‘œ)

μž₯점
μ„€λͺ…
생산성 증가
SQL을 직접 μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ 객체 μ‘°μž‘λ§ŒμœΌλ‘œ 데이터 μ²˜λ¦¬κ°€ κ°€λŠ₯
μœ μ§€λ³΄μˆ˜ 용이
λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 SQL이 λΆ„λ¦¬λ˜μ–΄ μ½”λ“œ 가독성이 λ†’μŒ
λ°μ΄ν„°λ² μ΄μŠ€ 독립성
ORM ν”„λ ˆμž„μ›Œν¬κ°€ SQL을 μƒμ„±ν•˜λ―€λ‘œ DBMS 변경이 용이
객체지ν–₯적인 개발 κ°€λŠ₯
μ—”ν‹°ν‹° 클래슀λ₯Ό ν™œμš©ν•˜μ—¬ 객체 μ§€ν–₯적인 섀계 κ°€λŠ₯
단점
μ„€λͺ…
μ„±λŠ₯ μ΅œμ ν™” 어렀움
μžλ™ μƒμ„±λœ SQL이 λΉ„νš¨μœ¨μ μΌ 수 있음
λ³΅μž‘ν•œ 쿼리 μž‘μ„± 어렀움
닀쀑 JOINμ΄λ‚˜ νŠΉμ • DBMS κΈ°λŠ₯을 ν™œμš©ν•˜λ €λ©΄ Native Query ν•„μš”
ν•™μŠ΅ 곑선이 λ†’μŒ
JPA/Hibernate의 κ°œλ…(μ§€μ—° λ‘œλ”©, μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ λ“±)을 이해해야 함

λŒ€ν‘œμ μΈ ORM 기술 (ν‘œ)

기술
μ„€λͺ…
JPA (Java Persistence API)
μžλ°” ORM 기술 ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€
Hibernate
JPA의 λŒ€ν‘œμ μΈ κ΅¬ν˜„μ²΄
EclipseLink, OpenJPA
JPA의 λ‹€λ₯Έ κ΅¬ν˜„μ²΄

ORM 예제 (JPA & Hibernate)

@Entity @Table(name = "users") public class User { @Id @GeneratedValue private Long id; private String name; private String email; }
Java
볡사
// 데이터 μ €μž₯ (SQL 직접 μž‘μ„± 없이 ORM이 처리) User user = new User(); user.setName("John Doe"); user.setEmail("john@example.com"); entityManager.persist(user); // INSERT SQL μžλ™ μ‹€ν–‰
Java
볡사

SQL Mapper

SQL Mapperλž€?

SQL MapperλŠ” κ°œλ°œμžκ°€ 직접 SQL을 μž‘μ„±ν•˜κ³ , μ‹€ν–‰ κ²°κ³Όλ₯Ό 객체에 λ§€ν•‘ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. SQL μž‘μ„±μ˜ μžμœ λ„κ°€ λ†’μ•„ λ³΅μž‘ν•œ 쿼리도 μ‰½κ²Œ μž‘μ„±ν•  수 μžˆμ§€λ§Œ, SQL을 직접 관리해야 ν•©λ‹ˆλ‹€.

SQL Mapper νŠΉμ§• (ν‘œ)

ꡬ뢄
μ„€λͺ…
SQL을 직접 μž‘μ„±ν•΄μ•Ό 함
ORM처럼 μžλ™ μƒμ„±λ˜μ§€ μ•ŠμœΌλ©°, SQL을 κ°œλ°œμžκ°€ λͺ…μ‹œμ μœΌλ‘œ μž‘μ„±ν•΄μ•Ό 함
SQL μ‹€ν–‰ κ²°κ³Όλ₯Ό 객체에 λ§€ν•‘
SQL을 μ‹€ν–‰ν•˜κ³ , κ²°κ³Όλ₯Ό μˆ˜λ™μœΌλ‘œ 객체에 ν• λ‹Ή
DBMS 쒅속적
DB에 맞좰 SQL을 μ΅œμ ν™”ν•  수 μžˆμ§€λ§Œ, νŠΉμ • DBMS에 쒅속될 κ°€λŠ₯성이 λ†’μŒ

SQL Mapper의 μž₯단점 (ν‘œ)

μž₯점
μ„€λͺ…
SQL을 직접 컨트둀 κ°€λŠ₯
ORM보닀 SQL μ΅œμ ν™”κ°€ 쉬움
λ³΅μž‘ν•œ 쿼리 μž‘μ„± 용이
JOIN, μ„œλΈŒμΏΌλ¦¬, κ·Έλ£Ήν•‘ 등이 μžμœ λ‘œμ›€
배우기 쉬움
SQL을 μ•Œκ³  μžˆλ‹€λ©΄ 별닀λ₯Έ μΆ”κ°€ ν•™μŠ΅ 없이 μ‚¬μš© κ°€λŠ₯
단점
μ„€λͺ…
λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 SQL이 혼재될 κ°€λŠ₯μ„±
μœ μ§€λ³΄μˆ˜κ°€ μ–΄λ €μšΈ 수 있음
DBMS 쒅속성
DB λ³€κ²½ μ‹œ SQL을 μˆ˜μ •ν•΄μ•Ό ν•  κ°€λŠ₯성이 λ†’μŒ
νŠΈλžœμž­μ…˜ 관리 별도 ν•„μš”
ORM처럼 μžλ™ νŠΈλžœμž­μ…˜ 관리 κΈ°λŠ₯ μ—†μŒ

λŒ€ν‘œμ μΈ SQL Mapper 기술 (ν‘œ)

기술
μ„€λͺ…
MyBatis
Java 기반 λŒ€ν‘œμ μΈ SQL Mapper ν”„λ ˆμž„μ›Œν¬
iBatis
MyBatis의 이전 버전

SQL Mapper 예제 (MyBatis)

β‘  XML 기반 SQL μ •μ˜
<mapper namespace="UserMapper"> <select id="getUserById" parameterType="int" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>
XML
볡사
β‘‘ Java μ½”λ“œμ—μ„œ SQL μ‹€ν–‰
UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(1);
Java
볡사

ORM vs SQL Mapper, μ–΄λ–€ κ±Έ 선택해야 ν• κΉŒ?

ORM이 μ ν•©ν•œ 경우

β€’
객체 μ§€ν–₯적인 개발이 ν•„μš”ν•  λ•Œ
β€’
λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 λ°μ΄ν„°λ² μ΄μŠ€ λ‘œμ§μ„ λΆ„λ¦¬ν•˜κ³  싢을 λ•Œ
β€’
λ°μ΄ν„°λ² μ΄μŠ€ λ³€κ²½ κ°€λŠ₯성이 높을 λ•Œ (ORM은 DB 독립성이 λ†’μŒ)
β€’
μžλ™ν™”λœ νŠΈλžœμž­μ…˜ 관리가 ν•„μš”ν•  λ•Œ

SQL Mapperκ°€ μ ν•©ν•œ 경우

β€’
λ³΅μž‘ν•œ SQL 쿼리λ₯Ό 자주 μž‘μ„±ν•΄μ•Ό ν•  λ•Œ
β€’
SQL μ΅œμ ν™”κ°€ μ€‘μš”ν•œ ν”„λ‘œμ νŠΈ
β€’
λŒ€μš©λŸ‰ 데이터 처리(ORM보닀 SQL νŠœλ‹μ΄ 용이)
β€’
DBMS에 맞좰 μ„±λŠ₯을 μ΅œμ ν™”ν•΄μ•Ό ν•  λ•Œ

κ²°λ‘ : ORMκ³Ό SQL MapperλŠ” λͺ©μ μ— 따라 μ„ νƒν•˜μž!

ORMκ³Ό SQL MapperλŠ” 각자 μž₯단점이 있으며, ν”„λ‘œμ νŠΈ 성격에 따라 μ μ ˆν•œ 방식을 선택해야 ν•©λ‹ˆλ‹€.
β€’
ORM은 객체 쀑심적인 개발과 μœ μ§€λ³΄μˆ˜κ°€ μ‰½μŠ΅λ‹ˆλ‹€.
β€’
SQL MapperλŠ” SQL μ΅œμ ν™”μ™€ λ³΅μž‘ν•œ 쿼리 μž‘μ„±μ΄ μœ λ¦¬ν•©λ‹ˆλ‹€.
β€’
두 κ°€μ§€λ₯Ό λ³‘ν–‰ν•˜μ—¬ μ‚¬μš©ν•  μˆ˜λ„ 있음 (예: 기본적인 CRUDλŠ” ORM, λ³΅μž‘ν•œ μΏΌλ¦¬λŠ” SQL Mapper ν™œμš©)
즉, ORMκ³Ό SQL MapperλŠ” "μƒν˜Έ 배타적"이 μ•„λ‹ˆλΌ "보완적인 기술"둜 ν•¨κ»˜ ν™œμš©ν•  μˆ˜λ„ μžˆλ‹€!

ORM vs SQL Mapper

ꡬ뢄
ORM (Object-Relational Mapping)
SQL Mapper
κ°œλ…
객체와 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μžλ™μœΌλ‘œ λ§€ν•‘ν•˜μ—¬ SQL 없이 데이터 μ‘°μž‘ κ°€λŠ₯
SQL을 직접 μž‘μ„±ν•˜κ³  κ²°κ³Όλ₯Ό 객체와 λ§€ν•‘
SQL μž‘μ„±
μžλ™μœΌλ‘œ 생성 (JPQL, Criteria API λ“± μ‚¬μš©)
직접 SQL μž‘μ„± (κ°œλ°œμžκ°€ 컨트둀)
μœ μ—°μ„±
객체 쀑심적인 데이터 μ‘°μž‘ (DBMS 독립적)
SQL 쀑심적인 데이터 μ‘°μž‘ (DBMS 쒅속적)
ν•™μŠ΅ λ‚œμ΄λ„
μƒλŒ€μ μœΌλ‘œ λ†’μŒ (μ§€μ—° λ‘œλ”©, μ—°κ΄€ 관계 μ„€μ • λ“±)
비ꡐ적 쉬움 (SQL을 이미 μ•Œκ³  μžˆλ‹€λ©΄)
퍼포먼슀 μ΅œμ ν™”
SQL νŠœλ‹μ΄ μ–΄λ ΅κ³ , μžλ™ μƒμ„±λœ 쿼리가 λΉ„νš¨μœ¨μ μΌ 수 있음
SQL을 직접 μž‘μ„±ν•˜λ―€λ‘œ μ„±λŠ₯ μ΅œμ ν™” 용이
λ³΅μž‘ν•œ 쿼리
λ³΅μž‘ν•œ JOIN, μ„œλΈŒμΏΌλ¦¬ 등이 μ–΄λ €μšΈ 수 있음 (Native Query ν•„μš”)
λ³΅μž‘ν•œ 쿼리 μž‘μ„±μ΄ μžμœ λ‘œμ›€
νŠΈλžœμž­μ…˜ 관리
μžλ™μœΌλ‘œ 관리 (Spring, Hibernate 지원)
직접 관리 ν•„μš”
캐싱 지원
1μ°¨ μΊμ‹œ, 2μ°¨ μΊμ‹œ 지원 (JPA/Hibernate)
μΊμ‹œ κΈ°λŠ₯ μ—†μŒ (별도 κ΅¬ν˜„ ν•„μš”)
λŒ€ν‘œ 기술
JPA, Hibernate, EclipseLink, OpenJPA
MyBatis, iBatis

ν•œλˆˆμ— λ³΄λŠ” 차이점

β€’
ORM: SQL을 직접 닀루지 μ•Šκ³  객체 μ€‘μ‹¬μœΌλ‘œ 데이터 μ‘°μž‘ β†’ μžλ™ν™”, μœ μ§€λ³΄μˆ˜ 편리
β€’
SQL Mapper: SQL을 직접 μž‘μ„±ν•˜μ—¬ DBλ₯Ό μ‘°μž‘ β†’ μœ μ—°μ„±, μ„±λŠ₯ νŠœλ‹ 용이
μ–Έμ œ μ‚¬μš©ν•˜λ©΄ μ’‹μ„κΉŒ?
β€’
ORM이 μ ν•©ν•œ 경우: 데이터 λͺ¨λΈμ΄ 객체 μ§€ν–₯적으둜 μ„€κ³„λ˜μ–΄ 있고, SQL을 μ΅œμ†Œν™”ν•˜λ©° μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œ ν•˜κ³  싢을 λ•Œ
β€’
SQL Mapperκ°€ μ ν•©ν•œ 경우: λ³΅μž‘ν•œ 쿼리가 λ§Žκ±°λ‚˜, μ„±λŠ₯ νŠœλ‹μ΄ μ€‘μš”ν•˜λ©° SQL을 직접 μ»¨νŠΈλ‘€ν•΄μ•Ό ν•  λ•Œ