기본 개념
경로(path)는 컴퓨터 시스템 내에서 파일이나 폴더(디렉토리)의 위치를 나타내는 방법이예요. 길에서 목적지를 찾아간다고 상상해보세요. 목적지 주소를 알면 찾아갈 수 있지만, 목적지 지역을 처음 가보는데다 주소 부여 체계 규칙을 도저히 알 수 없고 장소가 복잡하다면 찾아가기 대단히 어려울 거예요. 이런 경우라면 시작지점부터 목적지까지 가는 과정을 경로로 아는 게 더 유용할 겁니다.
이처럼 우리가 실생활에서 어떤 장소로 가기 위해 지도에서 길을 찾는 것처럼, 컴퓨터에서는 파일이나 폴더를 찾아갈 수 있도록 경로 체계를 제공합니다. 이런 체계를 활용해 우리는 컴퓨터에 저장된 수많은 파일과 디렉터리 중에서 필요한 자료에 수월하게 접근합니다.
경로의 종류
최상위 경로 (Root)
루트 경로라고도 부릅니다. 파일 시스템에서 최상위에 있는 디렉터리죠. 여기서 최상위란 모든 경로의 시작점 또는 시작위치이라는 의미입니다. 모든 파일과 디렉터리는 루트 디렉터리 아래에 위치하는 것이죠.
맥OS같은 유닉스 계열과 리눅스는 슬래시 기호(/)로 표현합니다. 이 기호는 각 경로를 구분하는 구분자(delimiter)로도 사용되는데, 아무 경로 표현 없이 /만 있는 것이 루트 디렉터리예요.
윈도우에는 루트 디렉터리가 여러 개 존재할 수 있습니다. 물리적인 혹은 논리적인(비물리적인) 디스크 드라이브 별로 존재하거든요. 역슬래시(\) 기호로 표현하는데, 디스크 드라이브를 구분해야 하므로 디스크 드라이브 이름을 조합해 표현하는 것이 일반적이에요. 예를 들어 C 드라이브의 루트 디렉터리는 C:\로 표현합니다. 윈도우에서 PowerShell을 사용하면 /로 경로 구분이 가능해요.
역슬래시는 엔터키 바로 위에 슬래시 기호를 좌우 반전시킨 기호이며, 특정 언어 별 키보드에 따라서는 통화(currency) 기호로 표현되기도 합니다. 가령, 한국어 키보드에서 역슬래시는 ₩ 기호로 표현되는 거죠.
이 컨텐츠에서는 윈도우 PowerShell과 맥OS Z Shell 모두 /로 경로 구분과 사용이 가능하므로 /로 통일해서 표기할게요.
절대 경로와 상대 경로
절대 경로는 파일이나 디렉터리의 경로를 루트 디렉터리부터 시작하여 경로 전체를 나타내요. 예를 들어, 윈도우에서 C:\Users\Username\Documents\File.txt 또는 리눅스와 맥OS에서 /home/username/documents/file.txt가 절대 경로지요.
상대 경로는 특정 위치를 기준으로 경로를 나타내요. 내가 사는 집을 기준으로 옆 집, 옆의 옆 집처럼 표현하는 거지요. 대개는 사용자가 현재 있는 경로를 기준으로 합니다.
현재 위치는 .로, 상위 경로는 ..로 표현해요. 예를 들어, 비주얼 스튜디오 코드를 현재 위치에서 실행한다면, code .라고 현 경로를 의미하죠. 상위 디렉터리에 있는 파일과 디렉터리를 나열해 표시하려면 ls ..로 경로를 표현합니다. ls 명령어는 뒤에서 다루니, 이 단계에선 파일과 디렉터리를 나열해 표시하는 명령어 정도로 이해하셔도 충분해요.
현 경로(위치)
현재 위치를 나타내는 문자는 .입니다. 현재 경로로 다루기 때문에 보통은 ./ 로 기술하죠. 빈번하게 사용하니 기억해두세요.
홈(Home) 경로
홈 경로는 특정 사용자의 개인적인 작업 공간을 가리키는 디렉토리예요. 사용자마다 고유한 홈 디렉토리가 있으며, 개인 파일, 문서, 설정 등을 저장하는 데 사용하지요. 여기서 사용자란, 맥OS나 윈도우를 기준으로 운영체제를 구동한 후 운영체제에 로그인을 한 계정입니다.
맥OS와 리눅스 ~ 기호로 표현합니다. ls ~는 홈 디렉터리에 있는 파일과 디렉터리를 나열해 출력하는 것이지요. 윈도우에서 PowerShell을 사용하는 경우에도 홈 디렉터리는 ~ 기호로 표현하고요.
계정 하나를 운영체제의 관리자 권한으로 사용하는 경우가 많아 운영체제의 계정으로 운영체제를 구동한다는 개념과 사용자 별 작업 공간과 홈 개념이 생소할 수 있습니다. 그러하다면 사용자 별 홈 경로가 존재한다고 이해하고 넘어가셔도 돼요. 권한 등 추가적인 개념은 뒤에서 다룰게요.
경로의 길이 제한
윈도우, 맥OS, 리눅스 운영 체제에서 파일 경로의 길이에 제한이 있습니다. 이러한 제한은 운영 체제의 파일 시스템에 따라 다르고요.
맥OS
맥OS에서는 HFS+ 파일 시스템을 사용하면 파일 경로의 최대 길이가 약 1024자로 제한됩니다. 각 경로 별로 1024자가 아니라 절대 경로를 기준으로 1024자이지요.
APFS(Apple File System)를 사용하는 더 최근의 시스템에서는 이러한 제한이 더 길어질 수 있으나, 구체적인 제한 길이는 명확히 문서화되어 있지 않아요.
APFS는 2017년 6월에 공개되었고, 2017년 하반기에 출시한 맥OS를 탑재한 기기부터는 기본 파일시스템으로 적용되었어요. 맥OS 버전으로는 하이 시에라(10.13)부터지요. 따로 파일 시스템을 따로 손보지 않는 한, 2017년 상반기 이후에 맥북 등을 구입했다면 APFS일 거예요
윈도우
윈도우에서는 경로 길이가 더 제한돼요. 절대 경로 기준으로 보통 260자거든요. 이 제한은 Node.js의 패키지 체계를 사용하는 경우, 이 길이 제한은 문제를 일으키곤 합니다. 복잡하고 긴 경로로 라이브러리 같은 도구 또는 패키지를 관리하다보니 간혹 절대 경로가 260자를 넘곤 하거든요. 이 문제는 2023년 12월에도 여러 사용자를 번거롭게 했으니, 파일 시스템이나 경로에 대해 잘 모른다면 최근까지도 당혹스러운 경험을 할지도 몰라요.
윈도우에서 경로 길이 제한은 MAX_PATH 설정값으로 제한되며, 이는 보통 260자입니다. 윈도우 10버전의 1607빌드부터는 이와 관련된 설정을 변경하면 최대 경로 길이 제한을 조정할 수 있는데요. \\?\ 접두사를 사용하여 이 경로 길이 제한을 우회할 수 있으며, 최대 경로 길이는 약 32,767자로 확장될 수 있습니다.
일반적인 파일 경로 예시:
\\?\ 접두사를 사용한 동일한 파일 경로 예시:
Node.js에서도 이 접두사를 사용하여 긴 경로를 다룹니다.
리눅스
리눅스에서는 파일 이름의 최대 길이가 255자이고, 전체 경로의 최대 길이는 4,096자로 제한돼요. 이러한 제한은 대부분의 리눅스 배포판에서 사용되는 Ext4 파일 시스템에 적용되는데, 다른 파일 시스템에서는 이 제한이 다를 수 있지요.
경로에 한글 사용
Shell을 사용하는 상황에서는 되도록 경로에 한글을 사용하지 않는 게 좋아요. 정확히는 영문자를 사용하는 것이 좋아요. 한글, 한자, 히라가나, 가타카나 글자를 통틀어 CJK라고 하는데, 프로그래밍을 하는 환경에선 까다로운 문자 처리로 유명하죠.
Shell을 사용하지 않고 GUI를 주로 사용하면, 별로 불편하지 않게 파일이나 디렉토리 이름에 한글을 사용합니다. 보통은요. 하지만, Shell을 사용하는 상황에선 불편한 상황이 생기거나 문제가 발생하곤 하죠.
한글이 여러 기호로 이상하게 조합되어 표시
대개는 경로를 출력할 때 깨져보이는 것처럼 한글이 표시 안 되는 현상입니다. 단지 출력에서만 문제가 발생하는 경우라서 큰 문제는 없는데요. 주의해야 할 점은 그런 상황에서 파일이나 디렉터리 이름을 CJK 글자가 들어간 이름으로 변경하는 경우입니다. 변경하는 과정에서도 CJK 글자가 제대로 표시 안 되거나, 혹은 심지어 제대로 표시되는데도 막상 이름을 변경한 후엔 더욱 알아보기 어려운 기호로 깨져보이곤 하거든요.
이런 문제는 한글 폰트를 사용하는 앱에 설정하면 해결되는 경우가 많으며, CJK를 지원하지 않는 경우 딱히 해결할 방법은 없습니다.
앱이나 라이브러리 등이 오동작
CJK 글자를 사용하지 환경에 있거나 CJK를 잘 모르는, 또는 대응하기 까다로워 일단 CJK 대응을 하지 않고 앱이나 라이브러리를 개발하는 경우, 오동작을 하는 경우가 종종 있습니다. 가장 흔한 증상은 분명히 파일이나 디렉터리가 존재하는데, 앱이나 라이브러리가 동작하는 중에는 존재하지 않는 경로로 처리하는 상황이지요.
경로에 한글을 사용하지 않았는데도 이 문제를 겪는 사례가 있는데, 십중팔구 운영체제의 계정명에 한글이 들어간 경우입니다. 예를 들어, 윈도우에서 계정명이 푸딩캠프라면, 홈 디렉터리는 C:\Users\푸딩캠프가 되는데, 홈 디렉터리에서 프로그래밍을 하다보면 이 문제를 겪곤 합니다. 계정명에 한글이 있다는 사실을 미처 인지하지 못하여 고생하는 피해자가(?) 적잖습니다.
계정명에 한글이 있어서 발생하는 문제라면 운영체제에서 계정명을 변경하면 되는데, 실제 계정명이 아니라 표시되는 이름(display name)만 변경하는 실수를 유의하세요.
자음과 모음이 분리
이 문제는 맥OS와 다른 운영체제(윈도우, 리눅스) 사이에서 주로 발생합니다. 맥OS에서 이름에 한글이 들어간 파일을 윈도우나 리눅스에 보내면 윈도우와 리눅스에서 파일명의 자소가 분리되고, 그 반대인 경우 맥OS에서 파일명의 자소가 분리되는 현상이지요. 예를 들어, 파일명이 푸딩캠프.md라면 ㅍㅜㄷㅣㅇㅋㅐㅁㅍㅡ.md가 됩니다.
유니코드 한글 조합 방식이 서로 달라서 발생하는 문제인데, 자소가 분리된 파일명을 다시 원래 이름으로 변경하면 해결됩니다. 파일 개수가 많아 하나 하나 해결하기 힘든 경우, Python같은 프로그래밍 언어로 스크립트를 작성하여 해결하곤 합니다.
다음은 경로를 텍스트 그림으로 표현한 것입니다. 좌측에 위치할수록 상위 디렉터리이며, 맨 위에 있는 /기호는 루트 디렉터리를 의미합니다. puddingcamp 경로 옆에 있는 (~) 표시는 홈 디렉터리를 의미합니다. 이 내용을 참고하여 퀴즈를 풀어보세요.