PHP

PHP에서 데이터 직렬화 및 역직렬화하기

thebasics 2024. 9. 13. 10:00

목차
1. 데이터 직렬화란 무엇인가?
   - 직렬화의 개념
   - 직렬화의 활용 사례
2. PHP에서 'serialize'와 'unserialize' 사용하기
   - serialize 사용법
   - unserialize 사용법
3. JSON과의 비교
   - JSON의 장단점
   - serialize와 JSON의 차이점
4. 코드 예제
5. 결론 및 추가 학습 자료


1. 데이터 직렬화란 무엇인가?

직렬화의 개념

직렬화(Serialization)는 데이터 구조나 객체 상태를 연속적인 바이트 스트림으로 변환하는 과정입니다. 이렇게 변환된 데이터를 파일, 데이터베이스, 또는 네트워크를 통해 저장하거나 전송할 수 있으며, 나중에 이 데이터를 역직렬화(Deserialization)하여 원래의 데이터 구조나 객체 상태로 복원할 수 있습니다.

직렬화의 활용 사례

- 세션 저장: PHP 세션 데이터를 직렬화하여 파일이나 데이터베이스에 저장한 후, 사용자가 다시 방문할 때 이를 복원합니다.
- 데이터베이스 저장: 복잡한 객체나 배열을 직렬화하여 데이터베이스에 저장하고, 필요할 때 이를 역직렬화하여 사용합니다.
- 데이터 전송: 네트워크를 통해 객체나 데이터 구조를 전송할 때 직렬화를 사용하여 데이터를 직렬화하고, 수신 측에서 이를 역직렬화합니다.


2. PHP에서 'serialize'와 'unserialize' 사용하기

serialize 사용법

PHP에서 'serialize' 함수는 데이터를 직렬화하여 문자열로 변환합니다. 이 문자열은 저장하거나 전송할 수 있으며, 나중에 'unserialize' 함수를 사용하여 복원할 수 있습니다.

<?php
$data = array(
    "name" => "John Doe",
    "email" => "john.doe@example.com",
    "age" => 28
);

$serializedData = serialize($data);
echo "Serialized Data: " . $serializedData;
?>

이 예제에서 'serialize' 함수는 배열 '$data'를 직렬화된 문자열로 변환합니다. 출력 결과는 다음과 같습니다:

Serialized Data: a:3:{s:4:"name";s:8:"John Doe";s:5:"email";s:20:"john.doe@example.com";s:3:"age";i:28;}

unserialize 사용법

'unserialize' 함수는 직렬화된 문자열을 원래의 데이터 구조로 복원합니다.

<?php
$serializedData = 'a:3:{s:4:"name";s:8:"John Doe";s:5:"email";s:20:"john.doe@example.com";s:3:"age";i:28;}';

$data = unserialize($serializedData);
print_r($data);
?>

이 예제에서는 직렬화된 문자열을 역직렬화하여 원래의 배열로 복원합니다. 출력 결과는 다음과 같습니다:

Array
(
    [name] => John Doe
    [email] => john.doe@example.com
    [age] => 28
)

 


3. JSON과의 비교

JSON의 장단점

JSON(JavaScript Object Notation)은 데이터 직렬화에 자주 사용되는 경량 데이터 형식입니다. PHP에서 JSON은 'json_encode'와 'json_decode' 함수를 사용하여 데이터를 직렬화하고 역직렬화할 수 있습니다.

장점:
- 인간 친화적: JSON은 사람이 읽기 쉬운 형식으로 직렬화됩니다.
- 범용성: 대부분의 프로그래밍 언어에서 JSON을 쉽게 처리할 수 있습니다.
- 웹 친화적: JSON은 텍스트 기반으로 웹 애플리케이션에서 널리 사용됩니다.

단점:
- PHP 고유 데이터 구조의 처리 제한: JSON은 PHP 고유의 데이터 구조(예: 리소스, 객체 상태 등)를 표현하지 못합니다.
- 정밀도 손실: 부동 소수점 숫자나 매우 큰 정수를 처리할 때 정밀도 손실이 발생할 수 있습니다.

serialize와 JSON의 차이점

serialize와 JSON은 모두 데이터를 직렬화하는 데 사용되지만, 몇 가지 중요한 차이점이 있습니다:

- 데이터 표현: 'serialize'는 PHP의 모든 데이터 구조를 포함하여 객체, 배열, 리소스 등을 직렬화할 수 있습니다. 반면, JSON은 객체나 배열과 같은 기본적인 데이터 구조만 표현할 수 있습니다.
- 호환성: JSON은 여러 언어와 플랫폼에서 호환 가능하지만, 'serialize'는 PHP에 특화된 형식으로 다른 언어에서 사용할 수 없습니다.
- 가독성: JSON은 사람이 읽기 쉽고 이해하기 쉬운 형식으로 직렬화되지만, 'serialize'는 그렇지 않습니다.

예를 들어, 객체를 직렬화하는 경우를 비교해 보겠습니다:

<?php
class User {
    public $name;
    public $email;

    public function __construct($name, $email) {
        $this->name = $name;
        $this->email = $email;
    }
}

$user = new User("John Doe", "john.doe@example.com");

// serialize 사용
$serializedUser = serialize($user);
echo "Serialized User: " . $serializedUser . "\n";

// JSON 사용
$jsonUser = json_encode($user);
echo "JSON User: " . $jsonUser . "\n";
?>

출력 결과:

Serialized User: O:4:"User":2:{s:4:"name";s:8:"John Doe";s:5:"email";s:20:"john.doe@example.com";}
JSON User: {"name":"John Doe","email":"john.doe@example.com"}

차이점:
- 'serialize'는 객체의 클래스 이름('O:4:"User"')과 속성을 포함하여 직렬화합니다.
- JSON은 객체의 데이터만 포함하여 직렬화하며, 클래스 정보는 유지되지 않습니다.


4. 코드 예제

다음은 PHP에서 'serialize', 'unserialize', 그리고 JSON을 사용하여 데이터를 직렬화하고 역직렬화하는 예제입니다.

1. 직렬화 및 역직렬화:

<?php
$data = array(
    "name" => "Alice",
    "email" => "alice@example.com",
    "age" => 30
);

// serialize 사용
$serializedData = serialize($data);
echo "Serialized Data: " . $serializedData . "\n";

// unserialize 사용
$unserializedData = unserialize($serializedData);
print_r($unserializedData);
?>

2. 객체 직렬화 및 JSON 변환:

<?php
class Product {
    public $name;
    public $price;

    public function __construct($name, $price) {
        $this->name = $name;
        $this->price = $price;
    }
}

$product = new Product("Laptop", 999.99);

// serialize 사용
$serializedProduct = serialize($product);
echo "Serialized Product: " . $serializedProduct . "\n";

// JSON 사용
$jsonProduct = json_encode($product);
echo "JSON Product: " . $jsonProduct . "\n";
?>

3. 복합 데이터 구조 처리:

<?php
$data = array(
    "user" => new User("Bob", "bob@example.com"),
    "orders" => array(
        array("id" => 1, "product" => "Laptop"),
        array("id" => 2, "product" => "Mouse")
    )
);

// serialize 사용
$serializedData = serialize($data);
echo "Serialized Complex Data: " . $serializedData . "\n";

// JSON 사용
$jsonData = json_encode($data);
echo "JSON Complex Data: " . $jsonData . "\n";
?>

코드 분석:
- 첫 번째 예제는 배열을 직렬화하고 역직렬화하는 기본적인 사용법을 보여줍니다.
- 두 번째 예제는 객체를 직렬화하고 JSON으로 변환하여, 두 방법의 차이점을 설명합니다.
- 세 번째 예제는 복합 데이터 구조를 직렬화하고, 이를 'serialize'와 JSON으로 처리하는 방법을 보여줍니다.


5. 결론 및 추가 학습 자료

이번 글에서는 PHP에서 데이터 직렬화와 역직렬화를 수행하는 방법에 대해 알아보았습니다. 'serialize'와 'unserialize' 함수는 PHP의 복잡한 데이터 구조를 효율적으로 저장하고 복원하는 데 유용하며, JSON은 가독성과 호환성이 뛰어난 직렬화 형식으로 널리 사용됩니다. 각각의 도구는 특정한 상황에서 더 유리할 수 있으므로, 프로젝트의 요구 사항에 따라 적절한 방법을 선택하는 것이 중요합니다.

추가 학습 자료:
- [PHP 공식 문서 - 직렬화](https://www.php.net/manual/en/function.serialize.php) PHP의 'serialize' 함수와 관련된 공식 문서입니다.
- [PHP 공식 문서 - JSON](https://www.php.net/manual/en/book.json.php) PHP에서 JSON을 처리하는 방법에 대한 공식 문서입니다.
- [PHP: The Right Way](https://phptherightway.com/#serialization) PHP에서 직렬화와 JSON 사용에 대한 모범 사례를 제공하는 가이드입니다.


이제 PHP에서 데이터 직렬화와 역직렬화를 수행하여 데이터를 안전하게 저장하고 전송할 수 있습니다. 지속적인 학습과 실습을 통해 이러한 도구들을 더욱 효과적으로 활용해보세요!

반응형