2부 · 파일·폴더·경로

← 이전: 컴퓨터는 어떻게 일하는가 · 목차 · 다음: 터미널과 친해지기 →

개발 입문에서 가장 자주, 가장 오래 사람을 붙잡는 게 바로 경로(path)입니다. "그 파일을 못 찾는대요"라는 오류의 90%는 경로 문제입니다. 이 챕터를 제대로 넘기면 터미널·실행·패키지 설치가 훨씬 수월해집니다. 천천히 가겠습니다.

2.1 파일과 폴더 — 책장의 구조

파일(file)은 내용이 담긴 하나의 덩어리입니다. 사진 한 장, 문서 하나, 코드 한 개가 각각 파일입니다. 폴더(folder) — 터미널 세계에서는 디렉터리(directory)라고도 부릅니다 — 는 파일과 다른 폴더를 담는 상자입니다.

폴더 안에 폴더가 들어가고, 그 안에 또 폴더가 들어갑니다. 이렇게 위에서 아래로 가지를 뻗는 구조를 트리(tree)라고 합니다.

flowchart TB
    R["💻 C:\\ (최상위, 루트)"] --> U["Users"]
    U --> ME["나의계정"]
    ME --> DOC["Documents"]
    ME --> DOW["Downloads"]
    DOC --> PRJ["rag-project (폴더)"]
    PRJ --> APP["app.py (파일)"]
    PRJ --> DATA["data (폴더)"]
    DATA --> PDF["manual.pdf (파일)"]

    classDef dir fill:#E6D6FF,stroke:#7C4DBC,color:#000
    classDef file fill:#CDE7FF,stroke:#3B82C4,color:#000

    class R,U,ME,DOC,DOW,PRJ,DATA dir
    class APP,PDF file

맨 위의 출발점을 루트(root)라고 합니다. Windows에서는 보통 C:\가 루트입니다. macOS·Linux에서는 / 하나가 루트입니다. 모든 파일은 루트에서 시작해 폴더를 따라 내려가면 닿을 수 있습니다.

2.2 경로 — 파일의 주소

경로(path)는 "이 파일이 트리의 어디에 있는지"를 적은 주소입니다. 위 그림에서 manual.pdf의 주소는 이렇게 됩니다.

CODE
C:\Users\나의계정\Documents\rag-project\data\manual.pdf

루트(C:\)에서 출발해, 폴더를 하나씩 내려가, 마지막에 파일 이름으로 끝납니다. 폴더와 폴더 사이를 구분하는 기호가 구분자(separator)입니다.

콜아웃 · Windows와 나머지의 가장 큰 차이
경로 구분자가 OS마다 다릅니다.
  • Windows: 역슬래시 \C:\Users\나의계정\rag-project
  • macOS·Linux: 슬래시 //Users/나의계정/rag-project

헷갈리는 점 하나 더: 많은 개발 도구와 코드(특히 Python)는 Windows에서도 /를 받아들입니다. 그래서 코드 안에서는 data/manual.pdf처럼 /로 써도 잘 돕니다. 하지만 Windows 터미널 명령에서는 보통 \를 씁니다. 이 가이드는 터미널 명령엔 Windows 기준 \를, 코드 예시엔 범용 /를 씁니다.

2.3 절대경로 vs 상대경로 — 핵심 개념

여기가 이 챕터의 심장입니다. 경로를 적는 방식은 두 가지입니다.

절대경로(absolute path)는 루트에서부터 전부 적은 "완전한 주소"입니다. 어디서 보든 같은 한 곳을 가리킵니다.

CODE
C:\Users\나의계정\Documents\rag-project\data\manual.pdf

상대경로(relative path)는 "지금 내가 서 있는 위치"를 기준으로 적은 주소입니다. 지금 위치가 어디냐에 따라 가리키는 곳이 달라집니다.

이 "지금 서 있는 위치"를 현재 작업 디렉터리(current working directory, 줄여서 cwd)라고 부릅니다. 터미널은 항상 어떤 폴더 "안에 서서" 동작합니다. 상대경로는 바로 그 위치 기준입니다.

예를 들어 지금 rag-project 폴더 안에 서 있다면:

CODE
data\manual.pdf      ← rag-project 기준 상대경로 (위 절대경로와 같은 파일)

같은 파일이지만, 절대경로는 "서울특별시 ○○구 ○○로 123"처럼 완전한 주소이고, 상대경로는 "여기서 오른쪽으로 두 블록"처럼 현재 위치에 의존하는 길 안내입니다.

flowchart TB
    subgraph 절대경로["절대경로 — 항상 같은 곳"]
        AB["C:\\Users\\나의계정\\Documents\\rag-project\\data\\manual.pdf"]
    end
    subgraph 상대경로["상대경로 — 현재 위치(cwd)에 의존"]
        CWD["📍 지금 위치: rag-project"] --> REL["data\\manual.pdf"]
    end

    classDef abs fill:#D7F2C8,stroke:#5BA63B,color:#000
    classDef here fill:#FFF3B0,stroke:#C9A227,color:#000
    classDef rel fill:#CDE7FF,stroke:#3B82C4,color:#000

    class AB abs
    class CWD here
    class REL rel
콜아웃 · "파일을 못 찾는대요"의 진짜 원인
입문자가 코드를 python app.py로 돌렸는데 "data/manual.pdf를 못 찾음"이 뜨는 가장 흔한 이유는, 터미널이 서 있는 위치(cwd)가 생각과 다르기 때문입니다. 코드는 cwd 기준 상대경로로 파일을 찾는데, 엉뚱한 폴더에 서서 실행했으면 당연히 못 찾습니다. 3부에서 "지금 어디 서 있는지" 확인하고 옮기는 법을 배웁니다.

2.4 특수한 경로 기호: . .. ~

상대경로에는 자주 쓰는 약속된 기호가 있습니다.

기호예시
.현재 폴더 (지금 여기).\app.py = 지금 폴더의 app.py
..한 단계 위 폴더(부모)..\data = 위로 한 칸 올라가서 data
~내 홈 폴더 (macOS·Linux)~/rag-project = 홈 아래 rag-project

..는 특히 자주 씁니다. 지금 rag-project\data에 서 있는데 rag-project로 올라가고 싶으면 ..가 그 "위 칸"을 가리킵니다. ..\..처럼 두 번 쓰면 두 칸 올라갑니다.

~(틸드)는 macOS·Linux에서 "내 홈 디렉터리"의 줄임말입니다. Windows에는 직접 대응이 없지만, 일부 도구는 비슷하게 처리합니다. Windows의 홈 폴더는 보통 C:\Users\내계정입니다.

2.5 파일 확장자 — 이름 뒤의 꼬리표

app.py, manual.pdf, notes.txt에서 점 뒤의 py, pdf, txt확장자(extension)라고 합니다. 확장자는 "이 파일이 어떤 종류인지"를 알려주는 꼬리표입니다.

확장자종류누가 여는가
.txt일반 텍스트메모장, 에디터
.pyPython 코드Python 프로그램
.md마크다운 문서에디터·뷰어 (이 가이드도 .md!)
.pdf문서PDF 뷰어
.json데이터(설정·구조화 데이터)에디터, 프로그램

중요한 점: 확장자는 사실 이름의 일부일 뿐이고, 그 자체로 마법은 없습니다. .py.txt로 바꿔도 내용은 그대로지만, OS와 도구가 "이건 Python 코드"라고 알아보지 못하게 됩니다. 그래서 확장자를 함부로 바꾸면 안 됩니다.

콜아웃 · Windows에서 확장자가 안 보인다면
Windows 탐색기는 기본적으로 확장자를 숨깁니다. 그래서 app.py가 그냥 app으로 보이고, 실수로 app.py.txt 같은 이중 확장자를 만들기 쉽습니다. 반드시 확장자를 보이게 켜세요: 탐색기 상단 메뉴 → "보기"(View) → "파일 확장명"(File name extensions) 체크. 이걸 안 켜면 입문 단계 내내 보이지 않는 함정에 빠집니다.

2.6 숨김 파일 — 점으로 시작하는 이름

이름이 점(.)으로 시작하는 파일·폴더는 숨김(hidden) 처리됩니다. 예를 들어 .venv(가상환경, 5부), .env(비밀 설정), .gitignore(Git 제외 목록)처럼요. 탐색기나 ls가 기본적으로 안 보여주기 때문에, "분명 만들었는데 안 보인다"며 당황하기 쉽습니다.

환경숨김 파일 보는 법
Windows 탐색기"보기" → "숨긴 항목"(Hidden items) 체크
PowerShellls -Force
mac/Linux 터미널ls -a
mac FinderCmd + Shift + . (점)

점으로 시작하는 이름은 "사람이 평소 안 봐도 되는 설정·도구용 파일"이라는 관례입니다. RAG 프로젝트에서 .venv.env를 자주 만나게 되니, 지금 "안 보여도 거기 있다"는 걸 기억해 두세요.

2.7 대소문자·공백·한글 — 이름이 만드는 함정

파일·폴더 이름 때문에 생기는 입문자 사고가 몇 가지 정해져 있습니다.

대소문자. Windows는 보통 Datadata를 같은 것으로 봅니다(대소문자 구분 안 함). 하지만 macOS·Linux, 그리고 많은 서버는 다른 것으로 봅니다(구분함). 그래서 내 Windows에서는 잘 되던 코드가 서버에 올리면 "파일 없음"이 나는 일이 생깁니다. 처방은 간단합니다 — 코드와 실제 파일명의 대소문자를 항상 똑같이 맞추세요.

공백. 폴더 이름에 띄어쓰기가 있으면(my project) 터미널이 이름을 두 토막으로 잘못 읽습니다. 따옴표로 감싸면("my project") 해결되지만, 애초에 개발용 폴더 이름은 공백 대신 하이픈(-)이나 밑줄(_)을 쓰는 게 편합니다: rag-project, my_data.

한글·특수문자. 폴더·파일 이름에 한글을 써도 대개 동작하지만, 일부 오래된 도구나 서버에서 깨질 수 있습니다. 프로젝트 폴더·코드 파일 이름은 영문 소문자 + 하이픈/밑줄로 가는 걸 권합니다. (문서 내용이나 데이터 안의 한글은 전혀 문제없습니다 — 어디까지나 파일·폴더 이름 이야기입니다.)

정리하면, 개발용 이름의 안전한 기본값: 영문 소문자, 공백 대신 -_, 확장자 정확히. 예: rag-project/, load_docs.py, manual.pdf.

2.8 텍스트 인코딩 — 한글이 깨질 때 (살짝 맛보기)

같은 .txt 파일이라도, 글자를 컴퓨터가 숫자로 바꿔 저장하는 방식(이를 인코딩 encoding이라 합니다)이 여러 가지입니다. 오늘날의 사실상 표준은 UTF-8이고, 한글·이모지를 포함한 거의 모든 문자를 다룰 수 있습니다.

이게 왜 입문 단계에서 중요할까요? RAG는 문서를 텍스트로 읽어들이는 일로 시작하는데, 파일이 다른 인코딩(예: 옛 Windows 한글 문서의 cp949/euc-kr)으로 저장돼 있으면 읽을 때 한글이 ���처럼 깨지거나 오류가 납니다. 지금 깊게 알 필요는 없고, 두 가지만 기억하세요. ① 새로 파일을 만들 땐 UTF-8로 저장한다(VS Code의 기본값입니다). ② 나중에 "한글이 깨져요" 오류를 만나면 십중팔구 인코딩 문제이고, 이 절을 떠올리면 됩니다.

VS Code에서는 창 오른쪽 아래에 현재 파일의 인코딩(보통 UTF-8)이 표시되고, 클릭해서 바꿀 수 있습니다.

2.9 프로젝트 폴더는 어떻게 생겼나 — 흔한 구조

개발 프로젝트는 아무렇게나 파일을 흩어두지 않고, 어느 정도 관례적인 구조를 따릅니다. RAG 안내서의 실습 폴더도 대략 이런 모습일 것입니다.

CODE
rag-project/                ← 프로젝트 루트 (모든 게 이 안에)
├── app.py                  ← 실행하는 메인 코드
├── requirements.txt        ← 필요한 패키지 목록 (5부)
├── .env                    ← 비밀값 (API 키 등, 숨김·공유 금지)
├── .gitignore              ← Git이 무시할 목록 (5부)
├── .venv/                  ← 가상환경 (숨김, 5부)
├── data/                   ← 원본 문서들
│   ├── manual.pdf
│   └── faq.txt
└── src/                    ← 코드를 기능별로 나눠 담는 폴더 (선택)
    ├── load.py
    └── search.py

이 구조가 한눈에 들어오면 RAG 코드가 훨씬 덜 무섭습니다. 몇 가지 관례를 읽어보면:

루트에는 프로젝트를 "어떻게 돌리는지"에 관한 파일들(실행 코드, 의존성 목록, 설정)이 모입니다. data/처럼 원본 데이터는 따로 폴더로 빼두는 게 보통입니다 — 코드와 데이터를 섞지 않으면 관리가 쉽습니다. 코드가 길어지면 src/ 아래에 기능별로 파일을 나눕니다. 그리고 점으로 시작하는 것들(.env·.gitignore·.venv/)은 2.6의 숨김 항목이라 탐색기에서 평소엔 안 보입니다.

콜아웃 · 경로는 항상 "루트 기준"으로 생각하기
코드 안에서 data/manual.pdf라고 쓰면, 보통 프로젝트 루트(rag-project/)에서 터미널을 실행한다는 전제의 상대경로입니다. 그래서 RAG 코드를 돌릴 때는 거의 항상 프로젝트 루트로 cd한 뒤 실행합니다. "어느 폴더에서 실행해야 하지?"가 헷갈리면, 답은 대개 "requirements.txt가 보이는 그 폴더"(=루트)입니다.

직접 해보기

탐색기(파일 탐색기)만으로 이 챕터를 손에 익혀봅니다.

  1. 확장자 표시를 켭니다. 위 콜아웃대로 탐색기 "보기" → "파일 확장명"을 체크하세요. (macOS Finder는 환경설정 → 고급 → "모든 파일 확장자 보기".)
  1. 연습용 폴더 트리를 만듭니다. Documents 안에 rag-project 폴더를 만들고, 그 안에 data 폴더를 하나 더 만드세요. 마우스 우클릭 → "새로 만들기" → "폴더"면 됩니다. 2.9의 구조를 흉내 내는 셈입니다.
  1. 절대경로를 직접 확인합니다. 방금 만든 data 폴더로 들어가, 탐색기 상단의 주소 표시줄을 클릭하세요. C:\Users\...\rag-project\data 같은 절대경로가 글자로 보입니다. 이게 2.3의 절대경로입니다. 이 글자를 복사해 두세요 — 3부에서 씁니다.
  1. ..를 눈으로 봅니다. 탐색기의 "뒤로/위로" 화살표가 곧 ..(부모 폴더로 가기)입니다. data에서 위로 가면 rag-project가 나오죠. 그게 ..입니다.
  1. 숨김 파일을 켜봅니다. 탐색기에서 "보기" → "숨긴 항목"을 체크하세요. 평소 안 보이던 점으로 시작하는 항목들이 나타납니다(시스템 폴더에서 특히). 5부에서 만들 .venv도 이렇게 보입니다.
  1. 안전한 이름으로 바꿔봅니다. 만약 연습 폴더 이름에 공백이나 한글이 있다면, rag-project처럼 영문 소문자 + 하이픈으로 바꿔보세요. 2.7의 권장 기본값을 손에 익히는 연습입니다.

이 챕터 한 줄 정리

모든 파일에는 트리 상의 주소(경로)가 있고, 그 주소는 루트에서부터 적는 절대경로이거나 현재 위치(cwd) 기준의 상대경로다. "파일을 못 찾는다"는 대개 cwd가 생각과 달라서이고, 이름은 영문 소문자·하이픈·정확한 확장자로 두는 게 안전하다.

다음 챕터에서는 드디어 터미널을 엽니다. 지금까지 탐색기로 한 일(폴더 이동, 파일 보기)을 글자 명령으로 하게 됩니다.

← 이전: 컴퓨터는 어떻게 일하는가 · 목차 · 다음: 터미널과 친해지기 →