ORM(Object-Relational Mapping)
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(RDB)๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฒด(Object)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๊ณ(Relation)๋ฅผ ๋งคํํ๋ ๊ธฐ์
โข
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 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์ ์ง์ ์ปจํธ๋กคํด์ผ ํ ๋