Context 란
Laravel의 Context 기능은 요청·큐 잡·명령어의 실행을 넘나들며 정보를 기록·공유하기 위한 구조입니다.Illuminate\Support\Facades\Context 파사드를 통해 정보를 추가하면 그 정보는 애플리케이션이 기록하는 모든 로그 엔트리에 자동으로 부여됩니다.
이에 따라 개별 로그 호출에 전달한 정보와 Context가 유지하는 공유 정보를 명확하게 구별할 수 있습니다.
분산 시스템이나 큐를 사용한 아키텍처에서 트레이싱을 할 때 특히 유용합니다.
컨텍스트의 전파 플로우
기본적인 사용법
가장 전형적인 사용법은 미들웨어에서trace_id를 설정하는 것입니다. 이후의 모든 로그 엔트리에 자동으로 포함됩니다.
1
미들웨어 작성
2
Context 에 트레이스 ID 를 추가
3
미들웨어 등록
bootstrap/app.php에서 글로벌 미들웨어로 등록합니다.url과 trace_id가 자동으로 부여됩니다.
컨텍스트에의 쓰기
add — 값 추가
add는 기존 키를 덮어씁니다. 키가 존재하지 않는 경우에만 추가하고 싶을 때는 addIf를 사용합니다.
increment / decrement — 카운터 관리
수치를 증감시키는 전용 메서드입니다. 두 번째 인수로 변화량을 지정할 수 있습니다.when — 조건부로 추가
when 메서드를 사용하면 조건이 true일 때·false일 때 각각 다른 데이터를 추가할 수 있습니다.
push — 스택에 추가
Context는 리스트 형식의 데이터를 유지하는 “스택”을 지원합니다.push를 사용하면 추가한 순서로 데이터가 쌓여 갑니다.
컨텍스트 취득
get / all
only / except — 일부만 취득
pull / pop — 취득해서 삭제
pull은 키의 값을 취득함과 동시에 컨텍스트에서 삭제합니다.
pop을 사용합니다.
remember — 존재하지 않으면 설정해서 반환
has / missing — 키의 존재 확인
has는 null이 저장되어 있어도 true를 반환합니다. 키가 등록되어 있는지 여부만을 확인합니다.컨텍스트 삭제
forget으로 키를 삭제합니다.
스코프 부착 컨텍스트
scope 메서드를 사용하면 클로저의 실행 중에만 컨텍스트를 일시적으로 변경하고, 실행 후에 원래 상태로 자동으로 되돌릴 수 있습니다.
테스트나 국소적인 처리에서 일시적인 추가 정보를 로그에 포함시키고 싶을 때 편리합니다.
Hidden Context
로그에 출력하고 싶지 않은 데이터(비밀번호·API 키·개인 식별 정보 등)는 Hidden Context에 저장합니다. 일반적인get 메서드로는 취득할 수 없으며, getHidden 등의 전용 메서드로만 접근할 수 있습니다.
큐 잡에의 인계
잡을 큐에 디스패치하면 현재의 컨텍스트가 자동으로 직렬화되어 잡의 페이로드에 포함됩니다. 잡 실행 시에 원래의 컨텍스트가 복원되기 때문에, 요청에서 부여한trace_id가 큐 상의 로그에도 자동으로 인계됩니다.
trace_id가 큐 상의 로그에도 포함되는 것을 확인할 수 있습니다.
Dehydrating — 잡 전송 시의 커스터마이즈
Context::dehydrating을 사용하면 잡 전송의 직전에 컨텍스트를 가공할 수 있습니다.
예를 들어 Accept-Language 헤더로 정해지는 로케일을 큐에 전달하고 싶은 경우에 사용합니다.
Hydrated — 잡 실행 시의 복원
Context::hydrated를 사용하면 잡 실행의 직전에 컨텍스트가 복원된 타이밍에 처리를 추가할 수 있습니다.
예를 들어 저장해 두었던 로케일을 설정 파일에 반영합니다.
정리
Context vs Log::withContext 의 차이
Context vs Log::withContext 의 차이
Dehydrate/Hydrate 의 자주 있는 사용 패턴
Dehydrate/Hydrate 의 자주 있는 사용 패턴
- 로케일의 인계:
dehydrating으로app.locale을 Hidden Context에 저장하고,hydrated에서Config::set으로 복원. - 인증 정보의 전파: 요청에서 인증한 사용자의 정보를 큐 잡에서도 참조할 수 있도록 함.
- 테넌트 ID: 멀티테넌트 앱에서 테넌트 식별자를 큐를 넘나들며 공유.