컴퓨터 기본 도구와 개발 환경 입문

목표: “VS Code에서 열고 터미널에서 돌려 보세요”, “PATH에 안 잡혀요”, “가상환경 활성화했어요?”, “서버에 SSH로 붙어서 클론 받으세요” 같은 말을 듣고 각각이 무엇이고 서로 어떻게 이어지는지 알기.

컨테이너와 Docker는 별도 노트 Docker 입문에서 다룬다. 이 노트의 각 절을 더 깊이 다룬 후속 노트는 다음과 같다.


한 줄로 먼저

개발 도구는 “코드를 쓰고 → 실행할 수 있게 만들고 → 실행하고 → 기록하고 나누는” 흐름의 각 단계를 맡는다.

단계질문대표 도구·용어
1. 쓰기어디에 코드를 쓰나?텍스트 에디터, 코드 에디터, IDE
2. 명령하기컴퓨터에 어떻게 지시하나?터미널, 셸, CLI, 경로, 환경 변수
3. 실행하기코드가 어떻게 돌아가나?컴파일러, 인터프리터, 런타임, 프로세스
4. 가져다 쓰기남이 만든 코드를 어떻게 쓰나?라이브러리, 패키지 매니저, 가상환경
5. 기록·공유변경 이력을 어떻게 남기고 나누나?Git, GitHub
6. 원격다른 컴퓨터에서 어떻게 돌리나?SSH, 서버, 포트
[에디터/IDE]에서 main.py 작성
  ↓ 저장 (UTF-8 텍스트 파일)
[터미널]을 열고 [셸]에 명령 입력: python main.py
  ↓ 셸이 PATH에서 python 실행 파일을 찾음
[인터프리터]가 코드를 읽어 실행, 필요한 [패키지]는 [가상환경]에서 불러옴
  ↓
결과 확인 → [Git]으로 커밋 → GitHub에 push → 서버에서 [SSH]로 받아 다시 실행

1. 텍스트 파일과 텍스트 에디터

텍스트 파일은 “글자만” 담는다

코드는 일반 텍스트(plain text) 파일이다. 글꼴, 굵게, 색깔 같은 서식이 전혀 없고 글자만 들어 있다. 에디터에서 코드가 알록달록하게 보이는 것은 에디터가 화면에 칠해 줄 뿐, 파일에는 저장되지 않는다.

구분텍스트 에디터워드프로세서
예메모장, TextEdit(일반 텍스트 모드), VS Code, VimMS Word, 한글, Pages
저장 내용글자만글자 + 서식 + 레이아웃 정보
파일 예.py, .txt, .md, .json.docx, .hwp, .pages
코드 작성가능불가능 (따옴표가 “ ”로 바뀌는 등 코드가 깨짐)

Markdown(.md) 파일도 일반 텍스트다. Obsidian은 텍스트 파일을 예쁘게 보여 주는 에디터라고 볼 수 있다.

인코딩과 줄바꿈

텍스트 파일도 결국 0과 1이다. 글자를 숫자로 바꾸는 약속이 인코딩(encoding) 이다.

  • UTF-8: 지금의 표준. 영어, 한글, 이모지를 전부 담는다. 특별한 이유가 없으면 항상 UTF-8로 저장한다.
  • EUC-KR, CP949: 예전 한국어 Windows 인코딩. 오래된 CSV를 열었을 때 한글이 ÇѱÛ처럼 깨지면 대개 이 인코딩 문제다.
  • BOM: 파일 맨 앞에 붙는 보이지 않는 표시. Windows 메모장 등이 붙이는데, 일부 프로그램은 이것 때문에 첫 줄을 잘못 읽는다.

줄바꿈 문자도 운영체제마다 달랐다.

  • LF (\n): Linux, macOS
  • CRLF (\r\n): Windows

Windows에서 만든 셸 스크립트를 Linux에서 돌리면 \r 때문에 command not found나 bad interpreter 에러가 나는 경우가 있다. 에디터 오른쪽 아래에 보통 UTF-8, LF 같은 표시가 있으니 확인한다.


2. 코드 에디터와 IDE

무엇이 다른가

IDE(Integrated Development Environment, 통합 개발 환경) 는 코드 편집, 실행, 디버깅, 테스트, 버전 관리를 한 프로그램에 모아 둔 것이다. 코드 에디터는 가볍게 시작해서 확장(extension)으로 기능을 덧붙인다. 요즘은 둘의 경계가 흐릿하다.

구분코드 에디터IDE
예VS Code, Sublime Text, Zed, Vim, Emacs, nanoPyCharm, IntelliJ IDEA, Visual Studio, Xcode, Android Studio
시작 상태가볍고 기능이 적음무겁고 기능이 많이 들어 있음
기능 추가확장 설치대부분 내장
언어여러 언어를 두루특정 언어·플랫폼에 특화된 경우가 많음

VS Code는 에디터로 분류되지만, Python 확장, Jupyter 확장, Git 기능, 원격 접속(Remote-SSH) 확장을 깔면 사실상 IDE처럼 쓴다. Cursor, Windsurf 같은 AI 코딩 에디터는 대부분 VS Code를 바탕으로 만들어졌다.

Visual Studio(보라색, Windows 중심의 무거운 IDE)와 Visual Studio Code(파란색, 가벼운 에디터)는 이름만 비슷한 다른 프로그램이다.

에디터·IDE가 해 주는 일

기능무엇
구문 강조 (syntax highlighting)키워드, 문자열, 주석을 색으로 구분
자동 완성변수·함수 이름, 메서드 목록을 제안
정의로 이동 (go to definition)함수 이름을 누르면 그 함수가 정의된 곳으로 이동
린터 (linter)실행 전에 실수·나쁜 습관을 찾아 밑줄 (예: ruff, pylint, ESLint)
포매터 (formatter)들여쓰기·줄바꿈을 정해진 규칙대로 자동 정리 (예: black, ruff format, Prettier)
디버거 (debugger)코드를 한 줄씩 멈춰 가며 변수 값을 확인
내장 터미널에디터 안에서 바로 명령 실행
Git 연동변경 사항 비교, 커밋을 버튼으로

LSP: 에디터가 언어를 “아는” 방법

예전에는 에디터마다 언어별 자동 완성을 따로 만들어야 했다. 지금은 LSP(Language Server Protocol) 라는 공통 규약이 있다. 언어마다 언어 서버(예: Python의 Pylance·Pyright, Rust의 rust-analyzer)가 코드를 분석하고, 에디터는 LSP로 그 결과를 받아 화면에 보여 준다. 그래서 같은 언어 서버를 VS Code, Vim, Zed가 함께 쓸 수 있다.

디버거는 꼭 한 번 써 본다

print()를 여기저기 넣는 대신, 중단점(breakpoint) 을 찍고 디버거로 실행하면 그 줄에서 프로그램이 멈춘다. 멈춘 상태에서 모든 변수 값을 보고, 한 줄씩 진행(step over)하거나 함수 안으로 들어갈(step into) 수 있다. Python에서는 코드에 breakpoint() 한 줄을 넣으면 터미널에서 바로 디버거(pdb)가 열린다.

Jupyter Notebook

.ipynb 파일은 코드를 셀(cell) 단위로 나눠 하나씩 실행하고, 결과(표, 그래프)를 바로 아래에 보여 준다. 데이터 탐색과 실험에 편하다. 대신 셀을 실행한 순서에 따라 상태가 달라지므로, 위에서 아래로 처음부터 다시 실행(Restart & Run All)했을 때 같은 결과가 나오는지 확인하는 습관이 필요하다. 반복해서 쓰는 코드는 .py 파일로 옮긴다.


3. 터미널, 셸, 명령줄

세 단어의 차이

  • CLI(Command-Line Interface): 글자로 명령을 입력하는 방식. 마우스로 누르는 GUI(Graphical User Interface) 의 반대말.
  • 터미널(terminal): 글자를 입력하고 결과를 보여 주는 창 프로그램. macOS의 Terminal, iTerm2, Ghostty, Windows Terminal, VS Code 내장 터미널.
  • 셸(shell): 그 창 안에서 내가 친 명령을 해석하고 실행하는 프로그램. zsh, bash, fish, Windows의 PowerShell.

터미널은 화면이고, 셸은 그 화면 뒤에서 명령을 알아듣는 통역사다. macOS는 Catalina(10.15)부터 기본 셸이 zsh이고, 대부분의 Linux 서버는 bash가 기본이다. 둘은 문법이 거의 같다.

콘솔(console) 은 원래 컴퓨터에 직접 연결된 물리 단말을 뜻했지만, 지금은 터미널과 거의 같은 뜻으로 쓴다.

프롬프트와 명령의 생김새

bagjuhyeon@MacBook ~/projects % ls -la src
└─사용자─┘ └컴퓨터┘ └현재 위치┘ │ └명령┘└옵션┘└인자┘
                              프롬프트 끝 표시 (zsh는 %, bash는 $, root는 #)
  • 옵션(option, flag): - 하나로 시작하는 짧은 형태(-l)와 -- 두 개로 시작하는 긴 형태(--all)가 있다.
  • 대부분의 명령은 명령 --help나 man 명령으로 사용법을 볼 수 있다.

매일 쓰는 명령

pwd                 # 지금 있는 폴더 (print working directory)
ls -la              # 폴더 내용 보기 (숨김 파일 포함, 자세히)
cd projects         # 폴더 이동
cd ..               # 한 단계 위로
mkdir data          # 폴더 만들기
cp a.txt b.txt      # 복사
mv a.txt old/       # 이동 또는 이름 바꾸기
rm a.txt            # 삭제 (휴지통을 거치지 않음!)
cat file.txt        # 파일 내용 출력
less file.txt       # 긴 파일을 페이지 단위로 보기 (q로 종료)
grep "error" log.txt   # 파일에서 글자 찾기
which python        # 이 명령이 실제로 어느 파일을 실행하는지

rm은 되돌릴 수 없다. 특히 rm -rf(폴더째, 묻지 않고 강제로)는 경로를 두 번 확인한 뒤에 쓴다.

파이프와 리다이렉션

셸의 힘은 작은 명령을 이어 붙이는 데 있다.

cat log.txt | grep "error" | wc -l   # | : 앞 명령의 출력을 뒤 명령의 입력으로
python train.py > out.log            # > : 출력을 파일로 (덮어쓰기)
python train.py >> out.log           # >> : 파일 끝에 덧붙이기
python train.py 2> err.log           # 2> : 에러 출력만 파일로
python train.py > all.log 2>&1       # 일반 출력과 에러를 한 파일로

프로그램의 출력은 표준 출력(stdout) 과 표준 에러(stderr) 두 갈래로 나뉜다. >만 쓰면 에러는 파일에 안 남고 화면에 계속 뜨는 이유다.


4. 경로와 환경 변수

경로(path)

파일의 위치를 나타내는 주소다.

표기뜻
/맨 꼭대기 폴더(루트). macOS·Linux의 모든 경로는 여기서 시작
~내 홈 폴더 (/Users/이름, Linux는 /home/이름)
.지금 폴더
..한 단계 위 폴더
/Users/me/a.txt절대 경로: 루트부터 쓴 주소. 어디서 실행해도 같은 곳
data/a.txt상대 경로: 지금 폴더 기준 주소. 실행 위치가 바뀌면 다른 곳을 가리킴

“내 컴퓨터에서는 파일을 찾는데 서버에서는 못 찾는다”는 문제의 상당수가 상대 경로 문제다. 코드가 어느 폴더에서 실행됐는지(현재 작업 디렉터리)에 따라 상대 경로의 뜻이 달라진다.

Windows는 C:\Users\me\a.txt처럼 드라이브 문자와 역슬래시(\)를 쓴다. 경로에 공백이 있으면 셸에서는 따옴표로 감싸야 한다(cd "My Documents").

숨김 파일

이름이 .으로 시작하는 파일(.git, .env, .zshrc)은 기본적으로 숨겨진다. 설정 파일이 대부분 이런 형태다. ls -a로 볼 수 있다.

환경 변수(environment variable)

프로그램이 실행될 때 함께 전달되는 이름=값 설정이다.

echo $HOME              # 홈 폴더
echo $PATH              # 명령을 찾을 폴더 목록
export API_KEY=abc123   # 이 셸과 여기서 실행하는 프로그램에 전달
  • 코드에 비밀번호·API 키를 직접 쓰지 않고 환경 변수로 넘기는 것이 기본 습관이다.
  • export로 설정한 값은 그 터미널 창에서만 유지된다. 창을 닫으면 사라진다. 계속 쓰려면 셸 설정 파일(~/.zshrc, ~/.bashrc)에 적는다.
  • .env 파일은 환경 변수를 모아 둔 텍스트 파일이다. 비밀 정보가 들어 있으므로 Git에 올리지 않는다.

PATH: “command not found”의 정체

터미널에 python이라고 치면 셸은 PATH에 적힌 폴더들을 앞에서부터 순서대로 뒤져서 python이라는 실행 파일을 찾는다.

PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin
        ↑ 여기 먼저 찾고         ↑ 없으면 여기...
  • 어디에도 없으면 command not found.
  • 같은 이름이 여러 곳에 있으면 앞쪽 것이 실행된다. “분명 설치했는데 옛날 버전이 돈다”는 문제의 원인이다.
  • which python(또는 type python)으로 실제로 무엇이 실행되는지 확인할 수 있다.

5. 코드가 실행되는 방식

소스 코드, 기계어, 그리고 그 사이

CPU는 사람이 쓴 코드를 바로 이해하지 못한다. CPU가 아는 것은 기계어(0과 1로 된 명령)뿐이다. 그 사이를 잇는 방식이 두 가지다.

구분컴파일러 (compiler)인터프리터 (interpreter)
방식실행 전에 코드 전체를 기계어로 번역해 실행 파일을 만듦실행하면서 코드를 읽고 바로 처리
대표 언어C, C++, Rust, GoPython, JavaScript, R, 셸 스크립트
장점빠름, 실행할 때 원본 코드가 필요 없음고치고 바로 실행, 대화형으로 쓰기 쉬움
단점고칠 때마다 다시 컴파일상대적으로 느림
에러 발견문법·타입 에러를 컴파일 때 미리그 줄을 실행해야 발견

실제로는 중간 형태가 많다.

  • Python(정확히는 CPython)은 코드를 먼저 바이트코드(.pyc, 가상 기계용 중간 코드)로 바꾼 뒤 그것을 해석해서 실행한다. __pycache__ 폴더가 그 흔적이다.
  • Java는 바이트코드로 컴파일한 뒤 JVM(Java Virtual Machine)이 실행한다. 그래서 같은 .jar 파일이 여러 운영체제에서 돈다.
  • JavaScript 엔진(V8 등)과 PyPy는 실행 중에 자주 쓰는 부분을 기계어로 바꾸는 JIT(Just-In-Time) 컴파일을 쓴다.

Python 과학 패키지(numpy, torch)가 빠른 이유는 무거운 계산 부분이 C·C++·CUDA로 미리 컴파일돼 있고, Python은 그 함수를 불러 쓰기만 하기 때문이다.

런타임, 프로세스, 스레드

  • 런타임(runtime): 프로그램이 실행되는 동안, 또는 실행에 필요한 환경. “Node.js 런타임”, “런타임 에러(실행 중 에러)“처럼 쓴다.
  • 프로세스(process): 실행 중인 프로그램 하나. 운영체제가 메모리와 번호(PID)를 따로 준다. ps, top, htop, macOS의 활성 상태 보기로 볼 수 있다.
  • 스레드(thread): 한 프로세스 안에서 동시에 도는 실행 흐름. 같은 메모리를 함께 쓴다.

멈춘 프로그램은 터미널에서 Ctrl+C로 중단한다. 그래도 안 꺼지면 kill PID로 종료한다.

에러 메시지 읽는 법

Python의 에러 출력(traceback, 스택 추적)은 맨 아래부터 읽는다.

Traceback (most recent call last):
  File "main.py", line 10, in <module>
    run()
  File "main.py", line 6, in run
    x = load("data.csv")
  File "main.py", line 2, in load
    return open(path).read()
FileNotFoundError: [Errno 2] No such file or directory: 'data.csv'
  1. 맨 마지막 줄이 무슨 에러인지다. 여기서는 파일을 못 찾았다.
  2. 바로 위가 에러가 난 위치다(main.py의 2번째 줄).
  3. 더 위로 올라가면 그 줄이 어떤 경로로 불렸는지가 나온다.

에러를 검색하거나 남에게 물어볼 때는 이 마지막 줄을 그대로 복사한다.


6. 라이브러리, 패키지, 패키지 매니저

용어

용어뜻
모듈 (module)코드 파일 하나 (Python에서는 .py 하나)
패키지 (package)모듈 여러 개를 묶어 배포할 수 있게 만든 것
라이브러리 (library)남이 쓸 수 있게 만든 기능 모음. 내 코드가 필요할 때 불러 쓴다
프레임워크 (framework)전체 뼈대를 정해 두고 내 코드를 그 안에 끼워 넣는 구조 (예: Django, React, PyTorch Lightning)
의존성 (dependency)내 코드가 돌아가려면 필요한 다른 패키지
API프로그램끼리 기능을 주고받는 약속된 창구. 라이브러리의 함수 목록도, 웹 서버의 요청 주소 목록도 API라고 부름
SDK특정 플랫폼·서비스용 개발 도구 묶음 (라이브러리 + 도구 + 문서)

라이브러리와 프레임워크의 차이는 누가 주도권을 쥐느냐다. 라이브러리는 내 코드가 부르고, 프레임워크는 프레임워크가 내 코드를 부른다.

패키지 매니저

패키지를 찾아서 설치하고, 그 패키지가 필요로 하는 다른 패키지까지 맞는 버전으로 깔아 주는 도구다.

대상도구설치 명령 예
Pythonpip, uv, condapip install numpy
JavaScriptnpm, pnpm, yarnnpm install react
macOS 프로그램Homebrew (brew)brew install ffmpeg
Ubuntu·Debianaptsudo apt install ffmpeg
Rustcargocargo add serde

언어 패키지 매니저(pip)와 시스템 패키지 매니저(brew, apt)는 맡는 층이 다르다. pip는 Python 패키지만 깔고, ffmpeg 같은 시스템 프로그램은 brew나 apt가 깐다. conda는 그 둘을 어느 정도 함께 다룬다.

버전 표기 (Semantic Versioning)

2.1.3 같은 번호는 보통 MAJOR.MINOR.PATCH다.

  • MAJOR(2): 기존 코드가 깨질 수 있는 큰 변경
  • MINOR(1): 기능 추가, 기존 코드는 그대로 동작
  • PATCH(3): 버그 수정

numpy>=1.24,<2처럼 범위를 적어 두면 “1.24 이상, 2 미만”만 허용한다. 실험을 재현하려면 실제로 설치된 정확한 버전을 기록해 둔다(pip freeze > requirements.txt, 또는 uv.lock, poetry.lock 같은 잠금 파일(lock file)).


7. 가상환경

프로젝트 A는 torch 2.1, 프로젝트 B는 torch 2.4가 필요하면 컴퓨터 하나에 둘을 동시에 설치할 수 없다. 가상환경(virtual environment) 은 프로젝트마다 패키지를 따로 담는 독립된 폴더를 만들어 이 충돌을 막는다.

# 표준 venv
python3 -m venv .venv          # 현재 폴더에 .venv 가상환경 만들기
source .venv/bin/activate      # 활성화 (프롬프트 앞에 (.venv) 표시)
pip install -r requirements.txt
deactivate                     # 비활성화
 
# conda
conda create -n myproj python=3.11
conda activate myproj
 
# uv (빠른 최신 도구)
uv venv
uv pip install numpy

활성화(activate) 는 PATH 맨 앞에 가상환경 폴더를 끼워 넣는 일이다. 그래서 활성화하면 python이 가상환경 안의 Python을 가리킨다. “패키지를 설치했는데 import가 안 된다”면 대개 다른 환경에 설치했거나, 에디터가 다른 Python을 쓰고 있는 경우다. which python과 에디터의 인터프리터 선택(VS Code 오른쪽 아래)을 확인한다.

격리 수준도구무엇을 격리하나
낮음venv, uvPython 패키지
중간condaPython 버전 + 패키지 + 일부 시스템 라이브러리(CUDA 런타임 등)
높음Docker커널을 뺀 운영체제 환경 전체 (Docker 입문)
매우 높음가상머신운영체제 전체 (커널 포함)

.venv 폴더는 Git에 올리지 않는다. 대신 requirements.txt나 잠금 파일을 올려서 다른 사람이 같은 환경을 다시 만들게 한다.


8. Git과 GitHub

Git은 도구, GitHub는 서비스

  • Git: 파일의 변경 이력을 기록하는 버전 관리 프로그램. 내 컴퓨터에서 인터넷 없이도 돈다.
  • GitHub: Git 저장소를 인터넷에 올려 두고 함께 작업하는 웹 서비스. 비슷한 서비스로 GitLab, Bitbucket이 있다.

“최종_진짜최종_v3.docx” 대신, 저장 시점마다 무엇을 왜 바꿨는지 기록을 남기고, 언제든 예전 상태로 돌아갈 수 있게 해 준다.

핵심 용어

용어뜻
저장소 (repository, repo)Git이 이력을 관리하는 프로젝트 폴더. 안에 숨김 폴더 .git이 있음
커밋 (commit)특정 시점의 변경 묶음을 메시지와 함께 저장한 기록
스테이징 (staging)다음 커밋에 넣을 변경을 고르는 단계 (git add)
브랜치 (branch)이력의 갈래. 본선(main)을 건드리지 않고 따로 작업할 때
병합 (merge)브랜치의 변경을 다른 브랜치에 합치기
충돌 (conflict)두 갈래가 같은 줄을 다르게 고쳐서 Git이 자동으로 못 합치는 상황
원격 (remote)GitHub처럼 다른 곳에 있는 같은 저장소. 기본 이름 origin
clone / push / pull원격 저장소 복사해 오기 / 내 커밋 올리기 / 원격 변경 받아오기
PR (Pull Request)GitHub에서 “내 브랜치를 합쳐 주세요”라고 요청하고 리뷰받는 기능
.gitignoreGit이 무시할 파일 목록 (.venv, .env, 데이터, 체크포인트)

기본 흐름

git clone https://github.com/user/repo.git   # 처음 받기
cd repo
git status                  # 무엇이 바뀌었는지
git diff                    # 바뀐 내용 자세히
git add train.py            # 커밋할 파일 고르기
git commit -m "학습률 스케줄러 추가"
git push                    # GitHub에 올리기
git pull                    # 남이 올린 것 받아오기
git log --oneline           # 이력 보기

Git은 텍스트 파일의 줄 단위 변경을 추적하도록 만들어졌다. 큰 데이터셋이나 모델 가중치 파일은 Git에 넣지 않는다. 필요하면 Git LFS, Hugging Face Hub, DVC 같은 별도 도구를 쓴다.


9. SSH와 원격 서버

연구실 GPU 서버나 클라우드 컴퓨터는 내 앞에 화면이 없다. SSH(Secure Shell) 는 네트워크 너머의 컴퓨터에 암호화된 연결로 접속해서, 그 컴퓨터의 셸을 내 터미널에서 쓰게 해 준다.

ssh juhyeon@gpu-server.example.ac.kr        # 접속
ssh -p 2222 juhyeon@123.45.67.89            # 포트가 22가 아닐 때
scp model.pt juhyeon@server:~/ckpt/         # 파일 복사 (내 컴퓨터 → 서버)
rsync -avz data/ juhyeon@server:~/data/     # 폴더 동기화 (바뀐 것만 전송)

비밀번호 대신 키

SSH 키는 개인키(private key) 와 공개키(public key) 한 쌍이다.

ssh-keygen -t ed25519          # ~/.ssh/id_ed25519(개인키), id_ed25519.pub(공개키) 생성
ssh-copy-id juhyeon@server     # 공개키를 서버에 등록

공개키는 서버나 GitHub에 마음껏 등록해도 된다. 개인키는 절대 남에게 주거나 업로드하지 않는다. 개인키가 곧 열쇠다.

~/.ssh/config에 별명을 적어 두면 ssh gpu처럼 짧게 접속할 수 있고, VS Code의 Remote-SSH도 이 파일을 읽는다.

Host gpu
    HostName gpu-server.example.ac.kr
    User juhyeon
    Port 22
    IdentityFile ~/.ssh/id_ed25519

접속이 끊겨도 계속 돌리기

SSH로 학습을 돌리다 노트북을 닫으면 연결이 끊기고, 그 셸에서 돌던 프로그램도 같이 죽을 수 있다. tmux 나 screen을 쓰면 서버 쪽에 셸을 띄워 둔 채로 나왔다가 다시 붙을 수 있다.

tmux new -s train       # 새 세션
python train.py         # 학습 시작
# Ctrl+B 누른 뒤 D : 세션에서 빠져나오기 (프로그램은 계속 돎)
tmux attach -t train    # 다시 붙기

서버, 클라이언트, 포트, localhost

  • 서버(server): 요청을 기다렸다가 응답하는 쪽. 프로그램을 뜻하기도 하고 그 프로그램이 도는 컴퓨터를 뜻하기도 한다.
  • 클라이언트(client): 요청을 보내는 쪽. 브라우저, ssh 명령, 앱.
  • IP 주소: 네트워크에서 컴퓨터의 주소. 도메인(google.com)은 사람이 읽기 쉬운 별명이고, DNS가 이를 IP로 바꿔 준다.
  • 포트(port): 한 컴퓨터 안에서 어느 프로그램과 통신할지 정하는 번호(0~65535). SSH 22, HTTP 80, HTTPS 443, Jupyter 기본 8888.
  • localhost(127.0.0.1): “이 컴퓨터 자신”을 가리키는 주소. localhost:8888은 내 컴퓨터의 8888번 포트에 떠 있는 프로그램이다.

서버에서 띄운 Jupyter를 내 브라우저로 보려면 포트 포워딩을 쓴다.

ssh -L 8888:localhost:8888 gpu
# 내 컴퓨터의 8888번 포트를 서버의 localhost:8888로 연결
# 이제 내 브라우저에서 http://localhost:8888

10. 자주 만나는 데이터 파일 형식

모두 일반 텍스트라서 에디터로 열 수 있다.

형식생김새주로 쓰는 곳
CSVname,age 줄마다 쉼표로 구분표 데이터, 엑셀 내보내기
JSON{"name": "A", "age": 3}웹 API 응답, 설정, 데이터 교환
JSONL한 줄에 JSON 객체 하나LLM 학습·평가 데이터셋
YAMLname: A 들여쓰기로 구조 표현설정 파일, Docker Compose, GitHub Actions, Obsidian frontmatter
TOML[section] + key = "value"pyproject.toml, Rust Cargo.toml
Markdown# 제목, **굵게**, - 목록README, 문서, Obsidian 노트

YAML은 들여쓰기가 문법이다. 탭 대신 공백을 쓰고, 콜론 뒤에 공백 한 칸을 둔다. 들여쓰기가 한 칸만 어긋나도 파일 전체를 못 읽는 경우가 있다.


11. 아주 짧은 암기

  • 코드는 서식 없는 텍스트 파일. UTF-8, LF로 저장한다.
  • IDE = 편집 + 실행 + 디버깅 + 도구를 한 곳에. VS Code는 에디터지만 확장으로 IDE처럼 쓴다.
  • 터미널은 창, 셸은 그 안의 통역사. macOS 기본 셸은 zsh, 서버는 대개 bash.
  • command not found와 “옛날 버전이 돈다”는 PATH 문제. which로 확인.
  • 상대 경로는 실행한 위치 기준. 서버에서 파일을 못 찾으면 먼저 의심.
  • 컴파일러는 미리 번역, 인터프리터는 실행하며 해석. Python은 바이트코드를 해석한다.
  • traceback은 맨 아래부터 읽는다.
  • 가상환경 = 프로젝트별 패키지 상자. 활성화는 PATH 맨 앞에 끼워 넣기.
  • Git은 이력 관리 도구, GitHub는 그걸 올리는 웹 서비스.
  • SSH 개인키는 절대 공유하지 않는다. 오래 도는 작업은 tmux 안에서.
  • localhost는 지금 그 명령이 도는 컴퓨터 자신.

입문자가 조심할 점

  • sudo와 rm -rf는 신중하게. sudo는 관리자 권한으로 실행하라는 뜻이다. 인터넷에서 복사한 명령에 sudo가 붙어 있으면 무엇을 하는지 알고 나서 실행한다. 특히 curl ... | sudo bash 형태는 출처를 확인한다.
  • 비밀 정보를 코드와 Git에 넣지 않는다. API 키, 비밀번호, SSH 개인키, .env는 .gitignore에 넣는다. 한 번 GitHub에 올라간 키는 커밋을 지워도 이미 노출된 것으로 보고 새로 발급받는다.
  • 시스템 Python을 건드리지 않는다. macOS·Linux에 기본으로 깔린 Python에 sudo pip install을 하면 운영체제 도구가 깨질 수 있다. 항상 가상환경을 만들어 쓴다.
  • 환경을 기록한다. 실험 결과와 함께 Python 버전, 패키지 버전(잠금 파일), Git 커밋 해시를 남겨 두면 몇 달 뒤에도 같은 결과를 다시 낼 수 있다.
  • 에러 메시지를 끝까지 읽는다. 대부분의 에러는 마지막 줄에 원인이 거의 그대로 적혀 있다.

출처