시험 도메인이 정해져서 소스를 그 서버에 올렸다. 화면은 떴는데 이미지가 전부 운영 쪽을 가리켰다. 로그인도 운영으로 넘어가서 시험 서버에서 로그인하면 운영 계정으로 들어갔다.
Table of contents
Open Table of contents
얼마나 박혀 있는지 셌다
grep 으로 찾아봤다.
$ grep -ro "http://[a-z]*\.example\.co\.kr" --include=*.jsp . | sort | uniq -c
69 http://www.example.co.kr
21 http://static.example.co.kr
13 http://chat.example.co.kr
9 http://cstatic.example.co.kr
6 http://ticker.example.co.kr
다섯 종류에 118곳이었다. JSP 말고 JavaScript 와 CSS 에도 있었다.
한 곳씩 바꾸는 것은 가능하다. 문제는 시험 도메인이 또 바뀌거나 서버가 하나 더 늘면 다시 118곳이라는 것이다.
소스에 있을 이유가 없던 값
왜 절대 주소를 썼는지 보니 이유가 있었다. 정적 파일 서버가 따로 있어서 상대 경로로는 못 가리킨다.
<img src="http://static.example.co.kr/img/logo.png">
/img/logo.png 로 쓰면 지금 도메인에서 찾으니 정적 서버가 다른 도메인이면 안 된다. 절대 주소가 필요했던 것은 맞지만 그 값이 소스에 박힐 필요는 없었다.
값을 설정 파일로 뺐다.
# config.properties
url.www=http://www.example.co.kr
url.static=http://static.example.co.kr
url.chat=http://chat.example.co.kr
JSP 에서 꺼내 쓸 수 있게 요청 시작 시점에 넣어 뒀다.
request.setAttribute("urlStatic", config.get("url.static"));
<img src="${urlStatic}/img/logo.png">
도메인이 바뀌면 설정 파일 한 줄이다.
JSP 만 바꾸면 절반이다. JavaScript 안에도 주소가 있었다.
$.post("http://www.example.co.kr/api/order", ...);
스크립트 파일은 config.properties 를 직접 못 읽으니 화면에서 한 번 내려 주게 했다.
<script>
var APP_URL = {
www: "${urlWww}",
static: "${urlStatic}",
chat: "${urlChat}"
};
</script>
$.post(APP_URL.www + "/api/order", ...);
APP_URL 을 보게 하니 스크립트 파일에는 도메인이 없다. 값은 화면이 정한다.
한꺼번에 바꾸면 놓친다
118곳을 손으로 바꾸는 대신 치환을 돌리려다 멈췄다. 그대로 두면 안 되는 것들이 섞여 있었다.
메일 본문에 들어가는 링크 받는 사람 브라우저에서 열리니 절대 주소가 맞다
외부 결제 창의 복귀 주소 상대 시스템이 부르므로 절대 주소가 맞다
주석 안의 예시 주소 바꿀 필요 없음
절대 주소가 필요한 자리와 아닌 자리를 먼저 갈랐다. 갈라 놓고 보니 절대 주소가 진짜 필요한 곳은 열 몇 곳이었고 그 열 몇 곳도 값은 설정에서 온다.
골라내지 않고 치환했으면 메일 링크가 깨졌을 것이다.
검증 — 남은 것을 막았다
바꾼 뒤에 또 박히는 것을 막으려고 배포 전에 한 번 훑게 했다.
$ grep -rn "http://[a-z]*\.example\.co\.kr" --include=*.jsp --include=*.js . \
| grep -v "^./mail/" \
| grep -v "^./docs/"
걸리는 것이 있으면 배포 전에 보인다. 예외 경로는 명시적으로 뺐다.
이 검사가 정말 잡는지 시험하려고 일부러 한 줄을 넣고 돌렸더니 그 줄이 나왔다. 안 넣으면 아무것도 안 나온다. 검사가 도는 줄 알고 계속 새는 상태를 막는 것이 이 확인이었다.
정리
- 절대 주소를 소스에 박으면 도메인이 바뀔 때 전수 수정이 된다
- 정적 서버가 별도 도메인이면 절대 주소가 필요한 것은 맞다
- 다만 값이 소스에 있을 이유는 없다
- 설정 파일에서 읽어 화면 변수로 넘기면 바뀔 자리가 한 곳이 된다
JavaScript안의 주소는 화면에서APP_URL로 한 번 내려 준다- 절대 주소가 정말 필요한 자리를 먼저 가른다. 메일 본문과 외부 복귀 주소가 그렇다
- 배포 전 검사를 두고 예외 경로는 명시적으로 뺀다
- 그 검사가 실제로 잡는지 일부러 틀린 줄로 확인한다