QUEUE_CONNECTION 을 고쳤는데 값이 안 바뀌었고 어디서 온 값인지 찾는 데 반나절이 걸렸다. 층이 여섯이었고 뒤로 갈수록 앞을 덮는 구조였는데 내가 고친 층 뒤에 같은 키가 또 있었다.
Table of contents
Open Table of contents
검증 — 층별로 읽어 비교하기
값만 찍어서는 어디서 왔는지가 안 나왔다. 그래서 각 층을 따로 읽어 한 줄에 나란히 찍게 했다.
config/queue.php 의 기본값과 .env 와 printenv 의 값을 tinker 에서 함께 출력하니 환경 변수 쪽이 다른 값을 갖고 그것이 이기고 있다는 것이 바로 보였다. 값 하나만 보면 결과는 알아도 출처는 모르므로 층별로 나란히 찍는 것이 진단의 시작이었다.
배경 — 아래에서부터 보는 순서
층을 그림으로 그려 무엇이 무엇을 덮는지를 정리했다. 코드 기본값에서 시작해 config/ 와 .env 와 docker run -e 와 배포 도구 주입과 실행 인자 순으로 이긴다. Laravel 공식 문서대로 config:cache 를 돌린 뒤에는 .env 가 아예 읽히지 않고 env() 는 시스템 환경 변수만 돌려주므로 운영에서는 한 층이 통째로 사라진다.
그림을 그리고 나니 위에서부터 훑는 대신 아래에서부터 보게 됐다. 이기는 것을 먼저 보는 쪽이 훨씬 빨랐다.
조치 — 층마다 무엇을 둘지 정하기
각 층에 무엇을 둘지를 정하니 겹치는 것이 줄었다. 코드 기본값에는 없어도 도는 안전한 값을 두고 config/ 에는 구조와 기본 설정을 두며 .env 에는 개발자별 값을 둔다.
운영 값은 컨테이너 환경으로 주입하고 실행 인자는 일회성 수동 실행에만 쓴다. 비밀 값은 환경 파일과 컨테이너 환경에만 두고 코드와 설정 파일에는 넣지 않기로 했다.
원인 — 겹친 키를 빼기
두 층에 다 있는 키를 뽑아 세 개를 찾았다. 뒤쪽이 이기므로 앞쪽 값은 아무 의미가 없는 상태였다.
두 가지 방법이 있었는데 겹친 키를 양쪽에 같은 값으로 맞춰 두는 것과 앞쪽에서 빼는 것이다. 뒤쪽을 골랐다. 이유는 겹쳐 있으면 다음에 또 어느 쪽이 이기는지 찾게 돼서다. 대신 앞쪽만 보고 띄우는 개발 환경에서 그 키가 비어 보이는 것을 감수했다. 운영에서는 .env 자체를 안 쓰기로 해서 층이 하나 줄었고 층은 유연한 만큼 찾기 어려워지므로 필요한 만큼만 두는 것이 맞았다.
주의 — 안에서 본 실제 값
밖에서 무엇을 주었는지와 컨테이너 안에서 무엇이 보이는지가 달랐다. -e 로 준 값과 docker exec 로 안에서 printenv 한 값이 서로 달랐던 것이다.
이미지의 entrypoint.sh 가 같은 이름을 export 하고 있었고 그것이 컨테이너 안에서 나중에 실행돼 이기고 있었다. 시험용으로 넣고 안 지운 것이었으며 밖에서 준 것이 항상 이기는 것이 아니므로 안에서 실제 값을 봐야 알 수 있었다.
정리
- 설정이 여러 층이면 어느 층에서 온 값인지부터 찾는다
- 각 층을 따로 읽어 나란히 찍어 비교한다
- 층을 그림으로 그리고 이기는 쪽부터 본다
- 각 층에 무엇을 둘지 정하면 겹침이 준다
- 두 층에 다 있는 키를 찾아 하나를 뺀다
- 지금 값을 볼 수 있게 하되 비밀 값은 가린다
- 층은 유연한 만큼 찾기 어려우므로 줄일 수 있으면 줄인다
- 밖에서 준 것이 항상 이기지 않으므로 안에서 확인한다