티스토리 뷰

이 페이지는 자바스크립트를 이용한 버전비교를 설명하고 있다.

 

버전을 비교하기에 앞서 버전관리에 대해서 간단하게 설명하려한다.

Semantic Versioning (SemVer)는 버전 형식에 의미를 부여하여 체계적인 버전관리를 위한 제안이다. 명확한 버전 구분을 통해 변화량을 짐작할 수 있다.

보통 0.0.0 (Major, Minor, Patch) 같이 세부분으로 나눠진 형태의 버전을 많이 사용한다.

  • Major: 전체를 뒤엎을 정도로 큰 변화가 발생했을 경우, 이전버전과 호환되지 않는 API 변경시 버전 증가

  • Minor: 주요 기능의 추가나 변경 시 버전 증가

  • Patch: 버그 수정 등 작은 변화 발생 시 버전 증가

 

Q. 버전은 1.0.0 / 1.0.23 / 1.1 처럼 '.'으로 구분된 문자열이다. 두 개의 버전을 비교하는 프로그램을 작성하시오.
(버전 비교의 예시)

0.0.2 > 0.0.1

1.0.10 > 1.0.3
1.2.0 > 1.1.99
1.1 > 1.0.1

 

A1)

const compareVer = (versionA, versionB) => {
  const redex = /\./gi;
  const a = versionA.replace(redex, '');
  const b = versionB.replace(redex, '');

  if (a > b) {
    console.log(`${versionA} > ${versionB}`);
  } else if (a == b) {
    console.log(`${versionA} = ${versionB}`);
  } else {
    console.log(`${versionA} < ${versionB}`);
  }
};


위의 코드는 문자열로 변환하여 비교하는 방식이다.

예를 들면 '1.7.1' -> 171 vs '1.7.3' -> 173처럼 문자로 변환한 후 비교하여 '171' < '173' (true)의 결과를 낸다.

한번에 계산 되기떄문에 편리하기는 하지만, 1.7.13 vs 1.7.3 이를 문자열로 바꾸어 '1713' < '1.7.3' (true)의 결과를 내는 제대로 처리되지 못하는 예외의 경우가 발생할 수 있다.

버전관리에 대해 이해했으니, 이 경우가 왜 잘못된건지 알 것이라고 믿는다.

(13 < 3 은 당연히 틀리죠? false false false)

 

이러한 예외사항까지 처리하기위해 복잡하지만 아래의 코드를 사용하려한다.

 

A2-1)

const compareVer = (versionA, versionB) => {
  let compareResult = true;

  const splitVersionA = versionA.split('.');
  const splitVersionB = versionB.split('.');

  const length = Math.max(splitVersionA.length, splitVersionB.length);

  for (let i = 0; i < length; i += 1) {
    const a = splitVersionA[i] ? parseInt(splitVersionA[i], 10) : 0;
    const b = splitVersionB[i] ? parseInt(splitVersionB[i], 10) : 0;
    if (a > b) {
      compareResult = false;
      break;
    }
  }
  if (compareResult == true) {
      console.log(`${versionA} < ${versionB}`);
  } else {
      console.log(`${versionA} >= ${versionB}`);
  }
};

위의 코드는 ‘.’으로 나눠 앞에서부터 하나씩 자릿수별로 비교하는 방식이다. 


A2-2)

A2-1과 같은 코드이지만, console 출력때문에 변수가 복잡해 보일 수 있어서 다시 정리한 실제 사용된 코드이다. 

const compareVer = (versionA, versionB) => {
  let compareResult = true;

  versionA = versionA.split('.');
  versionB = versionB.split('.');

  const length = Math.max(versionA.length, versionB.length);

  for (let i = 0; i < length; i += 1) {
    const a = versionA[i] ? parseInt(versionA[i], 10) : 0;
    const b = versionB[i] ? parseInt(versionB[i], 10) : 0;
    if (a > b) {
      compareResult = false;
      break;
    }
  }
  return compareResult;
};

 

댓글
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total
Today
Yesterday