๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ถ„์„

[python] ํŒŒ์ด์ฌ ๊ฐ์ฒด ์ง๋ ฌํ™” (Serialization)

be__simon 2021. 10. 31. 22:50

๋ฐ์ดํ„ฐ ๋ถ„์„ ํ•  ๋•Œ๋„ ๊ทธ๋ ‡๊ณ , ์ตœ๊ทผ๊นŒ์ง€ ์กธ์—…ํ”„๋กœ์ ํŠธ๋กœ ์ถ”์ฒœ์‹œ์Šคํ…œ ํ•  ๋•Œ๋„ ๊ทธ๋ ‡๊ณ  ํฐ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ๋‹ค๋ฃฐ ๋•Œ๊ฐ€ ๋งŽ๋‹ค.
๊ทธ ๋•Œ ๊ทธ ๋•Œ ์ผ์ผ์ด ๋ถˆ๋Ÿฌ์™€์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ์—” ์‹œ๊ฐ„๋„ ๋งŽ์ด ๊ฑธ๋ฆฌ๊ณ ,,, ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ด๋‹ค.
์ด๋Ÿด ๋• ์ง๋ ฌํ™”ํ•ด์„œ ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•ด ๋†“๋Š”๊ฒŒ ์œ ์šฉํ•ด์„œ ํ•œ ๋ฒˆ ์ •๋ฆฌ๋ฅผ ํ•ด ๋ณด์•˜๋‹ค.

์ง๋ ฌํ™” - ์—ญ์ง๋ ฌํ™” / Serialization - Deserialization

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

์ถœ์ฒ˜:  https://ichi.pro/ko/jiglyeolhwa-pilteoling-javaui-jiglyeolhwa-haeje-chwiyagseong-boho-57845558473750

  • ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์†์ ์ธ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง๋ ฌํ™”๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์—ˆ๋‹ค.
  • ๋ณ€ํ™˜๋œ Byte Stream์€ ํ”Œ๋žซํผ์— ์ข…์†๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ์—ญ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํŒŒ์ด์ฌ์—์„œ๋Š” pickle ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด ์ง๋ ฌํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

pickle

  • pickle ๋ชจ๋“ˆ์„ ์ด์šฉํ•˜๋ฉด ํŒŒ์ด์ฌ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

pickle๋กœ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ type๋“ค

  • None, True ์™€ False
  • ์ •์ˆ˜, ์‹ค์ˆ˜, ๋ณต์†Œ์ˆ˜
  • ๋ฌธ์ž์—ด, ๋ฐ”์ดํŠธ์—ด, ๋ฐ”์ดํŠธ ๋ฐฐ์—ด(bytearray)
  • ํŠœํ”Œ, ๋ฆฌ์ŠคํŠธ, ์ง‘ํ•ฉ๊ณผ ๋”•์…”๋„ˆ๋ฆฌ
  • ๋‚ด์žฅํ•จ์ˆ˜, ์ •์˜๋œ ํ•จ์ˆ˜
  • ํด๋ž˜์Šค
    (์‚ฌ์‹ค ์›ฌ๋งŒํ•˜๋ฉด ๋‹ค ๊ฐ€๋Šฅ... ์„ธ๋ถ€์ ์ธ ๊ธฐ์ค€์ด ์žˆ๊ธด ํ•˜์ง€๋งŒ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๋“ฏํ•˜๋‹ค.)

โ€ผ๏ธ ์ง๋ ฌํ™” ๋ถˆ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์˜ ๊ฒฝ์šฐ PicklingError ์˜ˆ์™ธ ๋ฐœ์ƒ!
๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๊ฐ€ ์žฌ๊ท€๋กœ ๋˜์–ด์žˆ์œผ๋ฉด RecursionError๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

pickle ์˜ˆ์‹œ

import pickle
data = ['pickle', 'pizza', 'cheeze', 'potato']

# ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ
# ๋ฐ”์ดํŠธ ํƒ€์ž…์œผ๋กœ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— wb
with open ('file_name.bin', 'wb') as f:
    pickle.dump(data, f)

# ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
with open ('file_name.bin', 'rb' as f:
    read_data = f.load(f)
  • ๋ฐ”์ดํŠธ ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•  ๋•Œ๋Š” .bin ํ™•์žฅ์ž๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค. (Binary text type)
# ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ดํŠธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
obj = pickle.dumps(data)

# ๋ฐ์ดํ„ฐ ๋ณต์›
origin_data = pickle.loads(obj)
  • ์ง๋ ฌํ™”ํ•œ ๊ฐ์ฒด๋ฅผ ํŒŒ์ผ์— ์“ฐ์ง€ ์•Š๊ณ  bytes ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

pickle vs marshal

์ง๋ ฌํ™” ํ•  ๋•Œ marshal ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” pickle์„ ๋” ์ถ”์ฒœํ•˜๊ณ  ์žˆ๋‹ค.
๋Œ€ํ‘œ์ ์ธ ์ฐจ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  • marshal์€ ํŒŒ์ด์ฌ ๋ฒ„์ „ ๋ณ„ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • pickle๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ marshal์€ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค์™€ ์ธ์Šคํ„ด์Šค๋Š” ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์—†๋‹ค.

pickle vs json

๋Œ€ํ‘œ์ ์ธ ์ง๋ ฌํ™” ๋ฐฉ๋ฒ•์œผ๋กœ json ํƒ€์ž…์ด ์žˆ๋Š”๋ฐ ์ฐจ์ด์ ์„ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

  • json์€ ํ…์ŠคํŠธ๋ฅผ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์ด๊ณ  ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
    but pickle์„ ์ด์šฉํ•œ ์ง๋ ฌํ™”๋Š” ๋ฐ”์ดํŠธ ํƒ€์ž… ์ง๋ ฌํ™”๋ผ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์—†๋‹ค.
  • json์€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๋“ค๊ณผ์˜ ํ˜ธํ™˜์ด ๋˜์ง€๋งŒ (์™ธ๋ถ€ ํ‘œ์ค€์„ ๋”ฐ๋ฆ„) pickle์€ ํŒŒ์ด์ฌ ์‹œ์Šคํ…œ์—์„œ๋งŒ ๊ฐ€๋Šฅ
    ๋Œ€์‹  ์™ธ๋ถ€ํ‘œ์ค€์„ ๋”ฐ๋ผ์•ผํ•˜๋Š” ๋งŒํผ json์€ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒํ˜•์ด ํ•œ์ •๋˜์–ด์žˆ๊ณ , pickle์€ ๋‹ค์–‘ํ•œ ํŒŒ์ด์ฌ ์ž๋ฃŒํ˜•์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค (๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ๊ฐ™์€ ๊ฒƒ๋„ ํ”ผํด์„ ์ด์šฉํ•˜๋Š” ๋“ฏ!)

 

Reference

 

pickle — ํŒŒ์ด์ฌ ๊ฐ์ฒด ์ง๋ ฌํ™” — Python 3.10.0 ๋ฌธ์„œ

pickle — ํŒŒ์ด์ฌ ๊ฐ์ฒด ์ง๋ ฌํ™” ์†Œ์Šค ์ฝ”๋“œ: Lib/pickle.py pickle ๋ชจ๋“ˆ์€ ํŒŒ์ด์ฌ ๊ฐ์ฒด ๊ตฌ์กฐ์˜ ์ง๋ ฌํ™”์™€ ์—ญ ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ใ€Šํ”ผํด๋ง(pickling)ใ€‹์€ ํŒŒ์ด์ฌ ๊ฐ์ฒด ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€

docs.python.org