Sam Baek, The Dev's Corner

๐Ÿ“–Django serialize in 4 minutes

13 May 2024

ํ•œ๋ฐ”ํƒ• ์ด์ง์„ ํ•˜๋ฉด์„œ,
๊ด€์‹ฌ ์žˆ๋˜ Django์— ๋Œ€ํ•ด ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค.
Django๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด
serialize์ด๋‹ค.

Django์™€ Python์˜ Serialize์˜ ๊ธฐ์ดˆ


์‹œ๋ฆฌ์–ผ๋ผ์ด์ œ์ด์…˜(serialization)์€ ๊ฐ์ฒด๋ฅผ
ํŠน์ • ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•˜๊ฑฐ๋‚˜
๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

deserialization์€ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค.

Django์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ
python์˜ ๋‚ด์žฅ ๋ชจ๋“ˆ์ธ pickle ๋˜๋Š” json์„ ์‚ฌ์šฉํ•ด
๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค

python์˜ pickle ๋ชจ๋“ˆ์€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜๋ฉฐ,
๋Œ€๋ถ€๋ถ„์˜ python ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ง๋ ฌํ™”๋ž€ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜, ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์†Œ์Šค์—์„œ ๋ฐ›์€
pickle ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜ํ•˜๋‹ค.

๋ฐ˜๋ฉด, json์€ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
๋”•์…”๋„ˆ๋ฆฌ, ๋ฆฌ์ŠคํŠธ, ๋ฌธ์ž์—ด, ์ˆซ์ž ๋“ฑ์˜ ๊ฐ„๋‹จํ•œ python ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ
JSON ํ˜•์‹์œผ๋กœ ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

Django์—์„œ๋Š” models.py์— ์ •์˜ ๋œ ๋ชจ๋ธ ํด๋ž˜์Šค์˜
์ธ์Šคํ„ด์Šค๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ฑฐ๋‚˜
HTTP requests/response ๋ฉ”์‹œ์ง€์— ํฌํ•จ์‹œ์ผœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

Django๋Š” ๋ชจ๋ธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง๋ ฌํ™” ํ•  ๋•Œ
๋ชจ๋ธ ํด๋ž˜์Šค์˜ ํ•„๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ด ๋•Œ, Django๋Š” serialize ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด
๋ชจ๋ธ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์ „ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ ,
deserialize ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์ „์„ ๋ชจ๋ธ ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

from django.core import serializers

post = Post.objects.get(pk=1)
data = serializers.serialize('json', [post])

์œ„ ์ฝ”๋“œ์—์„œ โ€˜jsonโ€™์€ ์ง๋ ฌํ™” ํ˜•์‹์„ ์˜๋ฏธํ•˜๋ฉฐ,
๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์ง๋ ฌํ™” ํ•  ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ด๋ ‡๊ฒŒ ์ง๋ ฌํ™” ๋œ ๋ฐ์ดํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ์ผ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ๋‹ค.
์ง๋ ฌํ™” ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ชจ๋ธ ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด
์ฆ‰, ์—ญ์ง๋ ฌํ™”ํ•˜๋ ค๋ฉด deserialize ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํŒŒ์ด์ฌ์—์„œ ๋ฐ์ดํ„ฐ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆ ์ดํ•ดํ•˜๊ธฐ


์‹œ๋ฆฌ์–ผ๋ผ์ด์ œ์ด์…˜(serialization)์€ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ
๋‹จ์ˆœํ•œ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
์ด ๊ณผ์ •์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜
๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๊ฐ€ ๋ฐ”๋กœ JSON์ด๋‹ค.

python์—์„œ๋Š” JSON ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ
์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆ ๋ฐ ๋””์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
JSON ๋ชจ๋“ˆ์€ Dictionary์™€ List๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜
JSON ํ˜•์‹์„ Dictionary์™€ List๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

import json

data = {
    'name': 'Sam',
    'age': 25,
    'city': 'Seoul'
}
sam_data = json.dumps(data)
print(sam_data)

new_data = json.loads(sam_data)
print(new_data)

์œ„ ์ฝ”๋“œ๋Š” python์˜ Dictionary๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.
dumps() ๋ฉ”์„œ๋“œ๋Š” Dictionary๋ฅผ JSON ํ˜•์‹์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
loads() ๋ฉ”์„œ๋“œ๋Š” JSON ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ Dictionary๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

์œ„ ์ฝ”๋“œ๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ ,
๋‹ค์‹œ JSON ํ˜•์‹์„ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ค€๋‹ค.

๊ฐ์ฒด ์ง๋ ฌํ™”๋ž€ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ์ƒํƒœ์—์„œ
์™ธ๋ถ€ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
์ฆ‰, ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’๋“ค์„ ๋ชจ์•„์„œ
์™ธ๋ถ€ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋Ÿฌํ•œ ๊ฐ์ฒด ์ง๋ ฌํ™”๋Š” ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์—
๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

python์—์„œ๋Š” pickle ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜, ์ฃผ์˜ํ•  ์ ์€ pickle ๋ชจ๋“ˆ์€ ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ
์•…์˜์ ์ธ ๋ชฉ์ ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ pickle ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ
์ˆ˜์ •ํ•˜์—ฌ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, pickle ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ
pickle ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ณ  ๋””์ฝ”๋”ฉํ•ด์•ผ ํ•œ๋‹ค.

Django ๋ชจ๋ธ ์ธ์Šคํ„ด์Šค์˜ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ง• ๊ณผ์ •


์žฅ๊ณ ์—์„œ๋Š” ๋ชจ๋ธ์˜ ํ•„๋“œ ๊ฐ’๋“ค์„
JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ๋‹ค.
์ด๋•Œ, ๊ฐ ํ•„๋“œ๋Š” ํ•ด๋‹น ํƒ€์ž…์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆ ๋œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, CharField๋Š” ๋ฌธ์ž์—ด๋กœ, IntegerField๋Š” ์ •์ˆ˜๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

๋งŒ์•ฝ, ๋ชจ๋ธ์˜ ํ•„๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋ธ์„ ์ฐธ์กฐํ•˜๋Š”
ForeignKey๋‚˜ ManyToManyField์ธ ๊ฒฝ์šฐ,
ํ•ด๋‹น ๋ชจ๋ธ์˜ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์ด JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

์ด๋Ÿฌํ•œ Django์˜ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ง• ๊ณผ์ • ๋•๋ถ„์—
๊ฐœ๋ฐœ์ž๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง์ ‘ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
ํ•˜์ง€๋งŒ, ํŠน์ • ํ•„๋“œ๋ฅผ ์ง์ ‘ ์ œ์–ดํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋Š”
serializer ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.

serializer ํด๋ž˜์Šค๋Š” ModelSerializer ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„
ํ•„๋“œ ๋‹จ์œ„๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ํ•„๋“œ๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜, ํŠน์ • ํ•„๋“œ๋งŒ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ ๊ณผ์ •์€ API๊ฐ€ ์œ ์—ฐํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.