Search

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์„ ์ง์ ‘ ์ปจํŠธ๋กคํ•ด์•ผ ํ•  ๋•Œ