앱 템플릿 자동 생성 스크립트 적용기
계기
개인적으로 하고 싶은 프로젝트들이 많아져서, 공통적으로 쓰이는 로직을 자주 쓰게 되었다.
`ResourceHelper`,`Logger`등 반복적으로 쓰이는 로직들을 작성 및 복붙 하면서 "귀찮다"라는 생각을 하게 된다.
프로젝트 세팅은 항상 설레는 일이지만 이런 것들이 의욕을 살짝 저하시킨다.
물론 사용해야할 기술이 정해져 있는 것도 아니고, 각 프로젝트마다 기술의 채택 방식 이유가 다 있어야 하지만, 내가 하고자 하는 건 흔히 말하는 양산형(?) 프로젝트이기 때문에 템플릿을 만들기로 결심했다.
나는 '딸깍'으로 앱 초기세팅을 마무리하고 싶다.
이것이 나의 목표이다.
템플릿 만들기
자주는 코드를 토대로 템플릿을 만든다.
모듈 구조는 대략적으로 아래와 같이 가져가기 때문에 아래 구조를 가지고 기본 템플릿을 만들었다.
..
└── template
├── app
├── core
├── data
├── domain
└── presentation
이렇게 만든 템플릿을 깃허브 개인 레포에 올렸다.
필요할 때마다 클론하면 된다
git clone ..
이것도 딸깍이다.
하지만 이렇게 하면 모듈 이름이 그대로 남아서 별로 끌리지 않는다.
스크립트를 작성해서 맞춤형으로 만들어보자
스크립트 작성
흐름
흐름은 다음과 같다.
클론 후 템플릿을 복사하고, 모듈 이름을 치환하고 원하는 디렉토리로 복사한다. 그리고 깃 초기화를 한다.
이때 나는 인자로 브랜치 이름을 받아서 브랜치 상황마다 필요한 템플릿을 받을 것이다.
파일 세팅
`newapp` 으로 간단하게 지었다.
원하는 폴더안에 `newapp [앱이름] [패키지 이름]` 만 적으면 복사가 가능하도록 설정했다.
랩탑이 mac이기 때문에 ~/scripts 파일 안에 두고, PATH에 추가하면 아무 데서나 사용할 수 있도록 했다.
여러 템플릿을 사용하기 위해 브랜치를 옵션으로 받았다. (예) main 브랜치는 기본 템플릿, retrofit 브랜치에는 retrofit 세팅되어있는 템플릿 등으로 활용
#!/bin/bash
# export PATH="$HOME/scripts:$PATH"
# 사용법: newapp [앱이름] [패키지 이름] [--branch 브랜치명]
TEMPLATE_REPO="$템플릿 레포"
NEW_APP_NAME=$1
NEW_PACKAGE=$2
BRANCH_NAME="main" # 기본 브랜치 설정
# --- 옵션 파싱 ---
shift 2
while [[ $# -gt 0 ]]; do
case $1 in
--branch)
BRANCH_NAME="$2"
shift 2
;;
*)
echo "⚠️ 알 수 없는 옵션: $1"
shift
;;
esac
done
..중략..
# --- 인자 확인 ---
if [ -z "$NEW_APP_NAME" ] || [ -z "$NEW_PACKAGE" ]; then
echo -e "${RED}❗ 사용법: newapp <앱이름> <패키지명> [--branch 브랜치명]${NC}"
exit 1
fi
if [ -d "$NEW_APP_NAME" ]; then
echo -e "${RED}❌ '$NEW_APP_NAME' 디렉토리가 이미 존재합니다.${NC}"
exit 1
fi
..
디렉토리 설정 및 클론
패키지 이름을 치환하기 위해서는 템플릿 이름을 미리 설정해 두어야 한다.
그리고 인자로 받은 패키지 이름에서 디렉토리 구조로 파싱 했다.
그리고 위에서 설정했던 템플릿 레포에서 클론을 받는다.
OLD_APP_NAME="$템플릿이름"
OLD_PACKAGE="$템플릿패키지"
OLD_PACKAGE_DIR="$템플릿패키지디렉토리"
NEW_PACKAGE_DIR=$(echo "$NEW_PACKAGE" | tr '.' '/')
# --- 템플릿 클론 ---
echo -e "${BOLD}📥 템플릿 복사 중...${NC}"
git clone "$TEMPLATE_REPO" "$NEW_APP_NAME" || exit 1
cd "$NEW_APP_NAME" || exit 1
문자열 치환 및 소스 복사
모든 모듈의 이름을 치환했다.
예를 들면 `import com.example.application.core.common.base` 이런 코드들도 다 고치도록 했다.
또한 `build.gradle.kts` 의 `namespace`, `applicationId` 나 `setting.gradle.kts`의 루트 프로젝트 이름까지 수정했다.
(예시)
# --- 문자열 치환 ---
echo -e "${BOLD}🛠️ 패키지 및 앱명 치환 중...${NC}"
find . -type f \( -name "*.kt" -o -name "*.java" -o -name "*.xml" -o -name "*.gradle*" -o -name "*.md" -o -name "settings.gradle.kts" \) \
-exec sed -i '' "s/$OLD_PACKAGE/$NEW_PACKAGE/g" {} +
find . -type f \( -name "*.kt" -o -name "*.java" -o -name "*.xml" -o -name "*.gradle*" -o -name "*.md" -o -name "settings.gradle.kts" \) \
-exec sed -i '' "s/$OLD_APP_NAME/$NEW_APP_NAME/g" {} +
# --- 메인 소스 복사 ---
echo -e "${BOLD}📁 메인 소스 복사 시작...${NC}"
if [ -d "app/src/main/java/$OLD_PACKAGE_DIR" ]; then
mkdir -p "app/src/main/java/$NEW_PACKAGE_DIR"
cp -R "app/src/main/java/$OLD_PACKAGE_DIR/"* "app/src/main/java/$NEW_PACKAGE_DIR/" 2>/dev/null
rm -rf "app/src/main/java/$OLD_PACKAGE_DIR"
echo -e "${GREEN}✅ 메인 코드 복사 완료${NC}"
else
echo -e "${RED}❌ 메인 소스 없음: $OLD_PACKAGE_DIR${NC}"
fi
결과
이렇게 해서
평균 1시간 정도 걸리던 프로젝트 세팅을 30초 만에 끝낸다.
귀찮은 건 못 참아!