1. 서론

로컬에서 개발한 프로젝트를 GitHub에 올려서 원격 저장소에서 관리하는 방법을 알아봅니다. GitHub는 버전 관리와 협업을 위한 중요한 도구로, 프로젝트를 원격에서 안전하게 관리할 수 있게 해줍니다. 이 글에서는 로컬 Git 저장소를 GitHub에 연결하고, 소스 코드를 푸시하는 방법을 단계별로 안내합니다.


2. Git 설치 확인하기

GitHub에 프로젝트를 올리기 전에, 먼저 Git이 로컬에 설치되어 있는지 확인해야 합니다. 터미널 또는 명령 프롬프트에서 아래 명령어를 입력하여 Git이 설치되어 있는지 확인할 수 있습니다.

git --version
 

설치된 Git 버전이 출력되면, Git이 정상적으로 설치된 것입니다. 만약 "command not found" 또는 유사한 메시지가 나타난다면, (https://git-scm.com/)에서 Git을 설치한 후 다시 시도하세요.


3. 로컬 Git 저장소 초기화하기

GitHub에 프로젝트를 푸시하려면, 먼저 로컬 프로젝트에서 Git 저장소를 초기화해야 합니다. 프로젝트 디렉토리에서 다음 명령어를 실행합니다.

git init
 

이 명령어는 해당 폴더를 Git 저장소로 설정합니다. 이제 로컬 저장소에서 Git을 사용할 준비가 되었습니다.


4. GitHub에서 Repository 생성하기

GitHub에서 새 저장소를 만들어야 합니다. GitHub에 로그인한 후, + 버튼을 클릭하고 **"New repository"**를 선택합니다. 이후 Repository name을 입력하고 Create repository를 클릭합니다. 새로 생성된 GitHub 저장소의 HTTPS URL을 복사합니다.


5. 원격 저장소 연결하기

로컬 Git 저장소와 GitHub 저장소를 연결하려면, GitHub에서 복사한 원격 저장소 URL을 사용합니다. 터미널에서 아래 명령어를 실행하세요:

 

이제 로컬 저장소는 GitHub의 원격 저장소와 연결되었습니다.


6. 변경 사항 추가 및 커밋하기

로컬에서 변경한 파일을 Git에 추가하고 커밋합니다. 변경된 파일을 모두 추가하려면 git add . 명령어를 사용하고, 커밋 메시지를 입력하여 커밋을 완료합니다.

 
git add . git commit -m "Initial commit"

7. GitHub에 푸시하기

로컬 저장소의 내용을 GitHub에 푸시하려면, 아래 명령어를 실행하여 원격 저장소에 파일을 업로드합니다.

git push -u origin master

 

1. 서론

GitHub에 프로젝트를 올릴 때, 임시 파일이나 빌드 파일 등 불필요한 파일들이 함께 올라가는 경우가 많습니다. 이런 파일들은 프로젝트에 필요하지 않으며, GitHub의 저장소 공간을 차지할 뿐만 아니라 협업 시 불필요한 혼란을 초래할 수 있습니다. 이 문제를 해결하는 방법은 바로 .gitignore 파일을 활용하는 것입니다.


2. .gitignore란?

.gitignore 파일은 Git에게 어떤 파일을 추적하지 않을지 지정하는 설정 파일입니다. 이 파일을 사용하면, 특정 폴더나 파일을 Git의 버전 관리에서 제외시킬 수 있습니다. 이를 통해 프로젝트에 불필요한 파일이 GitHub에 올라가지 않도록 할 수 있습니다.


3. .gitignore 파일 생성하기

프로젝트 루트 디렉토리에서 .gitignore 파일을 생성한 후, 제외할 파일들을 지정합니다. 예를 들어, Gradle을 사용하는 경우 build/나 .gradle/ 같은 파일들이 불필요하게 포함될 수 있습니다. 이를 .gitignore에 추가하려면 다음과 같은 내용으로 파일을 작성하면 됩니다.

# Gradle 관련 파일 제외
.gradle/
build/
gradle-wrapper.jar
gradle-wrapper.properties

 


4. 이미 Git에 추가된 파일 제거하기

.gitignore 파일을 추가하더라도 이미 Git에 추가된 파일들은 계속 추적될 수 있습니다. 이 경우, git rm --cached 명령어로 Git에서 해당 파일들을 제거해야 합니다.

 
git rm -r --cached .gradle
git rm -r --cached build

5. 변경 사항 커밋하고 푸시하기

이제 .gitignore 파일을 추가하고 불필요한 파일을 제거한 후, 변경 사항을 커밋하고 GitHub에 푸시하면 됩니다.

 
git add .gitignore
git commit -m "Add .gitignore to exclude Gradle files"
git push origin master

6. 결론

.gitignore 파일은 Git과 GitHub에서 효율적인 버전 관리를 위해 꼭 필요한 도구입니다. 프로젝트의 불필요한 파일들을 제외시킴으로써, 저장소가 깔끔해지고 협업이 원활해집니다. 이제 GitHub에 파일을 푸시할 때마다 .gitignore를 활용하여, 필요한 파일만 관리할 수 있게 되었습니다.

프로젝트를 처음 시작할 때, 저는 두 가지 선택지 사이에서 고민을 했습니다.

  1. Spring Initializr를 통해 기본적인 Spring Boot 프로젝트 구조를 바로 생성하는 방법
  2. gradle init을 통해 생성된 템플릿을 바탕으로 직접 build.gradle 파일을 작성하고, 디렉터리 및 파일 구조를 커스터마이징하는 방법

결국, 저는 직접 build.gradle을 작성해보며, 프로젝트의 이름 변경, 파일 이름 수정(예: app.java → Application.java) 등 세세한 부분까지 컨트롤하는 방식으로 진행하기로 했습니다.

 


 

프로젝트 폴더 및 파일 커스터마이징

디렉터리 구조 재구성

gradle init으로 생성된 기본 템플릿은 보통 아래와 같은 구조를 가지고 있었습니다:

my-project-001/
 ├── app/                  ← 기본 템플릿의 서브 디렉터리
 ├── build.gradle
 └── settings.gradle
 

하지만 Spring Boot 표준 구조는 다음과 같아야 합니다:

 

my-project-001/
 ├── src/
 │    ├── main/
 │    │    ├── java/       ← 실제 소스 코드 (패키지 구조: io/github/devkb)
 │    │    └── resources/  ← 설정 파일 (application.properties 등)
 │    └── test/
 │         └── java/       ← 테스트 코드
 ├── build.gradle
 └── settings.gradle

기존의 app 디렉터리는 삭제(또는 백업)하고, 위와 같은 디렉터리 구조로 직접 생성 및 재구성했습니다.

build.gradle 파일 직접 작성 및 의존성 추가

저는 기존 템플릿에서 제공되는 내용을 참고하여, 필요한 의존성을 추가하고, 플러그인 버전도 업데이트하는 방식으로 build.gradle 파일을 직접 작성했습니다. 예를 들어:

plugins {
    id 'org.springframework.boot' version '2.7.10'   // Spring Boot 버전을 최신 안정 버전으로 업그레이드
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'io.github.devkb'
version = '0.0.1'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    implementation 'org.springframework.boot:spring-boot-starter-mustache'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    implementation('com.h2database:h2:1.4.196')
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

    testImplementation 'org.springframework.security:spring-security-test'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    implementation "io.springfox:springfox-boot-starter:3.0.0"
    implementation "io.springfox:springfox-swagger-ui:3.0.0"

}

test {
    useJUnitPlatform()
}

파일 및 패키지명 수정

  • 프로젝트 이름 변경:
    settings.gradle 파일에서 rootProject.name = 'first-prj'와 같이 지정했던 것을 확인하고, 실제 폴더명과 일치하도록 변경했습니다.
  • 파일명 수정:
    기본 템플릿에서 생성된 app.java 파일의 이름을 오타 없이 Application.java로 변경하여, Spring Boot 애플리케이션의 진입점이 올바르게 작동하도록 했습니다.

3. 빌드 및 오류 대응

커스터마이징 과정 중 여러 오류가 발생했습니다.
예를 들어,

  • 버전 카탈로그 관련 오류:
    libs 프로퍼티가 정의되지 않아 생기는 문제는 직접 의존성을 명시하는 방식으로 해결했습니다.
  • 플러그인 호환성 문제:
    Gradle 8.12.1 환경에서 발생한 내부 API 오류는 Spring Boot 플러그인을 최신 안정 버전으로 올림으로써 해결했습니다.

  • 프로젝트 디렉터리 불일치 문제:
    settings.gradle 파일과 실제 소스 위치가 다를 때 발생하는 오류는, 디렉터리 구조를 재정리하여 모두 같은 루트 디렉터리 내에 위치하도록 수정했습니다.

 


4. 최종 정리 및 연동

모든 수정 작업 후, 다음과 같은 절차로 프로젝트를 정리했습니다.

 

./gradlew clean build
./gradlew bootRun

+ Recent posts