ORM (Object-Relational Mapping)

2025. 5. 14. 03:17ใ†CS ๊ณต๋ถ€, ๊ธฐํƒ€

๐Ÿง  ORM ์ด๋ž€?

๊ฐ์ฒด(Object) ์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Relational Database) ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•ด์ฃผ์–ด RDB ํ…Œ์ด๋ธ”์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

 

๐ŸŽฏ ์™œ ORM์ด ํ•„์š”ํ• ๊นŒ?

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ๋Œ€๋ถ€๋ถ„ ๊ฐ์ฒด(Object) ๊ธฐ๋ฐ˜์ด์ง€๋งŒ,

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜•์‹์ด ๋‹ค๋ฅด๋‹ค.

 

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ ๊ฐ„์—๋Š” ๋ถˆ์ผ์น˜๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ORM์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

 

๊ฐ„๋‹จํžˆ ๋งํ•ด:

๐Ÿ“ฆ ํด๋ž˜์Šค <–> ํ…Œ์ด๋ธ”

๐Ÿงฉ ๊ฐ์ฒด(Object) <–> ๋ ˆ์ฝ”๋“œ(Row)

 

์˜ˆ๋ฅผ ๋“ค์–ด Python์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์“ด๋‹ค:

user.name
user.age

๊ทธ๋Ÿฐ๋ฐ SQL์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์จ์•ผ ํ•œ๋‹ค:

SELECT name, age FROM users WHERE id=1;

→ ๋‘ ์„ธ๊ณ„ ๊ฐ„์˜ ๊ฐ„๊ทน์„ ORM์ด ๋ฉ”์›Œ์ค€๋‹ค.

 

๐Ÿ” ORM์˜ ํ•ต์‹ฌ ์—ญํ• 

ORM ์—†์ด (SQL ์ง์ ‘) ORM ์‚ฌ์šฉ ์‹œ
SELECT * FROM users; User.objects.all()
INSERT INTO users ... User(name="ํ™๊ธธ๋™").save()
UPDATE users SET ... user.name = "ํ™๊ธธ๋™"; user.save()
DELETE FROM users ... user.delete()

 

๐Ÿ“š ์ฃผ์š” ORM ํ”„๋ ˆ์ž„์›Œํฌ

์–ธ์–ด ORM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
Python SQLAlchemy, Django ORM
JavaScript Sequelize (Node.js), TypeORM
Java Hibernate
C# Entity Framework
Kotlin Exposed

 

โœ… ์žฅ์ 

1. ์ง๊ด€์ ์ด๊ณ  ๊ฐ€๋…์„ฑ ์ข‹์€ ์ฝ”๋“œ

  • Query์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ์„ ์–ธ๋ฌธ, ํ• ๋‹น ๋“ฑ์˜ ๋ถ€์ˆ˜์ ์ธ ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค๊ณ , ๊ฐ์ข… ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค.

2. ๊ฐ์ฒด ์ง€ํ–ฅ์  ์ ‘๊ทผ์œผ๋กœ ์ƒ์‚ฐ์„ฑ ์ฆ๊ฐ€

  • SQL๋ฌธ์ด ์•„๋‹Œ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐ์ž‘ํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด ๋ชจ๋ธ๋งŒ ์ด์šฉํ•ด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ์žฌ์‚ฌ์šฉ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์˜ ์šฉ์ด์„ฑ ์ฆ๊ฐ€

  • ORM์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด์žˆ๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋“ค์„ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋งคํ•‘ ์ •๋ณด๊ฐ€ ๋ช…ํ™•ํ•˜์—ฌ, ERD๋ฅผ ๋ณด๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์˜์กด๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

4. DBMS์— ๋Œ€ํ•œ ์ข…์†์„ฑ ๊ฐ์†Œ

  • ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— RDBMS์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ Java์˜ ๊ฐ์ฒด์ง€ํ–ฅ ๋ชจ๋ธ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ขํž ์ˆ˜ ์žˆ๋‹ค.
  • ORM์€ ํŠน์ • DB์— ์ข…์†์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— DBMS๋ฅผ ๊ต์ฒดํ•˜๋Š” ํฐ ์ž‘์—…์—๋„ ๋น„๊ต์  ์ ์€ ๋ฆฌ์Šคํฌ์™€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

 

โš ๏ธ ๋‹จ์ 

  • โ— ๋ณต์žกํ•œ ์ฟผ๋ฆฌ์—์„œ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Œ
  • โ— ORM์ด ์ถ”์ƒํ™”ํ•œ ๋™์ž‘์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ์•Š์œผ๋ฉด ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›€
  • โ— DB ๊ณ ์œ  ๊ธฐ๋Šฅ ํ™œ์šฉ์ด ์ œํ•œ์ ์ผ ์ˆ˜ ์žˆ์Œ

 

๐ŸŽ“ ์˜ˆ์‹œ (Python / Django ORM)

# models.py
class User(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

# user ์ƒ์„ฑ
new_user = User(name="ํ™๊ธธ๋™", age=25)
new_user.save()

# user ์กฐํšŒ
user = User.objects.get(id=1)
print(user.name)

# ์ˆ˜์ •
user.age = 26
user.save()

# ์‚ญ์ œ
user.delete()