Skip to content
isdnetworks
Go back

직접 만들었는데 이미 방식이 있었다

Makefile 빌드 설정에 서버 주소와 키 값이 박혀 있었다. 환경별로 다른 값을 넣으려고 방법을 만들었는데 만들고 나서 그 도구에 이미 그 기능이 있다는 것을 알았다.

Table of contents

Open Table of contents

직접 만든 방법

파일을 두 벌 두고 빌드 전에 복사하는 방식이었다.

config.dev.h
config.prod.h
#!/bin/sh
ENV=${1:-dev}
cp "config.${ENV}.h" config.h
make

cp 로 덮고 make 를 부르는 몇 줄이라 돌긴 하는데 몇 가지가 걸렸다.

config.h 가 빌드마다 덮인다. 버전 관리에서 계속 변경으로 잡힌다
어느 환경으로 빌드했는지 결과물만 보고는 모른다
값이 하나 늘면 파일 두 벌을 다 고쳐야 한다

표준 방식이 있었다

문서를 다시 읽어 보니 Makefile 에서 -D 로 값을 정의할 수 있었다.

LOCAL_CFLAGS += -DSERVER_URL=\"$(SERVER_URL)\"
$ make SERVER_URL=https://dev.example.com

코드에서는 그냥 쓴다.

const char* url = SERVER_URL;

cp 로 파일을 복사할 필요가 없고 make 명령에 값을 준다.

왜 몰랐나

찾아보지 않고 만들었다. 환경별로 다른 값을 넣는다는 것은 흔한 요구이고 make 같은 도구에는 방법이 있을 가능성이 높다.

만들기 전에 물어볼 것을 정했다.

1. 이 요구가 흔한가? → 흔하면 방법이 있을 가능성이 높다
2. 도구 문서에 관련 항목이 있나?
3. 같은 도구를 쓰는 다른 프로젝트는 어떻게 하나?

3번이 특히 빨랐다. 사내 다른 프로젝트를 보니 이미 그 방식을 쓰고 있었다.

이름을 몰라서 문서 검색이 안 될 때 실제 사례가 그 이름을 알려 준다. svn 에서 몇 개를 받아 빌드 스크립트에 grep 을 걸면 어떤 인자를 주고 있는지가 바로 나온다.

만드는 데 걸린 시간보다 찾는 데 걸리는 시간이 훨씬 짧았다.

옮기는 것도 일이었다

이미 만든 것을 옮길지 판단했다. 값이 다섯 개고 쓰는 곳이 열 몇 곳이라 옮기는 데 반나절쯤 걸린다.

옮기기로 했고 이유는 -D 로 넘길 값이 계속 늘 것이라서다. 지금 다섯 개인데 열 개가 되면 파일 두 벌 관리가 더 번거로워진다.

앞으로 늘어날 것인지가 판단 기준이었다. 안 늘어날 것이면 그냥 뒀을 것이다.

검증 — 기본값과 빌드 스크립트

값을 안 주고 빌드하면 어떻게 되는지 정했다.

SERVER_URL ?= https://dev.example.com
API_KEY    ?=

SERVER_URL 은 개발 서버가 기본이라 안전한 쪽이다. API_KEY 는 기본값이 없고 없으면 빌드가 실패하게 했다.

ifeq ($(API_KEY),)
$(error API_KEY 를 지정하십시오)
endif

빠뜨리면 안 되는 값은 기본값을 안 두고 실패시킨다. 기본값이 있으면 안 넣은 것을 모르고 넘어간다.

어느 환경으로 빌드했는지 알 수 있게도 했다.

const char* BUILD_ENV = SERVER_URL;

실행하면 BUILD_ENV 가 어느 서버를 보는지 알려 준다. 운영 빌드인 줄 알았는데 개발 서버를 보고 있는 경우를 잡았다.

make 인자를 매번 손으로 치면 오타가 나므로 빌드 명령도 스크립트로 남겼다.

# build-dev.sh
make SERVER_URL=https://dev.example.com API_KEY="$DEV_API_KEY"

# build-prod.sh
make SERVER_URL=https://api.example.com API_KEY="$PROD_API_KEY"

API_KEY 는 환경 변수에서 받고 스크립트에 값을 안 적었다. 이 스크립트는 버전 관리에 넣고 키가 든 환경 파일은 안 넣었는데 스크립트가 저장소에 올라가므로 키가 그 안에 있으면 이력에 그대로 남는다.

정리


Share this post on:

Previous Post
도메인을 옮겨 다녔다
Next Post
문서 없는 장비 프로토콜 읽기