Menu
Coddy logo textTech

__serialize 및 __unserialize

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 49번째.

객체를 저장하거나 전송하기 위해 문자열로 변환해야 할 때 PHP는 직렬화를 사용합니다. __serialize()__unserialize() 매직 메서드를 사용하면 정확히 어떤 data가 저장되고 어떻게 복원되는지 제어할 수 있습니다.

__serialize() 메서드는 직렬화할 data의 array를 반환하고, __unserialize()는 해당 array를 받아 객체를 다시 구성합니다.

<?php
class Session {
    public function __construct(
        private string $userId,
        private array $data,
        private int $createdAt
    ) {}
    
    public function __serialize(): array {
        return [
            'userId' => $this->userId,
            'data' => $this->data
        ];
    }
    
    public function __unserialize(array $data): void {
        $this->userId = $data['userId'];
        $this->data = $data['data'];
        $this->createdAt = time();
    }
    
    public function getCreatedAt(): int {
        return $this->createdAt;
    }
}

$session = new Session("user123", ["theme" => "dark"], time());
$serialized = serialize($session);

$restored = unserialize($serialized);
echo "Created at: " . $restored->getCreatedAt();

createdAt이 직렬화에서 제외되고 역직렬화될 때 새로운 타임스탬프를 받는다는 점에 주목하세요. 이는 민감한 데이터, 임시 값 또는 데이터베이스 연결처럼 직렬화할 수 없는 리소스를 제외할 때 유용합니다.

이 메서드들은 PHP 7.4에서 이전의 __sleep()__wakeup() 메서드를 대체했으며, property 이름 대신 데이터 배열을 직접 다루는 더 깔끔한 접근 방식을 제공합니다.

challenge icon

챌린지

쉬움

__serialize()__unserialize()를 사용하여 저장되는 데이터와 복원 방식을 제어하는 방법을 보여 주는 사용자 프로필 캐싱 시스템을 만들어 보겠습니다.

코드를 두 개의 파일로 구성합니다:

  • UserProfile.php: 캐싱 기능을 갖춘 사용자의 프로필을 나타내는 UserProfile class를 만듭니다. constructor promotion을 사용하여 $userId(string), $username(string), $email(string), $accessToken(string)에 대한 private properties를 정의합니다. 프로필이 캐시된 시점을 저장하는 private $cachedAt property를 추가합니다(생성자에서 처음에는 "not cached"로 설정). class에는 다음이 필요합니다:
    • __serialize(): userId, username, email만 포함하는 array를 반환합니다. accessToken은 민감한 정보이므로 절대 직렬화해서는 안 됩니다. cachedAt timestamp는 복원할 때 다시 생성됩니다.
    • __unserialize(): data array에서 userId, username, email을 복원합니다. accessToken"expired"로 설정합니다(token은 유지되어서는 안 되기 때문입니다).
    • getInfo(): 다음 형식의 string을 반환합니다: "[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]"
  • main.php: UserProfile 파일을 include합니다. 네 개의 입력값, 즉 user ID, username, email, access token을 받습니다. 이러한 값으로 UserProfile instance를 생성합니다. 다음 세 줄을 출력합니다:
    • 원본 프로필의 정보(serialization 전)
    • serialize()를 사용하여 프로필을 serialize한 다음, unserialize()를 사용하여 unserialize하여 복원된 프로필을 생성합니다. 복원된 프로필의 정보를 출력합니다.
    • "Token preserved: yes" 또는 "Token preserved: no"를 출력합니다. 복원된 프로필의 token이 원본과 일치하는지에 따라 결정됩니다(token은 복원 시 만료되므로 일치하지 않아야 합니다).

이 패턴은 사용자 데이터를 안전하게 캐싱하는 데 필수적입니다. 프로필 정보는 저장하되 access token과 같은 민감한 자격 증명은 절대 유지하지 않으려고 합니다. 프로필이 캐시에서 복원되면 token은 expired로 표시되어 애플리케이션이 새로운 token을 가져오도록 합니다.

직접 해보기

<?php

require_once 'UserProfile.php';

// 입력 읽기
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));

// TODO: 입력 값으로 UserProfile 인스턴스 생성

// TODO: 원본 프로필의 정보 출력 (직렬화 전)

// TODO: 프로필을 직렬화한 다음 역직렬화하여 복원된 프로필 생성

// TODO: 복원된 프로필의 정보 출력

// TODO: Print "Token preserved: yes" or "Token preserved: no"
// 복원된 프로필의 토큰이 원본과 일치하는지 여부에 따라

?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 PHP 컴파일러