PSR-6 : 캐싱 인터페이스 (http://www.php-fig.org/psr/psr-6/)
캐싱은 많은 프레임워크와 라이브러리의 주요 기능 중 하나로, 프로젝트의 성능을 향상시키는 일반적인 방법이다.
이 문서는 이미 사용중인 프레임워크와 시스템에 통합될 수 있는 캐싱 라이브러리를 생성할 수 있도록 한다.
Definitions
Calling Library
실제 캐시 서비스가 필요한 라이브러리나 코드.
이 라이브러리는 표준 인터페이스를 구현하는 캐싱 서비스를 이용할 것이다.
Implementing Library
이 라이브러리는 Calling 라이브러리로 캐시 서비스를 제공하기 위한 표준을 구현하도록 응답한다.
Cache\CacheItemPoolInterface 와 Cache\CacheItemInterface 인터페이스를 구현하는 클래스를 제공해야 한다.
초 단위의 최소 TTL 을 제공해야 한다.
TTL
Item 이 저장되고 나서 유지될 때까지의 시간(Time To Live)으로, DateInterval 객체나 초 단위의 정수로 정의된다.
Expiration
Item 이 소멸될 실제 시간을 지정한다.
일반적으로 객체가 저장될 때 TTL 에 시간을 추가하면서 계산되고, DateTime 객체로 지정된다.
Calling Library 는 만료 시간이 지정되지 않거나, null 로 지정된 item 을 요청한다면, Implementing Library 는 기본 유효기간으로 사용할 것이다.
기본 유효기간이 지정되지 않으면, Implementing Library 는 그 item 을 계속해서 캐시 요청할 것이다.
Key
최소 한글자 이상의 유일한 문자열인 키는 캐시된 Item 을 식별한다.
Implementing libraries 는 UTF-8 인코딩 64길이의 A-Z, a-z, 0-9, _, . 문자들로 구성된 키를 제공한다.
Implementing libraries 는 추가 문자열과 인코딩, 추가 길이를 최소한으로 제공할 것이다.
라이브러리는 적절하게 이스케이프 된 키 문자열로 응답하지만 수정되지 않은 키 문자를 반환할 수 있어야 한다.
{}()/\@: 문자는 추후 확장을 위해 예약되었고 implementing libraries 로부터 제공되지 않아야 한다.
Hit
캐시 hit 은 Calling Library 가 키로 Item 을 요청하고 일치하는 값을 찾았을 때 발생한다. 그 값은 만료되지 않으며 언제나 유효하다.
Calling Libraries 는 모든 get() 호출에서 isHit() 로 hit 을 확인하도록 한다.
Miss
캐시 miss 는 캐시 hit 의 반대이다.
캐시 miss 은 Calling Library 가 키로 Item 을 요청하고 그 키에 해당하는 값을 찾을 수 없거나, 만료된 값일 때 발생한다.
만료된 값은 항상 캐시 miss 를 고려해야 한다.
Deferred
지연된 캐시 보관은 pool 로부터 즉시 지속되지 않는 캐시 Item 을 가리킨다.
Pool 객체는 스토리지 엔진으로부터 제공된 대량 설정 연산의 이점을 위해 지연된 캐시 Item 을 연기할 것이다.
Pool 은 지연된 캐시 Item 이 지속되었는지, 데이터를 잃지 않았는지 확인해야 한다.
Calling Library 는 지속되야 하는 지연된 Item 들을 commit() 메소드를 호출한다.
Implementing Library 는 객체 소멸자나 save() 로 모두 지속시키거나 시간 초과나 최대 Item 수 체크나 다른 적절한 로직 같이, 지연된 Item 들을 지속할 때 결정하는 어떤 로직이든 사용할 것이다.
지연된 캐시 Item 의 요청은 아직 지속되지 않은 지연된 Item 을 반환해야 한다.
Key Concepts
캐싱 시스템에서 Item 들의 집합을 Pool 이라 하며, 모든 Item의 논리적인 저장소이다.
캐싱이 가능한 모든 Item은 Item 객체로서 Pool 에서 검색되며, 캐시된 객체의 모든 처리는 Pool 을 통해 발생한다.
Item 은 Pool 안에 키/값 형태로 존재하며 키는 Item 의 유일한 식별자이고 변하지 말아야 한다.
Data
Implementing Library 는 모든 PHP 데이터 타입을 지원한다. (Strings, Integers, Floats, Boolean, Null, Arrays, Object)
Implementing Library 로 전달된 모든 데이터는 전달된 타입 그대로 반환되어야 하며, PHP의 serialize() 나 unserialize() 함수를 사용할 필요가 없다.
어떤 이유로 실제 저장된 값을 반환할 수 없다면, Implementing Library 는 손상된 데이터 보다는 캐시 miss 로 응답해야만 한다.
Error handling
캐싱은 어플리케이션 성능면에서 중요하지만 기능적으로는 그렇지 않다.
그래서 캐시 시스템에서 에러는 어플리케이션 실패로 나타나지 않아야 한다.
이런 이유로 Implementing Libraries 는 인터페이스로부터 정의된 예외를 제외하고는 발생하지 않아야 한다.
Implementing Library 는 그러한 에러를 기록하거나, 관리자에게 보고한다.
Interfaces
CacheItemInterface
CacheItemInterface 은 캐시 시스템 내부에 Item 을 정의한다.
각 Item 객체는 시스템 구현에 따라 설정할 수 있는 지정된 키로 할당되어야 한다.
일반적으로 이 키는 Cache\CacheItemPoolInterface 객체로부터 전달될 수 있다.
Cache\CacheItemInterface 객체는 캐시 Item 의 저장과 검색을 캡슐화한다.
각 Cache\CacheItemInterface 는 고유 키를 가진 객체를 할당할 뿐 아니라 어떤 요구된 설정에도 응답 가능한 Cache\CacheItemPoolInterface 객체로부터 생성된다.
Cache\CacheItemInterface 객체는 이 문서에 정의된 Data type 으로 저장되고 검색될 수 있어야 한다.
Calling Library 는 자신의 Item 객체를 인스턴스화하지 않아야 하며, getItem() 메소드를 통해 Pool 객체로부터만 요청될 것이다.
Calling Library 는 하나의 Implementing Library 에 의해 생성 된 Item 이 다른 Implementing Library 에서 Pool로 호환될 것으로 가정해서는 안된다.
CacheItemPoolInterface
Cache\CacheItemPoolInterface 의 목적은 Calling Library 로부터 키를 받고, 할당된 Cache\CacheItemInterface 객체를 반환하는 것이다.
또한 전체 캐시 컬렉션과의 상호작용도 중요한 부분이다.
Pool 의 모든 설정과 초기화는 Implementing Library 에 남아 있다.
CacheException
이 예외 인터페이스는 캐시 서버로의 연결처럼 캐시 설정에만 제한되지 않는 중요한 오류가 발생했을 때 사용하기 위한 것이다.
Implementing Library 로부터 발생한 오류는 이 인터페이스를 구현해야 한다.
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.