[Day48] WSL, Linux - 윈도우의 경로 구분자(path separator)

Validator·2023년 8월 22일
0

윈도우에서의 경로 구분자 백슬래쉬(back slash)

1. 경로 구분자(Path Separator)의 개념

윈도우의 파일 시스템에서 디렉토리(directory)와 파일을 참조할 때 사용하는 경로 구분자(path separator)는 중요한 개념이다. 경로 구분자는 디렉토리와 파일의 계층 구조를 나타내며, 특히 파일 시스템에서 위치를 찾아가는 데 사용된다.

1.1. 슬래시(/)와 백슬래시()의 차이

  • 슬래시(/): 슬래시는 UNIX와 UNIX 기반 시스템(예: Linux, macOS)에서 전통적으로 사용되는 경로 구분자다. 이는 파일과 디렉토리의 계층적 구조를 나타내는 데 사용된다. 예를 들어, /home/user/documents 경로는 home 디렉토리 아래의 user 디렉토리, 그리고 user 디렉토리 아래의 documents 디렉토리를 참조한다.

  • 백슬래시(): 백슬래시는 주로 윈도우 시스템에서 경로 구분자로 사용된다. 예를 들어, C:\Users\Username\Documents 경로는 C: 드라이브에 있는 Users 디렉토리 아래의 Username 디렉토리, 그리고 Username 디렉토리 아래의 Documents 디렉토리를 참조한다.

1.2. 플랫폼 별 차이점

윈도우와 UNIX 기반 시스템 간의 주된 차이점은 경로 구분자의 사용 방식이다. 윈도우에서는 백슬래시()가 일반적으로 사용되지만, UNIX 기반 시스템에서는 슬래시(/)가 사용된다. 이 차이점은 플랫폼 간 이식성(portability) 문제를 야기할 수 있다.

2. 코드 예제

윈도우에서 개발을 진행하면서 경로 구분자 문제를 해결하는 방법은 여러 가지가 있다. 여기서는 두 가지 주요 방법이 존재한다.

2.1. 경로 구분자의 통일화

개발자는 코드를 작성할 때 일관된 경로 구분자를 사용하여 플랫폼 간 이식성을 유지할 수 있다. 예를 들어, 슬래시(/)를 사용하여 경로를 지정하면 윈도우와 UNIX 기반 시스템 모두에서 코드가 작동할 가능성이 높아진다.

const path = '/home/user/documents';

2.2. Node.js의 path 모듈 활용

Node.js에서는 path 모듈을 제공하여 경로 관련 작업을 쉽게 수행할 수 있다. path 모듈의 join 함수를 사용하면, 플랫폼에 따라 올바른 경로 구분자를 사용하여 경로를 생성할 수 있다.

const path = require('path');
const directoryPath = path.join('home', 'user', 'documents');
console.log(directoryPath);  // 윈도우에서: home\user\documents, UNIX에서: home/user/documents
// 이런식으 path 모듈을 사용하면 사용 환경에 기반해서 path separator가 넣어지므로 오류가 발생할 확률을 줄일 수 있다.

3. 경로 구분자 문제의 실제 영향과 해결 방안

윈도우와 UNIX 기반 시스템에서 경로 구분자의 차이는 실제 개발 환경에서 여러 문제를 야기할 수 있다. 이러한 문제를 이해하고 해결하는 것은 플랫폼 간 코드 이식성을 유지하고 더욱 견고한 소프트웨어를 개발하는 데 중요하다.

3.1. 플랫폼 간 이식성 문제

경로 구분자의 차이는 코드의 플랫폼 간 이식성(portability)을 저해할 수 있다. 예를 들어, 윈도우에서 작성된 코드가 UNIX 기반 시스템에서 올바르게 작동하지 않을 수 있다.

// 윈도우에서 작성된 코드
const filePath = 'C:\\Users\\Username\\Documents\\file.txt';

이 코드는 윈도우에서 잘 작동하지만, UNIX 기반 시스템에서는 경로 구분자가 다르므로 문제가 발생할 수 있다.

3.2. 코드의 가독성과 유지 관리

경로 문자열을 하드 코딩(hard-coding)하면 코드의 가독성과 유지 관리가 어려워질 수 있다. 또한, 플랫폼에 따라 경로 구분자를 변경해야 할 수도 있다.

3.3. 해결 방안

3.3.1. 라이브러리나 모듈 사용

Node.js의 path 모듈과 같은 라이브러리나 모듈을 사용하여 경로를 처리하면, 플랫폼 간의 차이점을 쉽게 해결할 수 있다.

const path = require('path');
const filePath = path.join('C:', 'Users', 'Username', 'Documents', 'file.txt');

path.join 메소드는 플랫폼에 따라 올바른 경로 구분자를 사용하여 경로를 조합한다.

3.3.2. 상대 경로 사용

상대 경로(relative path)를 사용하면, 다양한 플랫폼에서 코드가 올바르게 작동할 가능성이 높아진다.

const filePath = './documents/file.txt';
3.3.3. 환경 변수 사용

환경 변수(environment variables)를 사용하여 경로를 설정하면, 플랫폼에 따라 동적으로 경로를 변경할 수 있다.

const baseDir = process.env.BASE_DIR || '.'; // bBASE_DIR이 없다면 .을 쓴다는 의미
const filePath = path.join(baseDir, 'documents', 'file.txt');

그렇다면 왜 Windows에서만 백슬래쉬를 쓰게 됐는가?

C:\Windows\System32 (윈도우는 특이하게 directory의 path separator를 backslash를 쓴다)
/usr/bin (UNIX 환경에서는 forward slash를 쓴다)
https://www.naver.com (URL도 바찬가지로 forward slash를 사용한다)

여러 형태의 path 중 유독 윈도우만 디렉토리 구분자로 백슬래시(backslashs, ‘\’)를 사용하고 그 외 다른 모든 환경에서는 슬래시(forward slashs, ‘/‘)를 사용한다. 왜 Windows에서만 백슬래시를 사용하는 것일까?

Windows에서 백슬래시를 사용하게 된 배경

1970년경, Unix는 슬래시를 디렉토리 구분자로 소개했다. 왜 슬래시를 선택했는지는 모른다.

그리고 1981년, Windows가 MS-DOS 1.0을 발표하였다. MS-DOS 1.0은 나도 경험한 적이 없기에 잘 모르지만 놀랍게도 디렉토리 개념이 없었다고 한다. 그리고 슬래시를 옵션값 설정용으로 사용을 했다. 이러한 기능은 현재도 유효하다. CMD에서 dir/w를 입력하면 가로 목록 형식으로 출력되는 것을 확인할 수 있다.('help dir'을 입력하면 슬래시를 이용한 여러 옵션 값들을 확인할 수 있다.)

이후 MS-DOS 2.0에서 디렉토리를 지원하기 시작하였고, 디렉토리 구분자가 필요하게 되었다. 그러나 Unix에서와 같이 슬래시를 디렉토리 구분자로 사용하면 MS-DOS 1.0의 옵션 구분자와 충돌이 발생하여 사용할 수 없었다. 그때라도 옵션 구분자를 다른 문자로 변경했다면 문제가 없었겠지만 MS는 디렉토리 구분자를 다른 문자로 바꾸어 사용하기 시작했다. 그 때 변경한 디렉토리 구분자가 백슬래시이다.

OS에 따라 디렉토리 구분자를 정확히 써야만 하는가?

최근의 많은 소프트웨어들은 두 가지 모두를 호환하고 있다.
Windows 탐색기에서 C:/Windows/System32를 입력하면 슬래시가 백슬래시로 변경되어 검색된다.
Chrome 브라우저에서 백슬래시로 URL을 입력해도 슬래시로 변경되어 검색된다.
이렇듯 많은 소프트웨어가 디렉토리 구분자로 슬래시와 백슬래시를 모두 지원하고 있다. (테스트 결과 Unix계열에서는 백슬래시를 호환하지 않았다.)

하지만 정확한 디렉토리 구분자를 쓰는 것이 좋다.
많은 소프트웨어가 두 가지 모두를 호환하지만 그렇지 않는 프로그램도 많기 때문이다. 상황에 맞게 경로를 입력하는 것이 바람직하다.

0개의 댓글