GIT 연동

본 장에서는 ProStudio에서 GIT을 연동하여 소스 코드를 형상관리하는 방법에 대해서 설명한다.

1. 개요

ProStudio는 Git 서버와 연동해서 프로젝트에 대해서 형상관리를 할 수 있다. ProStudio와 Git 서버를 연동하기 전에 클라이언트에 Git이 설치되어 있어야 하고 Git 서버에는 repository가 생성되어 있어야 한다. 본 장에서는 ProStudio는 Git 서버와 연동하는 과정과 Git을 사용하는 과정에 발생할 수 있는 상황에 대해서 설명한다. 본 장의 내용을 이해하기 위해서는 Git의 기본적인 동작(add index, commit, push, fetch, pull, reset)에 대해서 미리 숙지해야 한다. (http://rogerdudler.github.io/git-guide/index.ko.html 참고)

ProStudio와 Git 서버를 연동은 다음의 과정으로 진행한다.

Git을 사용해서 여러 개발자가 소스코드에 접근하는 경우 다른 개발자의 소스와 자신이 개발한 소스코드의 내용이 Conflict(충돌)해서 문제가 발생하는 경우가 생길 수 있고, 소스코드에 대한 개발 이력을 추적하는 기능을 사용할 수 있다. 해당 기능에 대한 자세한 내용은 부가 기능을 참고한다.

ProStudio와 Git 서버를 연동하기 전에 ProStudio를 사용할 시스템의 사양과 Git 클라이언트에 환경설정이 되어 있어야 한다. 본 절에서는 연동 전에 준비사항에 대해서 설명한다.

2.1. 시스템 확인

ProStudio 구동 전에 제품을 사용하기 위한 시스템의 최소 요구사항을 확인한다.

시스템 요구사항을 만족할 경우 ProStudio 구동을 위해 JDK를 설정한다. ProStudio 구동 후 DB Connection을 위한 JDBC 설정, ProStudio 메모리 사이즈 등을 설정하여 ProStudio가 무리없이 동작할 수 있는 환경을 구성한다. 시스템 요구사항은 ProObject 설치 안내서의 시스템 요구사항을 참고한다.

2.2. 환경설정

[Window] > [Preferences] 메뉴를 실행해서 Git 관련 환경설정을 한다. Preferences 화면에서 Git 클라이언트에 다음의 사항이 설정한다. 설정은 최초 한번만 설정하면 종료했다가 다시 실행해도 유지된다.

  • Content Type 추가

    [General] > [Content Types]을 선택한 후 Content Type을 추가한다. EMF Comapre을 선택한 후 File associations에 다음과 같은 항목을 추가한다.

    figure emf compare configure
    Git 연동 버전 초기 설정 - Content Type 추가
  • Merge 설정

    [EMF Compare] > [Merge]을 선택한 후 Merge 옵션을 설정한다. Merge 과정에서 Conflict가 발생하는 경우 파일들의 Conflict나지 않은 부분들은 자동으로 병합하는 기능의 사용 여부를 설정한다.

    figure emf compare merge
    Git 연동 버전 초기 설정 - Merge 설정
  • Post Processors 설정

    [EMF Compare] > [Post Processors]을 선택한 후 'EGit Post Processor''Diagram Post Processor' 옵션을 선택한다. 해당 옵션은 Conflict-Merge 과정에서 인덱스 추가까지의 과정을 쉽게 할 수 있도록 지원한다.

    figure emf compare post
    Git 연동 버전 초기 설정 - Post Processors 설정
  • Engines 설정

    [EMF Compare] > [Engines]을 선택한 후 [Conflict] 탭에서 'Scalable Conflit Detector' 체크박스를 선택한다.

    figure emf compare engines
    Git 연동 버전 초기 설정 - Engines 설정
  • Git Synchronize 설정

    [Team] > [Git]> [Synchronize]을 선택한 후 옵션들을 다음과 같이 설정한다.

    figure team git sync
    Git 연동 버전 초기 설정 - Git Synchronize 설정

    'Preferred merge strategy …​' 항목이 Default Strategy로 설정되어 있을 경우 Conflict난 파일에 conflict marker가 표시되어 XML 파일을 에디터로 열 수 없는 문제가 발생하므로 반드시 확인한다.

3. 연동 과정

본 절에서는 ProStudio와 Git 서버를 연동하는 과정에 대해서 설명한다.

3.1. 로컬에 Remote Git Repository 복사

다음의 과정으로 로컬에 Remote Git Repository를 복사한다.

  1. ProStudio의 메뉴에서 [Window] > [Show View] > [Other]를 선택하면 열리는 Show View 화면에서 [Git] > [Git Repository]를 선택한 후 [OK] 버튼을 클릭한다.

    figure git server repo copy 2
    서버에 Git repository 복사 (1)
  2. Git Repository 설정 화면에서 'Clone a Git repository'를 선택한다.

    figure git server repo copy 3
    서버에 Git repository 복사 (2)
  3. Clone Git Repository 화면에서 Git Repository 정보를 입력한 후 [Next] 버튼을 클릭한다. 'URI' 항목은 입력하지 않는다.

    figure git server repo copy 4
    Clone Git Repository (1)

    SSH 프로토콜을 사용해서 Git 서버와 통신하는 경우에는 개인 Key가 서버에 등록되어 있어야 한다. [Windows] > [Preferences] 메뉴를 선택한 후 Preferences 화면에서 [General] > [Network Connections] > [SSH2] 설정에서 private keys에 client id key가 등록되어 있는지 확인할 수 있다.

  4. Clone Git Repository 화면에서 Local Git 저장소 정보를 입력하고 [Finish] 버튼을 클릭하면 저장소가 생성된다. 'Directory' 항목은 'ProStudio의 WorkSpace 폴더 \application명’으로 입력한다.

    figure git server repo copy 5
    Clone Git Repository (2)

3.2. 프로젝트 Git 서버에 복사

다음의 과정으로 새로 생성한 프로젝트를 Git 서버에 복사한다.

  1. 새로운 ProObject 프로젝트를 생성한 후 프로젝트의 컨텍스트 메뉴에서 [Team] > [Share Project..]를 선택한 후 Share Project 화면에서 [Git] 메뉴를 선택한 후 [Next] 버튼을 클릭한다.

    figure project git server copy 2
    프로젝트 Git 서버에 복사 (1)
  2. Configure Git Repository 화면에서 Repository에 clone한 Git repository를 선택하고 [Finish] 버튼을 클릭한다.

    figure project git server copy 3
    프로젝트 Git 서버에 복사 (2)
  3. Git Repository에 프로젝트를 추가한 후 프로젝트의 컨텍스트 메뉴에서 [Team] > [Add to Index]를 선택하면 Git이 프로젝트의 변경을 추적할 수 있다.

    Git 추적을 하지 않아도 되는 폴더의 경우 추적에서 제외할 수 있다. 자세한 내용은 "Git 추적 제외"를 참고한다.

  4. 등록한 정보는 ProStudio 메뉴의 [Window] > [Show View] > [Other…]를 선택한 후 Show View 화면에서 [Git] > [Git Staging] 메뉴를 선택하면 조회할 수 있다. Git Staging View 화면의 Staged Changes에서 Git이 추적하는 파일을 조회할 수 있다.

    또한 Commit Messgae를 입력하고 [Commit and Push] 버튼을 클릭하면 로컬에서 변경한 내용들이 Git 서버에 반영된다.

    figure project git server copy 8
    프로젝트 Git 서버에 복사 (3)

Git 추적 제외

Git이 변경 추적을 하지 않아도 되는 폴더의 경우 다음의 과정으로 예외 처리를 할 수 있다. 다음은 .gen_src 폴더를 추적에서 제외하는 과정에 대한 설명이다.

  1. 프로젝트 폴더 중에 추적하지 않아도 되는 폴더를 선택한 후 Package Exploer에서 [▽](Filters) 버튼을 클릭한다.

    figure project git server copy 4
    Git 추적 제외 (1)
  2. Java Element Filters 화면에서 필터 조건을 설정한다. 예제에서는 '.resources'를 체크박스를 해제한다.

    figure project git server copy 5
    Git 추적 제외 (2)
  3. Package Exploer의 프로젝트 목록에서 .gen_src 폴더를 선택한 후 컨텍스트 메뉴에서 [Team] > [Ignore]를 선택한다. 그러면 .gen_src 폴더는 추적에서 제외된다.

    참고로 그 외 Git 추적에서 제외해야 하는 파일 및 폴더들 목록은 다음과 같다.

    • .gradle

    • .proobject/Entries

    • .settings

    • bin

    • .shared

    • download

    • etc

    • build.gradle

    • gradle.properties

    반대로 최초 프로젝트 생성자가 Git에 push해서 관리해야 한다. 프로젝트 하위의 다음의 파일은 git에 push해서 사용한다.

    • .proobject/Repository

    • .gitignore

    • .project

3.3. Git 서버로부터 프로젝트 import

다음은 Git 서버에 복사한 프로젝트를 Import하는 과정에 대한 설명이다. Git 서버에 프로젝트를 복사하는 방법은 로컬에 Remote Git Repository 복사를 참고한다.

  1. Git repository Working Tree에서 Import할 폴더를 선택한 후 컨텍스트 메뉴에서 [Import Projects]를 선택한다.

    figure git server project import 1
    Git 서버로부터 프로젝트 import (1)
  2. 화면에서 Import할 프로젝트를 선택하고 [Next]을 클릭한다.

    figure git server project import 2
    Git 서버로부터 프로젝트 import (2)
  3. Git으로부터 최초로 import된 프로젝트는 ProObject 프로젝트가 되기 위한 속성이 없으므로 에러가 발생한다. 따라서 ProObject 속성을 추가해야 한다.

    프로젝트 컨텍스트 메뉴에서 [Configure] > [Add ProObject Nature]를 선택한 후 애플리케이션과 서비스 그룹을 선택한 후 [Finish] 버튼을 클릭한다.

    figure git server project import 3
    Add ProObject Nature 화면

4. 부가 기능

본 절에서는 Git에 커밋된 리소스들을 조회하는 방법과 변경 내역을 서버로 저장하는 Push 방법, 소스 내역을 병합하는 방법, 리소스의 이력들을 비교하는 방법에 대해서 설명한다.

4.1. Push

ProStudio 내에서의 변경 내용을 서버에 저장하는 Push할 수 있고 Push 성공 또는 실패(Confilct)된 경우 작업에 대한 결과를 확인할 수 있다. 현재의 변경 내용은 아직 로컬 저장소에 커밋되어 HEAD 안에 머물고 있다면 원격 서버로 올리는 Push 작업을 해야 한다.

다음의 3가지 방법으로 ProStudio에서 소스나 리소스를 Push할 수 있다.

  • ① Package Explorer 영역

    Package Explorer 영역에서 Push할 파일을 선택 후 컨텍스트 메뉴에서 [Team] > [Push to Upsteam]를 선택한다.

    figure git push 1
    ProStudio 내에서 Git Push 방법 (1)
  • ② Git Repositiries 영역

    Git Repositiries 영역에서 Push할 Local Branch 선택한 후 컨텍스트 메뉴에서 [Push to branch]를 선택한다.

    figure git push 2
    ProStudio 내에서 Git Push 방법 (2)
  • ③ Git Staging 영역

    [Git Staging] 탭의 Unstaged Changes에서 Push할 파일을 찾아 Staged Changes로 드래그 앤드 드롭한 후 메시지를 작성한 후 [Commit and Push] 버튼 클릭한다.

    figure git push 3
    ProStudio 내에서 Git Push 방법 (3)

충돌이 없거나 Push가 정상적으로 될 경우 Pushed 메시지를 확인할 수 있다.

figure git push success
Git Push 성공 메시지

기존에 있던 Git 서버의 리소스를 최신으로 Pull을 하지 않고 변경을 하고 Push하는 경우 Conflict(충돌)이 발생해서 rejected 메시지가 화면에 표시된다. 이 경우의 다른 사람의 수정 내역과 자신의 수정 내역을 비교해서 소스를 통합해야 한다. 자세한 내용은 Conflict된 소스 통합을 참고한다.

figure git push rejected
Git Push 실패 메시지

4.2. Conflict된 소스 통합

동일한 소스를 여러 개발자가 수정한 경우 각 개발자가 수정한 내역이 Conflict하는 경우가 발생한다. 소스의 수정 내역이 Conflict된 경우 다른 사람의 수정 내역과 자신의 수정 내역을 비교해서 소스를 통합해야 한다.

다음은 소스에 Conflict이 발생한 경우 Conflict 발생한 부분을 비교하고 merge하는 방법에 대한 설명이다.

  1. 테스트할 A WorkSpace와 연결된 Git 클라이언트가 아닌 다른 Git 클라이언트에 연결된 B WorkSpace에서 비즈니스 오브젝트를 변경한 후에 컨텍스트 메뉴에서 [Team] > [Commit]을 선택한다.

  2. Git Staging View 화면에서 커밋할 내용을 확인하고 [Commit and Push] 버튼을 클릭한다.

    figure git merge tool 2
    Git push - 소스 Conflict 발생 Merge 방법 (1)
  3. A WorkSpace에서도 비즈니스 오브젝트를 변경한 후 Git 서버에 커밋한다(위의 1, 2번 과정 참고).

    다음은 Git 서버에서 Pull을 하지 않은 경우의 예로 pull을 받을 파일이 있는 상황에서 push를 하면 push가 되지 않으므로 Package Exploer에서 프로젝트의 컨텍스트 메뉴에서 [Team] > [Pull]을 선택해서 Pull을 먼저 수행한다.

    figure git merge tool 3
    Git push - 소스 Conflict 발생 Merge 방법 (2)
  4. 서로 다른 Git 클라이언트에서 동시에 변경된 파일이 있는 경우 다음과 같이 Pull 과정에서 에러가 발생한다.

    다음은 Conflict(충돌)이 발생하여 에러가 발생하는 경우의 예로 Conflict 상태의 리소스는 Package Exploer 또는 Synchronize View에서 확인이 가능하다.

    figure git merge tool 5
    Git push - 소스 Conflict 발생 Merge 방법 (3)
  5. Package explorer에서 Conflict 상태의 리소스를 선택한 후 컨텍스트 메뉴에서 [Branch, Tag, or Reference] > [Compare With]를 클릭한다.

    Compare 화면의 메뉴에서 [Remote Tracking]을 선택하면 서버의 리소스와 비교할 수 있다.

    figure git merge tool 7
    Git push - 소스 Conflict 발생 Merge 방법 (4)
  6. 서버의 리소스와 Java 소스 기준으로 비교된 상태이다.

    figure git merge tool 9
    Git push - 소스 Conflict 발생 Merge 방법 (5)

    비교한 소스의 내용 중에 Conflict된 부분을 에디터에서 수정하고 저장한다.

    figure git merge tool 10
    Git push - 소스 Conflict 발생 Merge 방법 (6)
  7. Conflict이 발생된 부분을 수정한 후 파일을 [Commit and Push] 버튼을 클릭해서 서버에 Push한다.

    figure git merge tool 11
    Git push - 소스 Conflict 발생 Merge 방법 (7)

4.3. 이력 조회

Package Exploer에서 파일을 선택한 후 컨텍스트 메뉴에서 [Compare With] > [Local history]에서 자신이 이전에 수정한 버전과 비교할 수도 있고 Git과 연계하여 서버 리소스의 변경된 부분을 비교할 수 있다.

4.3.1. Local History와 현재 WorkSpace 파일 비교

다음은 Local History와 현재 WorkSpace 파일을 비교하는 방법이다.

  1. Package Exploer에서 파일을 선택한 후 컨텍스트 메뉴에서 [Compare With] > [Local History]를 선택한 후 Local History 목록에서 비교할 파일을 더블클릭한다.

    figure git history 1
    Local History 소스 비교 (1)
  2. 다음 화면에서 현재 Local의 소스와 특정 commit된 버전을 비교할 수 있다.

    figure git history 2
    Local History 소스 비교 (2)

4.3.2. 커밋된 소스와 현재 WorkSpace 파일 비교

다음은 커밋된 소스와 현재 WorkSpace 파일을 비교하는 방법에 대한 설명이다.

  1. Package Exploer에서 파일을 선택한 후 컨텍스트 메뉴에서 [Compare With] > [Commit...]을 선택한다. Select a Commit 화면의 커밋된 목록에서 비교할 특정 커밋을 선택한 후 [OK] 버튼을 클릭한다.

    figure git history 4
    서버의 Master Branch 소스 비교 (1)
  2. 다음 화면에서 특정 커밋과 현재 리소스를 비교할 수 있다.

    figure git history 5
    서버의 Master Branch 소스 비교 (2)