Devin.KR

실습 폴더와 파일 만들기

55분 안팎

학습 목표

파일·폴더·확장자와 작업 디렉터리를 구분합니다.

개념

왜 작업 공간부터 만드는가

독서 기록 프로그램을 배우기 전에 파일을 어디에 두었는지 설명할 수 있어야 합니다. 제목이 화면에 나오지 않는 이유는 계산식보다 잘못 선택한 폴더에 있을 때가 있습니다. 신입에게 처음 맡기는 일은 많은 파일을 만드는 일이 아니라, 자신이 바꾼 파일과 실행한 파일이 같은지 확인하는 일입니다. 이번 레슨에서는 별도 실습 폴더를 만들고 그 안의 자료·결과·검사를 구분합니다. 개인 문서나 저장소 원본이 섞인 폴더 대신 내려받은 starter를 사용할 빈 폴더를 선택합니다.

파일·폴더·확장자의 구분

파일은 이름으로 찾아 읽거나 쓰는 데이터의 단위입니다. 폴더는 파일과 하위 폴더를 묶는 디렉터리입니다. data는 입력 자료를, reports는 나중에 만들 결과를, tests는 기대 동작을 검사할 코드를 담습니다. 이름은 역할을 알려 주는 약속이며 운영체제가 data라는 이름에 특별한 기능을 부여하지는 않습니다. app.py는 실행할 소스 파일이고 sample.txt는 읽을 제목입니다. 확장자는 파일 이름 끝의 표시입니다. .py로 이름만 바꾼 문서가 올바른 Python 소스로 변하지 않듯이, 내용과 실행 도구를 함께 확인해야 합니다.

현재 위치와 명령의 대상

터미널은 글자로 명령을 주고 결과를 받는 창입니다. 셸은 입력한 명령을 해석해 실행하는 프로그램입니다. pwd는 현재 작업 디렉터리를 표시하고, cd는 그 위치를 바꾸며, ls는 해당 위치의 항목을 나열합니다. 터미널을 새로 열면 이전 창과 다른 위치일 수 있습니다. 편집기에서 폴더를 선택한 것과 터미널의 위치 변경도 별개일 수 있습니다. 명령 앞에 화면에 표시된 프롬프트나 달러 기호를 붙여 입력하지 않습니다. 따라하기는 Bash 또는 zsh가 있는 macOS·Linux 터미널을 기준으로 합니다. Windows에서는 WSL의 Bash 환경에서 같은 명령을 사용합니다.

구조를 만드는 명령

mkdir -p data reports tests는 현재 위치에 세 디렉터리를 준비합니다. -p는 이미 있는 디렉터리를 다시 만들 때 오류로 멈추지 않게 하고 필요한 부모 경로도 만듭니다. 다만 같은 이름의 일반 파일이 있으면 디렉터리로 바꾸지 못합니다. File exists가 나오면 ls -ld data로 종류를 확인합니다. 이름 충돌을 해결하려고 기존 내용을 바로 삭제하지 말고 새 실습 위치를 선택합니다. 이 수업의 prepare.sh는 실행한 위치에 자료를 만드므로, 어느 위치에서 실행할지를 먼저 정해야 합니다. 스크립트 위치가 곧 작업 디렉터리라는 가정을 하지 않습니다.

문자열을 파일에 넣고 확인하기

printf 명령은 지정한 형식으로 텍스트를 출력합니다. 출력 뒤의 > data/sample.txt는 터미널 대신 파일로 보내며 이미 있는 파일을 덮어씁니다. 그래서 이번 고정 샘플에만 사용합니다. 명령의 출력이 없다는 사실만으로 파일이 없다고 판단하지 않습니다. cat data/sample.txt로 내용을 읽고 find . -type f로 파일 경로를 찾습니다. 마지막 줄바꿈은 텍스트 파일을 다른 도구로 읽을 때 줄의 끝을 명확하게 합니다. 한글 제목은 UTF-8로 저장하고 편집기의 인코딩 표시도 확인합니다. 깨진 글자가 보이면 같은 제목을 다시 입력하기 전에 파일 인코딩과 터미널 표시 설정을 구분합니다.

공백과 따옴표

독서 기록처럼 폴더 이름에 공백이 있으면 셸은 따옴표 없는 이름을 여러 인자로 나눌 수 있습니다. cd "독서 기록"처럼 전체 경로를 큰따옴표로 감쌉니다. 파일명 대소문자도 정확히 적습니다. 어떤 디스크에서는 Sample.txt와 sample.txt가 같게 보일 수 있지만 다른 환경에서는 별개입니다. 우리 프로젝트의 계약은 data/sample.txt로 고정합니다. 작업 문서를 쓸 때도 철자와 대소문자를 동일하게 유지합니다. 환경의 관대한 동작에 의존하지 않는 습관은 다른 사람에게 프로젝트를 전달할 때 도움이 됩니다.

오류를 읽는 순서

No such file or directory는 요청한 경로가 현재 기준에서 존재하지 않는다는 신호입니다. Permission denied는 대상에 접근할 권한이 없거나 실행 방식이 맞지 않다는 신호입니다. 이 레슨에서는 bash prepare.sh로 실행하므로 스크립트의 직접 실행 권한을 요구하지 않습니다. 오류가 났을 때 명령 전체, pwd 결과, 찾던 이름을 함께 적습니다. 성공했던 다른 폴더와 비교하면 위치 차이를 찾기 쉽습니다. 검사가 실패하면 FAIL reports 디렉터리처럼 대상이 표시됩니다. 검사기를 수정해 통과시키는 대신 해당 산출물을 준비합니다.

재실행 가능한 준비와 완료 기준

prepare.sh는 같은 빈 실습 공간에서 두 번 실행해도 같은 구조가 나와야 합니다. 이를 위해 mkdir -p와 고정 샘플 덮어쓰기를 사용하지만, 이런 전략이 모든 사용자 데이터에도 적합한 것은 아닙니다. 실제 독서 기록의 누적 저장은 뒤 모듈에서 따로 구현합니다. 이번 검사기는 공백이 있는 임시 폴더에 산출물을 만들고 디렉터리인지, 제목이 정확한지, app.py가 파일인지 확인합니다. 시작 코드는 일부 구조를 이미 만들지만 reports와 app.py가 빠져 있습니다. TODO를 채우고 두 번의 준비 검사가 모두 PASS인지 확인합니다. 폴더를 만들었다는 말보다 어떤 경로가 어떤 종류이며 무엇을 담는지 설명할 수 있으면 목표를 달성한 것입니다.

미션에 이어 붙이는 방법

레슨 실습과 모듈 미션은 서로 다른 내려받기입니다. 레슨에서 연습한 prepare.sh를 미션에 그대로 실행해 완성된 app.py를 덮어쓰지 않습니다. 미션에는 검사 코드와 첫 실행 코드가 이미 있고 수정할 지점이 따로 표시됩니다. 여기서 배운 구조를 기준으로 필요한 폴더가 있는지 점검합니다. 입력 파일과 검사 파일을 한 폴더에 무작위로 넣으면 이후 CSV·JSON 자료가 늘어날 때 찾기 어렵습니다. 폴더 역할을 짧게 메모하고, 나중에 새 파일을 만들 때 그 역할에 맞는 위치를 선택합니다. 정리 목적은 보기 좋은 목록보다 실행을 반복해도 같은 자료를 찾는 데 있습니다.

따라하기

빈 연습 폴더 준비

이 레슨의 네 단계를 같은 터미널에서 순서대로 실행합니다. reading-demo는 개인 파일이 없는 새 연습 폴더입니다.

mkdir -p reading-demo
cd reading-demo
mkdir -p data reports tests
ls -d data reports tests

실행 결과

data
reports
tests

샘플 저장

고정 샘플 파일에만 덮어쓰기를 사용합니다.

printf "달빛 도서관\n" > data/sample.txt
cat data/sample.txt

실행 결과

달빛 도서관

첫 소스 준비

확장자와 폴더 종류를 구분합니다. tests 폴더는 아직 비어 있습니다.

printf 'print("독서 기록 시작")\n' > app.py
find . -type f | sort

실행 결과

./app.py
./data/sample.txt

준비 재실행

같은 구조가 유지되는지 확인합니다. 레슨 starter를 풀어 prepare.sh의 TODO를 채운 다음 bash check.sh를 실행합니다.

mkdir -p data reports tests
ls -d data reports tests

실행 결과

data
reports
tests

확인 문제

실습

prepare.sh의 TODO를 채워 reports와 app.py를 만듭니다. 기존 data와 tests 생성 및 제목 쓰기는 유지합니다. 두 번 실행해 같은 구조인지 확인합니다. starter의 README.md에서 실행 방법과 검사 대상을 확인합니다. tests/check.py와 check.sh는 변경하지 않습니다. 일부 검사가 실패하는 시작 상태를 확인한 뒤 수정하고 다시 검사합니다.

시작 코드·테스트 내려받기

실행 명령

bash check.sh

기대 결과

모든 검사 줄이 PASS이며 마지막 줄은 ALL PASS, 종료 코드는 0입니다.

모범 답안모범 답안 내려받기

더 읽기

면접 질문

  • 파일 경로 때문에 실행이 실패했을 때 확인 순서를 설명합니다.