최근 친구에게서 이런 질문을 받았습니다.
“스마트폰에서 소프트웨어 버전이
X.Y.Z
형태로 표시되던데, 이게 무슨 뜻이야?”
저는 개발자로 일을 하고 있는 덕분에 이러한 버전 관리 방식이 익숙했지만, 친구는 소프트웨어 개발에 대해서는 잘 모르는 상황이라 그 의미를 잘 모르고 있었나 봅니다. 그래서 친구의 눈높이에 맞게 쉬운 설명을 하고 싶었지만, 그 당시에는 적절한 비유를 떠올리지 못해 조금 딱딱한 답변을 하게 되었죠.
그렇게 친구와의 대화를 마치고 나서, 소프트웨어 버전 관리 방법을 비유로 설명할 수 있는 방법은 없을까? 라는 생각이 들었습니다. 그래서 오늘은 소프트웨어 버전 관리, 특히 시맨틱 버저닝 의 동작 방식에 대해 누구나 이해할 수 있도록 쉽게 설명하려고 합니다.
이번 글을 통해 소프트웨어 버전 관리 방법을 이해하고 싶어 하는 비전공자분들에게 도움이 되었으면 좋겠습니다.
원고를 잘 관리할 수 있는 방법
당신은 실력 있는 일식 요리사로, 이번에 자신의 노하우를 담은 요리책을 출간하려고 합니다. 그렇게 출판사와 계약을 맺고 요리책의 초안을 준비하기 시작했죠.
하지만 지금까지 요리만 할 줄 알았던 당신은 책을 출간해 본 경험이 없어서 원고 관리를 어떻게 해야 할지 고민이 많아집니다.
이를 고민하던 중, 원고의 특정 시점 기준으로 버전을 매겨 관리하는 방식이 떠올랐습니다. 바로, 소프트웨어 개발에서 사용하는 방식처럼 X.Y.Z
형태로 표시하는 시맨틱 버저닝을 적용해 보자는 것이죠.
이 시맨틱 버저닝의 자리 수와 순서에는 이름과 의미가 있는데요.
- X (메이저 버전): 기존 내용과 호환되지 않는 큰 변경이 있을 때 변경
- Y (마이너 버전): 기존 내용에 영향을 주지 않으면서 새로운 기능이 추가될 때 변경
- Z (패치 버전): 기존 내용의 버그를 수정하거나 개선이 이루어졌을 때 변경
각 버전에 대한 설명은 이후에 추가로 등장할 예정이니, 지금은 각 자리의 이름만 기억해 두셔도 좋습니다.
다만 메이저와 마이너라는 이름에서 추측할 수 있듯이, 버전의 앞자리에 오는 숫자가 더 중요하고 큰 변화가 있었다는 내용을 의미한다는 것 정도만 알아두시면 좋습니다. 즉 새로운 버전이 추가되거나 버전 간 비교가 필요할 때에는 앞자리에 있는 숫자를 먼저 비교한 후 그다음 자리 수를 비교하는 방식으로 버전의 순서와 중요도를 판단할 수 있다는 의미겠죠.
현재 상태는 초안이 전혀 없는 상태이므로 가장 초기 버전인 0.0.0
부터 시작합니다. 텅 빈 첫 페이지에서부터 시작해서 한 단계씩 책의 모습을 완성해 나갈 여러분의 모습이 기대되지 않나요?
이제, 당신의 요리책 출판 과정을 통해 시맨틱 버저닝의 원리를 하나씩 살펴보겠습니다.
이번 섹션에서 알게 된 내용을 정리하면 다음과 같습니다.
- 소프트웨어의 버전 관리 방법인 시맨틱 버저닝은
X.Y.Z
형태로 구성된다.- 메이저 버전이 가장 중요도가 높은 상위의 버전이고, 패치 버전이 가장 하위의 버전이다.
- 시맨틱 버전의 각 자리를 메이저, 마이너, 패치라고 부른다.
- 각 버전 자리 수는 0부터 시작한다.
책 초안을 작성하다
우선 이번 요리책에 담을 레시피는 일식을 콘셉트로 정했습니다. 첫 번째로 작성할 레시피는 바로 타코야키입니다. 타코야키는 문어가 들어간 일본의 대표적인 길거리 음식이죠.
바쁜 일정 속에서도 열심히 타코야키 레시피 초안을 작성했고, 일주일에 걸쳐 원고를 완성했습니다. 그리고 이 원고의 버전은 0.1.0
으로 설정하려고 합니다. 그 이유를 아래에서 자세히 살펴보겠습니다.
우선 메이저 버전은 여전히 0 입니다. 메이저 버전은 기존 내용과 호환되지 않는 큰 변경이 있을 때 올려야 합니다. 하지만 현재는 초안 단계로 큰 변화가 없으므로 메이저 버전은 그대로 0입니다. 또한, 메이저 버전이 0이라는 것은 아직 책이 완성되지 않은 상태임을 의미하기도 하죠.
마이너 버전은 1을 올렸습니다. 마이너 버전은 기존 내용에 영향을 주지 않으면서 새로운 기능이 추가될 때 변경됩니다. 타코야키 레시피는 기존에 없던 새로운 레시피이므로, 마이너 버전을 1로 올렸습니다.
패치 버전은 0입니다. 패치 버전은 기존 내용에 대한 수정이나 개선이 있을 때 올립니다. 현재는 수정된 내용이 없기 때문에 패치 버전은 0입니다.
이처럼 타코야키 레시피에 대한 초안이 작성됨으로써 원고의 버전은 이제 0.1.0
버전으로 진입했습니다. 이후 다른 레시피가 추가되거나 기존 레시피에 수정이 이루어지면서 버전 번호가 어떻게 변화할지 알아보겠습니다.
이번 섹션에서 알게 된 내용을 정리하면 다음과 같습니다.
- 정식 출시 전의 경우 메이저 버전을 0으로 설정하는 것이 일반적이다.
- 기존 내용에 영향을 주지 않으면서 새로운 기능이 추가되면 마이너 버전을 올린다.
- 버전 번호는 0부터 시작하고, 변경사항에 따라 점차 증가한다.
책의 내용을 수정하다
타코야키 레시피의 초안을 작성하여 출판사에 보냈는데, 해당 초안을 살펴본 동료 요리사로부터 피드백을 받게 되었습니다.
“타코야키 반죽에 들어가는 밀가루 양이 잘못 적힌 것 같아요.”
이를 확인해 보니, 실제로 밀가루 양이 잘못 기재되어 있더라구요. 요리책에서 레시피의 정확성은 매우 중요하므로, 이 부분을 수정해야겠죠. 동료의 피드백을 반영하여 타코야키 레시피 초안을 수정한 후, 원고의 버전은 0.1.1
로 업데이트 하였습니다.
메이저 버전은 여전히 0입니다. 아직까지 기존의 책 내용과 호환되지 않을 정도로 큰 변경이 없었고, 책은 아직 출간되지 않은 상태이니까요.
마이너 버전도 역시 1을 유지합니다. 새로운 레시피가 추가된 것은 아니니까요.
반면 패치 버전은 1이 올라갑니다. 기존 레시피에서 잘못된 부분을 수정했기 때문입니다. 패치 버전은 기존의 내용에서 잘못된 부분을 간단히 수정하거나, 간단한 기능 개선이 있을 때 올리는 버전이거든요.
그렇게 타코야키 레시피의 밀가루 양을 수정한 원고를 0.1.1
로 정했습니다.
그런데 원고를 유심히 살펴보던 동료 요리사가 또 다른 피드백을 제공했습니다. 타코야키 소스의 비율을 더 쉽게 계량할 수 있도록 좀 더 자세한 방법을 추가하면 좋겠다는 것이었죠.
“집에 계량컵이 없는 분들도 있으니, 종이컵을 이용해서 소스를 계량하는 방법도 추가하면 좋을 것 같아요.”
이 피드백을 반영해 타코야키 소스 계량 방법을 개선하고 원고를 수정했습니다. 이때의 버전은 0.1.2
로 정했습니다.
앞선 내용과 마찬가지로 메이저 버전과 마이너 버전은 이전과 동일하게 유지하되, 기존 내용을 개선하는 수정이라는 점에서 패치 버전만 1을 다시 올렸습니다.
이번 섹션에서 알게 된 내용을 정리하면 다음과 같습니다.
- 패치 버전은 기존 기능의 버그 수정이나 기능 개선에 해당한다.
- 패치 버전은 기존 기능을 그대로 유지하면서 안정성을 개선하는 업데이트에 사용된다.
책에 새로운 레시피 추가하기
타코야키 레시피의 초안을 완성한 후, 다음 요리로는 오코노미야키 레시피를 추가하기로 결심했습니다. 오코노미야키는 부침개와 비슷한 일본식 철판 요리죠.
이전과 마찬가지로 새로운 레시피를 작성하고 초안에 추가한 후, 원고 버전은 0.2.0
으로 설정했습니다.
책이 여전히 출간되지 않았으므로 메이저 버전은 0을 유지합니다. 반면 타코야키 외에 오코노미야키라는 새로운 레시피가 추가되었으므로 마이너 버전은 1 증가합니다. 여기서 패치 버전은 0으로 초기화가 되는데, 이는 상위 버전이 변경되면 그 하위 버전은 다시 0으로 초기화되는 시맨틱 버저닝의 특성을 따른 것이죠.
이제 타코야키와 오코노미야키 두 개의 레시피가 포함된 책은 0.2.0
버전으로 진입했다. 하지만 원고를 다시 살펴보니 뭔가 설명이 부족한 느낌을 다시 받게 되었고, 이에 대한 보충 설명을 추가해서 0.2.1
버전으로 업데이트했습니다. 메이저 버전과 마이너 버전은 변동이 없고, 패치 버전만 1 증가한 것을 볼 수 있는데 기존에 작성된 레시피에 수정이 이루어졌기 때문에 패치 버전이 올라간 것이죠.
이번 섹션에서 알게 된 내용을 정리하면 다음과 같습니다.
- 마이너 버전은 새로운 기능이 추가되었을 때 증가한다.
- 상위 버전이 업데이트되면, 그 하위의 버전은 다시 0으로 초기화된다.
책의 출간과 실수 발견
두 개의 레시피가 포함된 책의 초안이 완성되었고, 이 두 개의 레시피만으로 책을 출간하기로 결정했습니다. 이제 책은 인쇄 과정에 들어갔고, 온라인과 오프라인을 통해 고객들이 구매할 수 있는 실제 제품이 되었습니다. 이에 따라 원고의 버전은 1.0.0
으로 업데이트되었습니다.
이제 원고가 실제 출간된 제품이 되었으므로 메이저 버전을 1로 변경 할 수 있는 이유가 된 것이죠. 또한, 상위 버전이 업데이트되면 하위 버전은 0으로 초기화된다는 시맨틱 버저닝의 규칙에 따라, 마이너 버전과 패치 버전은 0으로 초기화되었습니다.
그런데 책이 출간된 후, 몇몇 독자들에 의해 오타가 발견되었습니다. 오코노미야키 반죽을 만들 때 들어가는 물의 양이 200ml로 적혀 있어야 했는데, 200L로 잘못 표기된 것이었습니다! 이 실수로 인해 독자들은 욕조 하나를 가득 채울 만큼의 물을 넣어야 한다고 오해할 수도 있겠는데요.
이 오타가 신경 쓰였던 당신은 원고를 수정하여 이를 1.0.1
버전으로 업데이트했습니다. 오타 수정이라는 작은 변경이었기 때문에 메이저 버전과 마이너 버전은 그대로 유지하되 패치 버전만 1을 올렸습니다.
원고는 빠르게 수정되었지만, 이미 인쇄된 책은 수정 전 상태로 판매되고 있기 때문에, 새로운 개정판을 내야만 수정된 내용이 반영될 것입니다.
이번 섹션에서 알게 된 내용을 정리하면 다음과 같습니다.
- 정식 출시가 된 경우 메이저 버전은 1로 변경한다.
- 한 번 출시된 버전의 내용은 수정할 수 없으며, 수정 사항이 필요하다면 반드시 새로운 버전으로 배포해야 합니다.
개정판 출간
다행히 책의 인기가 좋았던 탓에, 출판사와 협의하여 개정판을 출간하기로 결정했습니다. 저번에 고치고 싶었던 오타를 드디어 수정할 수 있게 됐군요! 다행입니다.
그런데 출판사로부터 책을 읽은 독자들이 야키소바 에 대한 레시피도 함께 추가해 주면 좋겠다는 이야기를 전해 듣게 되었습니다. 그래서 당신은 개정판에서는 오타를 수정할 겸, 겸사겸사 새로운 레시피를 함께 추가하기로 결정했습니다.
이렇게 오탈자를 수정하고 새로운 레시피가 추가된 원고의 버전은 1.1.0
으로 업데이트되었습니다.
메이저 버전은 1을 유지합니다. 레시피가 추가되었고 오타가 수정되었지만, 책의 전체적인 구조에는 큰 변경이 없었기 때문입니다.
마이너 버전은 1로 증가했습니다. 새로운 레시피인 야키소바가 추가되었기 때문이죠.
한편 패치 버전이 0으로 초기화된 점에 대해서는 의문을 가질 수 있는데요, 시맨틱 버저닝에서는 상위 버전을 올릴 때 하위 버전의 수정 사항도 함께 포함될 수 있다는 특성을 가지기 때문입니다. 따라서 이번 개정판에서는 오타 수정이 마이너 버전 증가와 함께 반영된 것입니다.
이번 섹션에서 알게 된 내용을 정리하면 다음과 같습니다.
- 상위 버전이 변경되면 하위 버전의 수정 사항도 함께 포함될 수 있다.
- 상위 버전이 올라가면 그 하위 버전은 다시 0으로 초기화된다.
레시피 제거하기
책의 인기가 계속해서 높아지자, 출판사에서는 비인기 레시피인 타코야키를 제외하고 야키우동 레시피를 추가하는 것은 어떤지 물어보았습니다. 그래서 타코야키 레시피는 제외하고, 대신 야키우동 레시피를 추가한 책으로 내용을 개편하였습니다.
이렇게 기존 레시피가 삭제되고, 새로운 레시피가 추가된 원고 버전은 2.0.0
으로 부르기로 했습니다.
여기서 메이저 버전이 2로 올랐는데, 이는 기존의 레시피가 빠지는 큰 변화가 있었기 때문입니다.
만약 당신의 타코야키 레시피를 좋아하던 독자가 기존의 책은 처분하고 새 책을 구입하게 됐는데, 타코야키 레시피가 더 이상 새 책에는 포함되어 있지 않다는 사실을 알면 당황할 것입니다. 지금까지는 계속 있었던 레시피가 갑자기 사라진 것이니까요! 즉, 이전 버전과 호환성이 깨지는 큰 변화가 생겼다고 볼 수 있죠. 이런 경우에는 메이저 버전을 올리는 것이 시맨틱 버저닝의 원칙입니다.
마이너 버전과 패치 버전은 다시 0으로 초기화가 되었습니다. 새로운 레시피가 추가된 것은 마이너 버전을 올릴 만큼의 변화로 볼 수 있지만, 메이저 버전의 변경이 가장 큰 변화이므로 마이너 버전과 패치 버전은 0으로 초기화되었습니다.
이번 섹션에서 알게 된 내용을 정리하면 다음과 같습니다.
- 메이저 버전은 기존의 기능과 호환되지 않는 큰 변화가 있을 때 증가한다.
새로운 레시피가 추가된 책은 사람들에게서 더 많은 호응을 얻었고, 이렇게 해서 여러분은 훌륭한 요리사임과 동시에 요리책 베스트셀러 작가가 되었습니다. 축하합니다!
요약
베스트셀러 작가가 되신 것을 축하합니다!
이번 글에서는 요리책을 출간하는 과정을 통해 시맨틱 버저닝의 원리를 쉽게 설명해 보았습니다. 메이저 버전은 호환성에 큰 영향을 주는 변화일 때 증가하고, 마이너 버전은 호환성에 영향을 주지 않는 기능 추가에 증가하며, 패치 버전은 버그 수정이나 성능 개선이 있을 때 증가한다는 특성만 알고 있으면 되거든요.
이와 같은 버전 관리 방법은 소프트웨어 개발과 유지보수에서 혼란을 줄이고, 개발자와 사용자가 보다 효율적으로 소프트웨어를 관리할 수 있도록 돕는다는 점에서 소프트웨어의 안정성, 호환성 및 발전을 추적할 수 있게 하며, 프로젝트와 제품의 성숙도를 반영하는 중요한 도구로 자리를 잡고 있습니다.
다만 실제로 소프트웨어 개발에서는 이보다 더 세분화된 버전 관리 방법을 사용하는 경우가 있긴 하지만, 비전공자분들이 이해하기에는 이 세 가지의 버전을 이해하는 것만으로도 충분할 것입니다. 시맨틱 버저닝에 대한 더 자세한 설명이 필요하다다면 공식 문서를 참조해 주세요!
마지막으로
본문을 제대로 읽었다면, 지금 스마트폰을 켜서 소프트웨어의 버전을 한 번 확인해 보세요. 저는 예시로 안드로이드 시스템의 커널 버전을 가져와봤는데요.
본문을 제대로 이해하신 분이라면 5.10.198
라는 버전이 무슨 의미를 나타내는 것인지 이해하실 수 있으실 겁니다.
지금까지 5번의 큰 변경이 있었고, 메이저 5에서 10번의 기능 추가가 있었고, 버그 수정과 기능 개선이 198번 있었구나!
이런 생각이 바로 떠올랐다면, 이 글을 제대로 이해하신 것입니다. 이제 소프트웨어의 버전을 보면서 더 이상 당황하지 않겠죠?