티스토리 뷰

 

이번 포스팅에서는 퍼포스 스트림에 대해서 살펴보도록 하겠습니다. 버전 관리 도구의 대표 주자 중 하나로써 Git과 자주 비교되는데요. 퍼포스에는 많은 기능이 있지만, 본 포스팅에서는 핵심 기능 중 하나인 스트림(Stream)에 대해서 살펴보겠습니다.

 

본 문서에서는 스트림에 대한 실무에서 사용하는 내용들(스트림 생성하기, 특정 스트림에서 분기하기 등)을 포함하지 않으며, 이론적인 부분에 대한 이해를 돕고자 작성되었으니 참고하시기 바랍니다. 해당 내용에 대한 도움을 필요로 하시는 분은 아래 링크를 참고하시기 바랍니다:

 

About streams

About streams Helix Server streams provide an approach to managing bodies of related files, such as codelines. Streams associate these files with rules that define how users can work with those files, including how users can move changes between them. Stre

www.perforce.com

 

 

 

사전지식


퍼포스 스트림에 대해 조사를 하면서 느낀 것은 아무래도 퍼포스가 일반인에게 접근성이 높은 도구가 아니기 때문에 문서 역시 공식 문서 위주로 의존할 수 밖에 없다는 사실입니다. git을 알고 계신 분이라면 쉽게 적응하시겠지만, 버전 관리 툴을 처음 접하시는 분들도 쉽게 스트림을 이해할 수 있으려면 관련된 용어에 대한 설명이 필요하다고 생각했습니다.

 

게다가 퍼포스 자체가 오래된 역사를 지녔기 때문에 퍼포스의 발전 과정에서 새로 정의되는 용어들과 기존에 사용되던 용어들이 문서에 혼재되어서 직관적 이해를 어렵게 만드는 느낌을 받았습니다(예를 들어, 퍼포스 문서에서는 스트림을 설명할 때 classic branch, codeline 등의 내용들이 자주 포함됩니다). 따라서 본 섹션에서는 퍼포스 스트림에 대한 설명을 하기 전에 알아두면 좋은 용어들이나 배경들을 설명하고자 합니다.

 

 

코드라인

코드라인이라는 용어는 일반적으로 소프트웨어 어플리케이션 또는 어플리케이션 구성 요소의 서비스 기간 동안 함께 발전하는 파일 그룹을 의미합니다. 코드라인에는 어플리케이션을 생성하는 데 필요한 소스 코드, 빌드 스크립트, 이미지, 컴파일된 코드 및 기타 파일들이 포함될 수 있습니다.

하지만 이 개념은 개발 프로젝트 외적 컨텍스트의 의미를 지니기도 합니다. 대부분의 프로젝트에서 함께 발전하는 파일들의 묶음으로도 설명할 수 있습니다. 일반적으로 브랜치(branch, 분기)와 동의어로 사용됩니다.

 

그림 1. 코드라인과 통합

 

퍼포스 공식 문서에서 스트림을 설명할 때 스트림만큼이나 자주 나오는 용어인데요. 쉽게 설명하자면 프로젝트의 개발 및 유지보수 과정에서 새로 개발 및 추가하거나 수정되는 파일들의 집합 및 시간에 따른 변화 집합을 의미하는 것 같습니다. git에서 말하는 branch와 유사하다고 볼 수 있겠습니다. 따라서 퍼포스에서도 코드라인을 branch와 동일시하는 것을 볼 수 있습니다.

 

 

Branch(분기)

파일들을 복사함으로써 생성된 관련 파일들의 집합입니다. 관련 파일들의 그룹은 종종 코드라인으로 언급되기도 합니다.

git의 branch와 비슷한 의미로, 특정 코드라인에 영향을 미치지 않도록 특정 관련 파일들을 복사하여 새 코드라인을 생성하는 것을 의미하는 것 같습니다.

 

 

Integrate(통합)

해당 파일의 상위 항목을 보존하기 위해 새 파일을 생성하거나(분기하는 것), 한 파일 세트에서 다른 파일 세트로 변경사항을 전파하는 것을 의미합니다.

기존 코드라인에서 새 코드라인을 생성하거나(분기, branching), 한 코드라인에서 작업한 변경사항(보통 특정 코드라인에서 분기된 코드라인)들을 다른 코드라인(보통 분기되기 전의 코드라인)에 적용하는 것을 의미합니다.

 

 

Merge(병합)

일반적으로 P4Merge와 같은 병합 도구를 사용하여 두 개의 충돌하는 컨텐츠를 단일 파일로 결합하는 과정을 의미합니다. 

쉽게 설명하자면 다음과 같습니다. 다른 사람들과 함께 개발을 하다 보면 내가 A라는 파일을 작업하고 있을 때 다른 사람이 A라는 파일에 대한 추가 작업을 끝내고 코드라인에 통합했을 수 있습니다. 이 경우, 나의 작업이 끝났을 때 코드라인에 통합하고자 하는 경우, 다른 사람이 작업한 내용과 내가 작업한 내용이 달라 충돌이 발생하게 됩니다. 이를 적절히 수정해서 다시 하나의 파일로 합치는 과정을 의미합니다.

 

 

Resolve

두 파일의 개정된 내용을 조정하는 데 사용하는 프로세스입니다. 두 파일 중 하나의 파일 버전을 선택하거나 충돌하는 파일 내용을 병합하여 충돌을 해결하도록 선택할 수 있습니다.

병합에서 든 예시처럼, 두 작업자가 한 파일에 대한 작업을 수행했을 때, 이로 인한 충돌을 해결하는 방법에 대한 내용을 의미합니다. 충돌을 해결하는 방법 중 하나가 병합이 될 수 있습니다.

 

 

 

스트림이란


퍼포스에서는 다양한 경로를 통해 스트림을 다음과 같이 소개합니다:

Helix 서버 스트림은 코드라인과 같은 관련 파일의 본문을 관리하는 접근 방식을 제공합니다. 스트림은 사용자가 파일 간에 변경 사항을 이동하는 방법을 포함하여 사용자가 해당 파일로 작업할 수 있는 방법을 정의하는 규칙으로 이러한 파일들을 연관(assoiciate)시킵니다.
- HelixCore guide(2023.4)
퍼포스 스트림은 Helix Core의 버전 제어(version control)로 분기 및 병합을 수행하는 방법입니다. 스트림을 통해 더 나은 분기와 병합, 동시 개발, 의존성, 기타 일반적인 분기 및 릴리즈 활동을 관리하는 방법이 될 수 있습니다.
- Perforce video tutorial
스트림은 분기 및 병합 작업을 간소화하여 개발 및 릴리즈 프로세스를 자동화하는데 도움을 제공합니다. 이는 분기를 병합할 위치가 궁금한 개발자의 추측 작업을 제거하고, 메인라인과 릴리즈 스트림을 더욱 안정적으로 유지합니다.
- Perforce blog

 

그림 2. 스트림

스트림에 대해 설명하는 공식 문서를 보면 스트림의 목적과 방법에 대한 내용으로 스트림을 설명하고는 있지만, 그래서 스트림이 무엇이다라고 설명하는 부분이 없는 것이 참 아쉬운 것 같습니다. 스트림이라는 것을 통해 분기와 병합을 쉽게하고 파일에 접근하는 것은 알겠지만, 그래서 이게 뭔지를 확실히 얘기해주지는 않습니다.

 

정작 이 부분은 코드라인과 스트림 튜토리얼에서 간략하게 언급하는데요. 다음과 같습니다:

...코드라인과 분기라는 용어를 동의어로 사용합니다. 스트림몇 가지 기능이 추가된 코드라인으로 생각할 수 있습니다.

 

종합해보면 스트림을 다음과 같이 설명할 수 있을 것 같습니다:

스트림은 소프트웨어 어플리케이션 및 그 구성요소(소스 코드, 빌드 스크립트, 이미지, 컴파일된 코드 및 기타 파일 등)이 서비스함에 따라 함께 발전하게 되면서 생기는 코드라인들에 대한 분기 및 병합, 충돌 해결 기능 및 기타 추가 기능들을 제공함으로써 개발 및 릴리즈 프로세스를 자동화하는 도구

 

여기서 말하는 기타 추가 기능들은 다음을 의미하는 것이 아닐까 생각됩니다:

  • 코드라인에는 존재하지 않는 스트림 유형 지정(주요 목적에 따른 코드라인의 분류)
  • 스트림 내 메타데이터 정보를 통해 스트림간의 관계를 볼 수 있고, 변경사항을 전파하는 방법에 대한 지침 제공

 

여러분들이 스트림에 대한 제 임의의 정의에 동의하실지는 모르겠습니다만, 이렇게 해석함으로써 스트림이 무엇인지 명확히 할 수 있을 것으로 생각됩니다.

 

 

 

부모 스트림과 자식 스트림


앞선 사전준비 섹션에서 코드라인과 분기에 대해서 설명했습니다. 어플리케이션을 개발하다 보면 다양한 이유로 분기를 수행하게 되는데, 스트림에서는 새 스트림을 정의하여 분기하게 됩니다.

 

이 때, 스트림으로부터 분기된 스트림은 기존 스트림의 자식이 됩니다. 반대로, 분기된 스트림의 소스는 분기된 스트림의 부모 스트림이 됩니다. 기존 스트림에서 새 자식 스트림을 생성하면 기본적으로 부모 스트림에 포함된 일부 속성(부모 스트림에 포함된 파일 범위에 대한 정의 등)들을 자동으로 상속하게 됩니다.

 

 

 

스트림 유형


퍼포스의 스트림은 5가지 유형의 스트림을 제공하는데 다음과 같습니다:

  • 메인라인(Mainline)
  • 릴리즈(Release)
  • 개발(Development)
  • 작업(Task)
  • 가상(Virtual)

 

이 중, 메인라인, 릴리즈, 개발 스트림 유형은 일반적인 스트림 유형으로 다음과 같이 설명할 수 있습니다:

메인라인 유형은 최상위 스트림으로써 부모가 없는 스트림입니다. 스트림 시스템의 안정적인 트렁크로써 사용되며, 덜 안정적인 자식 스트림에서 복사하고, 수정된 내용을 자식 스트림으로부터 병합할 것으로 예상됩니다. 
릴리즈 유형은 부모 스트림보다 더 안정적인 스트림으로 지속적인 안정화, 버그 수정, 릴리즈 유지 관리에 유용한 유형입니다. 
개발 유형은 부모 스트림보다 덜 안정적인 스트림으로, 장기 프로젝트 및 주요 새 기능 개발에 유용합니다. 부모 스트림으로 병합하거나 하위 스트림에서 복사할 것으로 기대되는 스트림입니다.

 

여기에 특별한 두 가지 스트림 유형은 다음과 같습니다:

작업 유형은 전체 프로젝트 분기의 작은 부분에 영향을 미치는 작업에 사용할 수 있는 경량(light-weighted)의 단기 분기입니다. 작업 스트림을 사용함으로써 비공개로 작업하고, 컨텍스트를 빠르게 전환하고, Helix Server에서 관리하는 메타데이터 양을 줄일 수 있습니다.
가상 유형은 사용자에게 실제 스트림의 작업 공간 보기를 제한하는 기능을 제공함으로써 필터 역할을 합니다. 유용한 상황은 다음과 같습니다:
 - 변경사항을 스트림에 직접 제출하지만 스트림 보기의 모든 파일을 작업공간에 동기화하고 싶지 않을 때
 - 동일한 스트림으로 개발하지만 임포트되는 라이브러리들을 변경하고자 할 때(예를 들어, 멀티플랫폼 개발)

 

일반적으로 메인라인, 릴리즈 및 개발 유형을 자주 사용하게 되므로 작업 유형을 사용하게 될 경우 다음 링크를, 가상 유형을 사용하게 될 경우 다음 링크를 참고하시기 바랍니다.

 

 

 

메인라인 모델


그림 3. 메인라인 모델

 

퍼포스에서는 스트림을 통한 프로젝트 관리/운용에서 메인라인 모델을 제시하고 있는데요, 메인라인 모델에 대한 설명은 다음과 같습니다:

소프트웨어 구성 관리의 메인라인 모델은 스트림 컨텐츠의 안정성을 기반으로 하여, 가장 부드러운(불안정하거나 실험적인) 것부터 가장 견고한(높은 퀄리티에 릴리즈가능한) 안정성으로의 스트림 계층구조(stream hierarchy)를 정의합니다.일반적으로 메인라인은 상당히 안정적이어야 하며(예를 들면, 코드 빌드가 가능해야함) 개발 유형의 코드라인은 덜 안정적일 수 있으며, 릴리즈 유형의 코드라인은 가장 안정적이어야 합니다.

 

 

메인라인 모델과 스트림 유형을 적절하게 사용하게 됨으로써 발생할 수 있는 워크플로우는 다음과 같습니다:

  • non-stream 메인라인을 stream 메인라인에 복사
  • stream 메인라인, 또는 메인라인의 자식 스트림에서 개발 기능 구현
  • non-stream 메인파인에서 stream 메인라인으로 버그 수정 및 릴리즈 후 변경사항 병합
  • stream 메인라인에서 새로운 릴리즈 스트림 분기

 

 

물론 여러분들이 새로운 분기 전략을 수립하고 싶다면 꼭 메인라인 모델을 따르지 않아도 됩니다. 다만 메인라인 모델이 일반적인 코드라인 모델 중 하나로 퍼포스가 제시하고 있을 뿐이니 참고하시기 바랍니다.

 

 

 

레퍼런스


ICARUS - Perforce(P4V) Stream(스트림)
어떻게 남던 괜찮아 - P4 Stream을 사용하는 이유(퍼포스 스트림)
PERFORCE - Codeline Management
PERFORCE - Codelines, Branching and Streams
PERFORCE - Codelines and Streams
PERFORCE - Streams Overview
HelixCore - 스트림 정보
PERFORCE - What Is Perforce Streams?
PERFORCE - How to Use Perforce - Stremas 101

 

댓글