[개발] 로컬 개발 환경 구축

김종준·2023년 8월 6일
1

Hiit

목록 보기
5/12
post-thumbnail

로컬 개발 환경 구축


관련 코드 바로가기


최근 현직자들이 포함된 팀에서 애플 로그인 기능을 담당하여 개발할 기회가 있었습니다. (해당 작업 PR)

그렇기에 지금 작성하는 코드는 해당 프로젝트에서 많은 영향을 받고 있습니다.

해당 개발을 하며 현직자분들과 이야기를 하며 느낀 것은 생각보다 개발에 들어가기 전에 준비해야 할 것이 많다는 것입니다.

그래서 이번 글에서는 개발에 들어가기 전에 준비해야 할 로컬 개발 환경 구축을 위한 설정을 소개해 보려 합니다.


로컬 개발 환경?

우선 로컬 개발 환경은 말 그대로 우리가 개발을 진행하는 노트북 환경을 말합니다.

"보통 개발자 노트북에는 IntelliJ, MySql, Java, Git 이런 것들이 다 설치되어 있을 텐데 어떤 환경을 구축한다는 거지?"라는 생각을 할 수 있습니다.

저 또한 그러하였습니다.

하지만 생각해 보면 모든 개발자 노트북에 설치되어 있는 MySql 버전이 동일할까요?

Java 버전은요? 다른 것들도 모두 버전까지 동일할까요?

동일하다면 해당 프로그램들의 설정은 동일할까요? 아마 그러지 않을 가능성이 큽니다.

함께 개발을 진행할 때는 그러한 것들을 모두 통일 시켜줄 필요가 있고 그렇기에 로컬 개발 환경 구축이 필요합니다.


docker-compose

이번 로컬 개발 환경 구축에는 docker-compose를 활용하였습니다.

docker-compose란, 시스템 구축과 관련된 명령어를 하나의 정의 파일에 기재해 명령어 한 번에 시스템 전체를 실행하고 종료와 폐기까지 한 번에 하도록 도와주는 도구입니다.

이번에 저는 docker를 정말 개발 환경을 위한 "도구"로 사용하여 docker에 대한 이야기보다는 docker를 어떻게 활용하였는지에 집중하여 글을 작성해 보겠습니다.


MySQL & Adminer

MySQL과 Adminer를 docker를 통해 설치 및 실행할 수 있도록 구성하여 로컬 개발 환경을 통일하였습니다.

해당 설정은 다음과 같습니다.

version: '3.1'
services:
  hiit-mysql:
    container_name: hiit-mysql8
    image: mysql/mysql-server:8.0.27
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_ROOT_HOST=%
      - TZ=Asia/Seoul
    command: [ "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci", "--lower_case_table_names=1", "--max_connections=2048", "--wait_timeout=3600" ]
    ports:
      - "13306:3306"
    volumes:
      - ./mysql-init.d:/docker-entrypoint-initdb.d

  hiit-adminer: # mysql web admin
    container_name: hiit-adminer
    image: adminer:4
    ports:
      - "18080:8080"
    environment:
      - ADMINER_DEFAULT_SERVER=hiit-mysql8
      - ADMINER_DESIGN=nette
      - ADMINER_PLUGINS=tables-filter tinymce

Adminer의 경우 익숙하지 않을 수 있습니다.

Adminer은 주석에도 나와 있듯이 웹에서 MySQL을 관리할 수 있도록 도와주는 도구입니다.

MySQL 관리를 도와주는 도구로는 Workbench, DataGrip과 같은 도구가 있습니다.

물론 해당 도구를 사용할 수 있지만 그러기 위해서는 추가적인 설정을 할 필요가 있습니다.

하지만 Adminer은 웹 기반이어서 설치할 필요도 없고 또 위의 docker 설정은 설정 시 Adminer와 MySQL과 연결하여 추가적인 설정이 필요하지 않다는 장점이 있습니다.


위에 보이는 설정 파일 외에도 추가적인 파일 외에도 몇몇 추가적인 파일이 더 필요한데 해당 파일에 대해서는 링크로 대체하겠습니다.


Lint

lint는 간단히 말하면 개발자마다 다를 코드 작성 스타일을 통일 시켜주는 도구입니다.

이번 프로젝트에서는 lint를 spotless라는 플러그인을 통하여 구축하였습니다.


plugins {
    id "com.diffplug.spotless" version "${spotlessVersion}"
}
spotless {
    java {
        importOrder()
        removeUnusedImports()
        trimTrailingWhitespace()
        googleJavaFormat('1.15.0')
        indentWithTabs(2)
        endWithNewline()
        target 'src/*/java/**/*.java'
    }

    format 'misc', {
        target '**/*.gradle', '**/*.md', '**/.gitignore'
        targetExclude '.release/*.*'
        indentWithSpaces()
        trimTrailingWhitespace()
        endWithNewline()
    }
}

각 설정에 대한 설명 : https://nesoy.github.io/articles/2020-04/Spotless

위와 같은 설정을 통해 gradle task에 spotless를 만들었습니다.


그리고 해당 task를 커밋전에 적용할 수 있도록 pre-commit을 적용해 주는 gradle task를 아래와 같이 만들었습니다.

tasks.create(name: 'gitExecutableHooks') {
    Runtime.getRuntime().exec("chmod -R +x .git/hooks/");
}

task installGitHooks(type: Copy) {
    from new File(rootProject.rootDir, 'pre-commit')
    into { new File(rootProject.rootDir, '.git/hooks') }
}

gitExecutableHooks.dependsOn installGitHooks
clean.dependsOn gitExecutableHooks
# 변경된 파일들 이름만 추출하여 저장
stagedFiles=$(git diff --staged --name-only)

# SpotlessApply 실행
echo "Running spotlessApply. Formatting code..."
./gradlew spotlessApply

# 변경사항이 발생한 파일들 다시 git add
for file in $stagedFiles; do
  if test -f "$file"; then
    git add "$file"
  fi
done

출처 : https://wnwngus.tistory.com/71

이렇게 pre-commit을 만드는 gradle task를 한 번 실행하면 .git/hooks에 pre-commit이 만들어지고 이후 커밋부터는 spotless가 자동으로 적용됩니다.

이를 통해 코드 작성은 본인 스타일 대로 할 수 있고 커밋 내역은 통일될 수 있는 환경을 구축하였습니다.


마치며

사실 저도 이러한 로컬 환경을 구축하며 개발을 한 지 얼마 되지 않았지만 정말 편리하다는 것을 항상 느낍니다.

마치 유튜브 프리미엄 같은 느낌?

만약 로컬 개발 환경을 구축하여 개발한 경험이 없다면 꼭 한 번 구축하여 개발해 보시는 것을 추천합니다!

감사합니다.

0개의 댓글