01 THINK어떻게 생각하는가

한 화면에서만 옆 메뉴가 사라졌다

짐작 다섯 개를 세워 전부 틀린 걸 확인하고 나서야 원인을 찾았습니다. 꾸미기 규칙 둘이 싸웠고, 도착 순서로 승자가 갈렸습니다.

이 쪽은 원문을 쉬운 말로 다시 쓴 판입니다. 저자가 쓴 문장은 원문 쪽에 있습니다. 이 판의 문장은 사람이 쓰지 않았습니다.

회사 안에서 쓰는 관리자 화면 이야기입니다.

어떤 한 페이지에 들어가면 왼쪽 메뉴가 통째로 사라졌습니다. 에러 메시지도 없고, 다른 페이지는 멀쩡했습니다.

틀린 짐작 다섯 개

단서가 적어서 짐작을 세우고 하나씩 확인해 나갔습니다. 전부 틀렸습니다.

짐작한 원인확인해 보니
코드에 필요한 표시가 빠졌다표시를 넣든 빼든 결과가 같았다
메뉴 목록이 비어서 온다서버 응답에 정상적으로 들어 있었다
메뉴 자리가 0으로 찌그러졌다어떤 화면 크기에서도 그렇지 않았다
권한이 없어서 숨겨졌다권한 검사는 다른 영역만 담당한다
서버에 옛날 코드가 올라가 있다계정에 필요한 권한이 전부 있었다

진짜 원인

메뉴를 감싼 상자에 "숨겨라""화면이 넓으면 보여라" 두 규칙이 같이 붙어 있었습니다.

이 두 규칙은 세기가 똑같습니다. 세기가 같으면 나중에 도착한 쪽이 이깁니다.

회사에서 함께 쓰는 디자인 꾸러미가 "숨겨라" 규칙을 자기 파일에도 한 번 더 적어 두고 있었습니다. 그 파일이 우리 파일보다 나중에 도착하는 페이지에서는 "숨겨라"가 이겨서 메뉴가 사라졌습니다.

왜 그 페이지 하나만 그랬나 — 여기가 핵심이었다

같은 꾸러미를 쓰는 파일이 아홉 개인데 한 개만 터졌습니다. 조건 세 개가 동시에 맞을 때만 생기는 일이었습니다.

  1. 그 페이지가 서버에서 만들어지는 종류다
  2. 그 파일이 다른 파일을 거쳐 한 번 더 밖으로 내보내지고 있다 ← 아홉 개 중 여기만
  3. 그 파일에 "브라우저에서 쓴다"는 표시가 없다

이 셋이 겹치면 꾸미기 파일이 그 페이지 전용 묶음으로 따로 떨어져 나가고, 전용 묶음은 공용 묶음보다 나중에 도착합니다.

실제로 재 보니 문제의 페이지만 꾸미기 파일이 한 개 더 있었고, 마지막 "숨겨라"가 그 추가 파일에 들어 있었습니다.

그리고 2번 조건은 제가 만든 것이었습니다. 며칠 전 코드를 정리하면서 다른 곳에서도 쓸 수 있게 밖으로 내보냈는데, 그게 통로가 됐습니다. 규칙을 지키려던 변경이 다른 층에서 문제를 만든 경우입니다.

두 겹으로 고쳤다

  • 원인 제거 — 그 파일에 "브라우저에서 쓴다" 표시를 붙였습니다. 그러면 꾸미기 파일이 공용 묶음으로 들어갑니다. 같은 모양의 파일 아홉 개도 함께 정리했습니다.
  • 다시 안 나게 — "숨겨라" 규칙을 화면 크기 조건 안으로 넣었습니다. 그러면 상자에서 맨 "숨겨라"가 사라지고, 바깥 규칙이 겨룰 상대 자체가 없어집니다.

세기 싸움에서 이기려 하지 말고, 싸움 자체를 없애는 쪽이 맞았습니다.

올린 뒤 다시 재서 확인했습니다. 파일 수가 줄었고 메뉴가 정상으로 보입니다.

배운 것

1. 실제 서비스에서만 나는 문제가 있습니다. 개발용 서버는 꾸미기 파일을 한 덩어리로 주고, 실제 서버만 페이지별로 쪼갭니다. 제 컴퓨터에서 몇 번을 돌려도 애초에 재현될 수 없는 환경이었습니다.

2. 사용자가 실제로 쓰는 주소에서 재현해야 합니다. "개발 환경"을 제 컴퓨터라고 넘겨짚고 여러 번 확인했는데, 확인한 대상 자체가 달랐습니다.

3. 무엇이 달라져야 하는지를 먼저 정해야 합니다. 첫 짐작은 위치가 맞았습니다. 그런데 "에러가 나는지"만 보고 버렸습니다. 실제 영향은 에러가 아니라 꾸미기 파일이 어디에 실리느냐였습니다. 무엇을 볼지 정하지 않으면 맞는 짐작도 버립니다.

4. 서버가 안 주는 값을 "항상 온다"고 적어 두면 안 됩니다. 그렇게 적힌 곳이 이 응답 하나에서 세 군데 나왔습니다. 사실대로 고치면 도구가 나머지 빠진 곳을 찾아 줍니다.

5. 목록을 잘라 놓고 판단하지 않습니다.

6. 편하라고 자동으로 채워 주는 값이 뜻을 조용히 바꿀 수 있습니다. 사람이 직접 고르게 두는 편이 안전합니다.