03. 리눅스 개발 환경 세팅하기¶
"개발 환경은 요리사의 주방과 같아요. 도구가 잘 갖춰져 있으면 요리(코딩)가 즐거워집니다!"
이 문서에서는 리눅스에서 코딩을 시작하기 위해 필요한 도구들을 하나씩 설치하고 설정해봅니다. 처음에는 명령어가 많아 보여도, 하나씩 따라 하다 보면 금방 익숙해질 거예요.
목차¶
- 개발 필수 패키지
- Node.js 설치 (nvm)
- Python 설치 (pyenv)
- Docker 기초
- SSH 설정
- 방화벽 기초 (ufw)
- 에디터 - Vim과 nano
- 버전 관리 도구 요약
- WSL2 특화 팁
- 개발 환경 한 번에 설정 스크립트
- 실습 미션
1. 개발 필수 패키지¶
가장 먼저, 개발의 기본이 되는 패키지들을 설치합니다.
sudo apt update
sudo apt install -y build-essential curl wget git vim nano
각 패키지가 뭔가요?¶
build-essential -- 컴파일 도구 모음
build-essential은 C/C++ 프로그램을 컴파일하고 빌드하는 데 필요한 도구들을 한 번에 설치해주는 메타 패키지입니다. 다음이 포함됩니다:
| 도구 | 역할 |
|---|---|
gcc |
C 컴파일러 (C 코드를 기계어로 번역) |
g++ |
C++ 컴파일러 |
make |
빌드 자동화 도구 (Makefile을 읽고 컴파일 순서를 관리) |
libc-dev |
C 표준 라이브러리 헤더 파일 |
나중에 Python이나 Node.js 모듈을 설치할 때 내부적으로 gcc가 필요한 경우가 많습니다. 그래서 가장 먼저 설치하는 게 좋습니다.
curl vs wget -- 둘 다 파일 다운로드 도구인데 차이가 있나요?
curl |
wget |
|
|---|---|---|
| 기본 동작 | 결과를 터미널에 출력 | 파일로 바로 저장 |
| 재시도 | 기본적으로 안 함 | 네트워크 끊기면 자동 재시도 |
| 재귀 다운로드 | 안 됨 | 됨 (웹사이트 전체 미러링 가능) |
| 프로토콜 | HTTP, HTTPS, FTP, SFTP 등 매우 다양 | HTTP, HTTPS, FTP |
| API 테스트 | 자주 쓰임 (curl -X POST ...) |
거의 안 씀 |
간단히 말하면: - curl: API 테스트하거나 스크립트 안에서 다운로드할 때 주로 사용 - wget: 큰 파일을 다운로드하거나 웹사이트를 통째로 긁어올 때 주로 사용
# curl로 파일 다운로드 ( -o 옵션으로 파일명 지정 )
curl -o hello.txt https://example.com/hello.txt
# wget으로 파일 다운로드 (자동으로 파일로 저장됨)
wget https://example.com/hello.txt
2. Node.js 설치 (nvm)¶
nvm이 뭐예요?¶
nvm은 Node Version Manager의 약자입니다. Node.js의 여러 버전을 설치하고 쉽게 전환할 수 있게 해주는 도구예요.
왜 필요할까요? 프로젝트마다 필요한 Node.js 버전이 다를 수 있습니다: - A 프로젝트는 Node.js 18 필요 - B 프로젝트는 Node.js 22 필요
nvm이 없으면 버전을 바꿀 때마다 Node.js를 지웠다 깔았다 해야 하지만, nvm을 쓰면 명령어 하나로 전환할 수 있습니다.
nvm 설치¶
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
설치 후, 터미널을 다시 열거나 다음 명령어로 설정을 적용합니다:
source ~/.zshrc
참고: 만약 bash를 사용 중이라면
source ~/.bashrc를 실행하세요.
설치가 잘 되었는지 확인:
nvm --version
# 0.40.1 같은 버전 번호가 나오면 성공!
nvm 사용법¶
# 최신 LTS 버전 설치
nvm install 22
# 다른 버전도 설치해보기
nvm install 20
# 사용할 버전 전환
nvm use 22
# 설치된 버전 목록 보기
nvm ls
# 기본 버전 설정 (새 터미널을 열 때마다 이 버전이 사용됨)
nvm alias default 22
# 설치 가능한 버전 전체 보기
nvm ls-remote
npm 기초 -- Node.js의 패키지 관리자¶
npm(Node Package Manager)은 Node.js와 함께 설치됩니다. 다른 사람이 만든 유용한 코드(패키지)를 쉽게 가져다 쓸 수 있게 해줍니다.
# 새 프로젝트 시작하기 (package.json 파일이 생성됨)
mkdir my-project
cd my-project
npm init -y
# 패키지 설치하기 (예: express 웹 프레임워크)
npm install express
# 개발용으로만 필요한 패키지 설치
npm install --save-dev jest
# package.json에 정의된 스크립트 실행
npm run start
npm test
package.json이 뭔가요? 프로젝트의 명세서 같은 거예요. 프로젝트 이름, 버전, 필요한 패키지 목록 등이 적혀 있습니다.
my-project/
package.json # 프로젝트 정보와 의존성 목록
package-lock.json # 설치된 패키지의 정확한 버전 기록 (자동 생성됨)
node_modules/ # 설치된 패키지들이 들어있는 폴더 (자동 생성됨)
Troubleshooting:
nvm: command not found가 나오면 터미널을 완전히 닫았다가 다시 열어보세요. 그래도 안 되면~/.zshrc(또는~/.bashrc) 파일에 nvm 설정이 들어갔는지 확인해보세요:cat ~/.zshrc | grep nvm
3. Python 설치 (pyenv)¶
pyenv가 뭔가요?¶
pyenv는 Python 버전 관리 도구입니다. nvm이 Node.js 버전을 관리하듯, pyenv는 Python 버전을 관리합니다.
리눅스에는 이미 Python이 설치되어 있을 수 있지만, 시스템 Python은 건드리면 안 됩니다 (운영체제가 사용 중일 수 있어요!). 그래서 pyenv로 내가 원하는 버전을 따로 설치해서 사용합니다.
의존성 먼저 설치¶
Python을 컴파일하는 데 필요한 라이브러리들을 먼저 설치합니다:
sudo apt update
sudo apt install -y build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl git \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \
libffi-dev liblzma-dev
각 라이브러리가 뭔지 궁금하겠지만, 지금은 "Python 컴파일에 필요한 재료들" 정도로 생각하세요. 나중에 하나씩 알아가도 됩니다!
pyenv 설치¶
curl https://pyenv.run | bash
설치 후, 셸 설정 파일(~/.zshrc)에 다음 내용을 추가합니다:
# ~/.zshrc 파일에 다음 줄을 추가하세요
nano ~/.zshrc
파일 맨 아래에 다음을 추가:
# pyenv 설정
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
저장한 후 설정 적용:
source ~/.zshrc
설치 확인:
pyenv --version
# pyenv 2.X.X 같은 버전 번호가 나오면 성공!
pyenv 사용법¶
# 설치 가능한 Python 버전 목록 보기
pyenv install --list
# 특정 버전 설치 (시간이 좀 걸려요 -- 컴파일하거든요!)
pyenv install 3.12.0
# 전역으로 사용할 버전 설정
pyenv global 3.12.0
# 현재 설정된 버전 확인
python --version
# Python 3.12.0
# 설치된 모든 버전 보기
pyenv versions
가상환경 -- 프로젝트마다 독립된 공간 만들기¶
Python에서 가상환경(Virtual Environment)은 아주 중요한 개념입니다.
왜 가상환경이 필요할까요?
예를 들어볼게요:
- 프로젝트 A는 requests 버전 2.28이 필요
- 프로젝트 B는 requests 버전 2.31이 필요
가상환경이 없으면 충돌이 발생합니다. 가상환경을 쓰면 각 프로젝트마다 독립된 패키지 설치 공간을 가질 수 있습니다.
비유하자면:
가상환경은 "개인 방" 같은 거예요.
각 방마다 가구(패키지)를 따로 배치할 수 있어요.
거실(시스템 Python)의 가구와 섞이지 않아요!
# 프로젝트 폴더 만들기
mkdir my-python-project
cd my-python-project
# 가상환경 만들기 (myenv라는 이름으로)
python -m venv myenv
# 가상환경 활성화
source myenv/bin/activate
# 활성화되면 프롬프트가 이렇게 바뀝니다:
# (myenv) leo@computer:~/my-python-project$
# 이제 패키지를 마음대로 설치!
pip install requests
# 작업이 끝나면 비활성화
deactivate
Troubleshooting:
pyenv: command not found가 나오면source ~/.zshrc를 실행하세요. 또는 터미널을 닫았다가 다시 열어보세요.
4. Docker 기초¶
Docker가 뭔가요?¶
Docker는 컨테이너라는 기술을 사용해서 프로그램을 격리된 환경에서 실행하게 해줍니다.
비유로 이해하기:
가상머신(VM)은 "컴퓨터 안에 또 다른 컴퓨터"를 만드는 거예요.
무겁고 켜는 데 오래 걸립니다.
Docker 컨테이너는 "컴퓨터 안에 작은 방"을 만드는 거예요.
가볍고 켜는 데 몇 초면 됩니다.
Docker를 쓰면: - "내 컴퓨터에서는 되는데 네 컴퓨터에서는 안 돼" 문제를 해결할 수 있습니다 - 데이터베이스(MySQL, PostgreSQL 등)를 쉽게 실행할 수 있습니다 - 다른 개발자와 동일한 환경을 공유할 수 있습니다
Docker 설치 (Ubuntu 기준)¶
# Docker 설치
sudo apt update
sudo apt install -y docker.io
# Docker 서비스 시작
sudo systemctl start docker
sudo systemctl enable docker
# 현재 사용자를 docker 그룹에 추가 (sudo 없이 docker 명령어 쓰기)
sudo usermod -aG docker $USER
중요:
usermod명령어를 실행한 후에는 반드시 로그아웃했다가 다시 로그인해야 변경 사항이 적용됩니다.
설치 확인:
docker --version
# Docker version 24.X.X 같은 버전 번호가 나오면 성공!
# 테스트 실행
docker run hello-world
# "Hello from Docker!" 메시지가 나오면 정상 작동!
Docker 기본 명령어¶
# 이미지 다운로드 (Python 3.12 환경을 가진 이미지)
docker pull python:3.12
# 컨테이너 실행 (대화형 모드로 Python 셸 실행)
docker run -it python:3.12
# Python 셸이 열립니다! 빠져나오려면 Ctrl+D 또는 exit()
# 백그라운드에서 실행 (-d 옵션)
docker run -d -p 8080:80 nginx
# 이제 브라우저에서 http://localhost:8080 으로 접속 가능!
# 실행 중인 컨테이너 목록 보기
docker ps
# 모든 컨테이너 목록 (중지된 것도 포함)
docker ps -a
# 컨테이너 중지
docker stop <컨테이너ID>
# 컨테이너 삭제
docker rm <컨테이너ID>
# 이미지 목록 보기
docker images
# 이미지 삭제
docker rmi python:3.12
Docker Compose -- 여러 컨테이너를 한 번에 관리¶
Docker Compose는 여러 개의 컨테이너를 하나의 파일(docker-compose.yml)로 관리하는 도구입니다.
예를 들어, 웹 서버 + 데이터베이스를 함께 실행해야 할 때:
# docker-compose.yml 예시
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: postgres
environment:
POSTGRES_PASSWORD: mypassword
# 모든 서비스 시작
docker compose up -d
# 모든 서비스 중지
docker compose down
지금은 "이런 게 있구나" 정도로만 알아두세요. 나중에 실제 프로젝트에서 자연스럽게 만나게 됩니다!
언제 Docker을 쓰나요?¶
| 상황 | Docker 사용 여부 |
|---|---|
| 데이터베이스를 로컬에서 실행할 때 | 추천! 깔끔하게 지울 수 있어요 |
| 팀원들과 동일한 개발 환경을 공유할 때 | 추천! |
| 다양한 버전의 언어/프레임워크를 테스트할 때 | 추천! |
| 간단한 Python 스크립트 하나 실행할 때 | 굳이? 그냥 로컬에서 실행하세요 |
| 처음 코딩 배우는 단계 | 나중에 필요할 때 배워도 돼요! |
5. SSH 설정¶
SSH(Secure Shell)는 원격 컴퓨터에 안전하게 접속하는 프로토콜입니다. GitHub에 코드를 올리거나, 클라우드 서버에 접속할 때 사용합니다.
SSH 키 생성¶
SSH 키는 열쇠 같은 것입니다. 공개 키는 자물쇠, 개인 키는 열쇠예요.
# SSH 키 생성 (ed25519 방식 -- 요즘 표준)
ssh-keygen -t ed25519 -C "[email protected]"
몇 가지를 물어보는데, 기본값 그대로 Enter를 누르면 됩니다:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/leo/.ssh/id_ed25519): [Enter]
Enter passphrase (empty for no passphrase): [원하면 비밀번호 입력, 아니면 Enter]
Enter same passphrase again: [다시 입력]
공개 키 확인¶
cat ~/.ssh/id_ed25519.pub
# ssh-ed25519 AAAA... long_string ... [email protected]
이 출력 내용을 GitHub 등에 등록하면 됩니다.
GitHub에 SSH 키 등록¶
- 위 명령어로 공개 키 내용을 복사합니다
- GitHub 접속 -> Settings -> SSH and GPG keys -> New SSH key
- 복사한 공개 키를 붙여넣고 저장
연결 테스트:
ssh -T [email protected]
# Hi username! You've successfully authenticated... 라고 나오면 성공!
더 자세한 내용은 Git 튜토리얼 문서를 참고하세요!
원격 서버 접속¶
# 기본 형식
ssh 사용자명@서버IP주소
# 예시
ssh [email protected]
ssh [email protected]
처음 접속하면 이런 메시지가 나옵니다:
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
yes를 입력하면 됩니다. 서버의 "지문"을 기록해서 다음부터는 물어보지 않습니다.
SSH config 파일로 단축 설정¶
매번 긴 주소를 치는 건 귀찮죠. ~/.ssh/config 파일을 만들면 별명을 붙일 수 있습니다:
nano ~/.ssh/config
다음 내용을 작성:
Host myserver
HostName 192.168.1.100
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519
Host github
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
이제 간단하게 접속할 수 있습니다:
# 이전: ssh [email protected]
# 이후:
ssh myserver
scp로 파일 전송¶
scp(Secure Copy)는 SSH를 이용해 파일을 안전하게 전송합니다:
# 로컬 -> 원격: 파일 보내기
scp myfile.txt [email protected]:/home/ubuntu/
# 로컬 -> 원격: 폴더 보내기 (-r 옵션)
scp -r myproject/ [email protected]:/home/ubuntu/
# 원격 -> 로컬: 파일 가져오기
scp [email protected]:/home/ubuntu/log.txt ./
# config 파일의 별명도 사용 가능!
scp myfile.txt myserver:/home/ubuntu/
Troubleshooting:
Permission denied (publickey)가 나오면: 1. SSH 키가 제대로 생성되었는지 확인:ls ~/.ssh/2. 권한이 올바른지 확인:chmod 700 ~/.ssh,chmod 600 ~/.ssh/id_ed255193. 원격 서버에 공개 키가 등록되었는지 확인
6. 방화벽 기초 (ufw)¶
방화벽이 왜 필요한가요?¶
방화벽은 컴퓨터의 경비원입니다. 인터넷에서 들어오는 연결 중 허용된 것만 통과시킵니다.
비유하자면:
방화벽 없는 서버 = 문이 활짝 열린 집
-> 누구나 들어올 수 있어요 (위험!)
방화벽 있는 서버 = 경비원이 있는 건물
-> 출입증(허용된 포트)이 있는 사람만 들어올 수 있어요
ufw 기본 명령어¶
ufw(Uncomplicated Firewall)는 Ubuntu에서 방화벽을 쉽게 관리하는 도구입니다:
# 방화벽 활성화
sudo ufw enable
# Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
# SSH 접속 허용 (중요! 이걸 안 하면 원격 접속이 안 됩니다!)
sudo ufw allow 22
# 또는 서비스 이름으로:
sudo ufw allow ssh
# HTTP 허용 (웹 서버 운영할 때)
sudo ufw allow 80
sudo ufw allow http
# HTTPS 허용 (보안 웹 서버)
sudo ufw allow 443
sudo ufw allow https
# 특정 포트 허용 (예: 개발 서버 3000번 포트)
sudo ufw allow 3000
# 방화벽 상태 확인
sudo ufw status
sudo ufw status verbose # 더 자세한 정보
# 규칙 삭제
sudo ufw delete allow 3000
# 방화벽 비활성화
sudo ufw disable
# 모든 규칙 초기화 (처음부터 다시 설정할 때)
sudo ufw reset
ufw 상태 출력 예시¶
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
3000 ALLOW Anywhere
경고: 원격 서버에서 작업할 때는 반드시 SSH(포트 22)를 먼저 허용하고 방화벽을 켜세요. 그렇지 않으면 서버에 접속할 수 없게 됩니다!
7. 에디터 - Vim과 nano¶
리눅스에서는 터미널 안에서 텍스트 파일을 편집해야 할 일이 많습니다. 가장 많이 쓰이는 두 에디터를 배워봅시다.
Vim 기초¶
Vim은 리눅스의 전설적인 텍스트 에디터입니다. 모든 리눅스 시스템에 기본으로 설치되어 있어서, 서버에서 작업할 때 반드시 알아야 합니다.
모드의 세계¶
Vim의 가장 큰 특징은 모드(Mode) 개념입니다. 지금 어떤 모드인지에 따라 같은 키가 완전히 다른 동작을 합니다:
+----------+ i, a, o +----------+
| Normal | -------------> | Insert |
| (기본) | <------------- | (입력) |
+----------+ Esc +----------+
| |
| : | Esc
v |
+----------+ |
| Command | <---------------------+
| (명령) |
+----------+
|
| v, V, Ctrl+v
v
+----------+
| Visual |
| (선택) |
+----------+
| 모드 | 용도 | 진입 방법 | 빠져나오기 |
|---|---|---|---|
| Normal | 이동, 복사, 삭제 등 | Esc |
기본 모드 |
| Insert | 텍스트 입력 | i, a, o |
Esc |
| Visual | 텍스트 선택 | v, V, Ctrl+v |
Esc |
| Command | 저장, 종료, 검색 등 | : |
Esc |
Vim 실행하기¶
vim hello.py
Vim에서 빠져나오는 법 (가장 중요!!)¶
+-------------------------------------------------+
| |
| 이것이 이 문서에서 가장 중요한 섹션입니다! |
| |
| Vim에서 빠져나오는 법: |
| |
| 1. Esc 키를 누른다 (여러 번 눌러도 됨!) |
| 2. :q! 를 입력하고 Enter |
| |
| 저장하고 나가려면: |
| 1. Esc 키를 누른다 |
| 2. :wq 를 입력하고 Enter |
| |
+-------------------------------------------------+
Vim에 갇혔다면 당황하지 마세요. 이건 모든 개발자가 겪는 성인식(通過儀禮) 같은 거예요!
전 세계 수백만 개발자가 Vim에 갇혀본 적이 있습니다.
당신도 혼자가 아닙니다.
해결책은 항상 같습니다:
Esc -> :q! -> Enter
필수 키 정리¶
입력 모드 진입 (Normal 모드에서):
| 키 | 동작 |
|---|---|
i |
커서 앞에서 입력 시작 |
a |
커서 뒤에서 입력 시작 |
o |
아래에 새 줄을 만들고 입력 시작 |
I |
줄의 맨 앞에서 입력 시작 |
A |
줄의 맨 뒤에서 입력 시작 |
이동 (Normal 모드에서):
| 키 | 동작 |
|---|---|
h |
왼쪽으로 |
j |
아래로 |
k |
위로 |
l |
오른쪽으로 |
gg |
파일 맨 처음으로 |
G |
파일 맨 끝으로 |
0 |
줄의 맨 앞으로 |
$ |
줄의 맨 뒤로 |
Ctrl+f |
한 페이지 아래로 |
Ctrl+b |
한 페이지 위로 |
팁: 처음에는 방향키로도 이동할 수 있습니다. 하지만
h/j/k/l에 익숙해지면 손가락을 움직이지 않고도 이동할 수 있어서 훨씬 빠릅니다!
편집 (Normal 모드에서):
| 키 | 동작 |
|---|---|
dd |
한 줄 잘라내기 (삭제) |
yy |
한 줄 복사하기 |
p |
붙여넣기 |
u |
실행 취소 (Undo) |
Ctrl+r |
다시 실행 (Redo) |
x |
글자 하나 삭제 |
dw |
단어 하나 삭제 |
저장 & 종료 (Command 모드에서 -- Normal에서 : 입력):
| 명령 | 동작 |
|---|---|
:w |
저장 |
:q |
종료 |
:wq |
저장하고 종료 |
:q! |
저장 안 하고 종료 (위급시 사용!) |
:x |
저장하고 종료 (:wq와 같음) |
검색 (Normal 모드에서):
| 키 | 동작 |
|---|---|
/검색어 |
아래 방향으로 검색 |
?검색어 |
위 방향으로 검색 |
n |
다음 검색 결과로 |
N |
이전 검색 결과로 |
Vim 연습해보기¶
# Vim 튜토리얼 실행 (30분 정도 걸리지만 정말 도움이 됩니다!)
vimtutor
vimtutor는 Vim 자체에서 제공하는 튜토리얼입니다. 한국어로도 볼 수 있어요:
vimtutor ko
nano -- 더 간단한 대안¶
Vim이 너무 어렵게 느껴진다면, nano를 사용하세요! 훨씬 직관적입니다.
nano myfile.txt
GNU nano 7.2 myfile.txt
안녕하세요! 여기에 자유롭게 글을 쓸 수 있습니다.
그냥 타이핑하면 됩니다!
^G Help ^O Write Out ^W Where Is ^K Cut ^T Execute
^X Exit ^R Read File ^\ Replace ^U Paste ^J Justify
화면 아래에 단축키가 표시됩니다:
- ^ 기호는 Ctrl 키를 의미합니다
- ^O = Ctrl+O = 저장 (Write Out)
- ^X = Ctrl+X = 종료 (Exit)
- ^K = Ctrl+K = 한 줄 자르기
- ^U = Ctrl+U = 붙여넣기
# nano로 파일 열기
nano hello.py
# 특정 줄 번호로 열기
nano +10 hello.py # 10번째 줄에서 시작
Vim vs nano 요약: - nano: 간단한 설정 파일 수정할 때 편함. 배울 것 없이 바로 쓸 수 있음 - Vim: 복잡한 편집이 필요할 때 강력함. 배워두면 평생 유용함 - 추천: 둘 다 기본은 알아두세요. 서버 환경에서 nano가 없을 수도 있으니까요!
8. 버전 관리 도구 요약¶
지금까지 nvm(Node.js)과 pyenv(Python)를 배웠습니다. 다른 언어에도 비슷한 도구가 있습니다:
| 도구 | 관리 대상 | 설치 방법 | 홈페이지 |
|---|---|---|---|
| nvm | Node.js | curl 스크립트 |
https://github.com/nvm-sh/nvm |
| pyenv | Python | curl 스크립트 |
https://github.com/pyenv/pyenv |
| rbenv | Ruby | git clone |
https://github.com/rbenv/rbenv |
| sdkman | Java, Kotlin, Gradle 등 | curl 스크립트 |
https://sdkman.io |
이 도구들은 모두 같은 철학을 공유합니다: 1. 시스템에 설치된 버전을 건드리지 않는다 2. 여러 버전을 쉽게 설치할 수 있다 3. 프로젝트마다 다른 버전을 사용할 수 있다
새로운 언어를 배울 때마다 비슷한 도구가 있으니 "어떤 버전 관리자를 쓰지?"라고 검색해보세요!
9. WSL2 특화 팁 (Windows 사용자)¶
Windows에서 WSL2를 사용 중이라면, 유용한 팁들을 소개합니다.
Windows와 파일 공유¶
WSL2의 파일 시스템은 Windows 탐색기에서 접근할 수 있습니다:
Windows 탐색기 주소창에 입력:
\\wsl$\Ubuntu\home\leo
또는 WSL 터미널에서 Windows 탐색기를 열 수도 있습니다:
# 현재 디렉토리를 Windows 탐색기로 열기
explorer.exe .
# Windows 경로를 WSL에서 열기
wslpath -u 'C:\Users\Username\Documents'
WSL에서 Windows 프로그램 실행¶
WSL에서 Windows 프로그램을 직접 실행할 수 있습니다:
# VS Code로 현재 폴더 열기
code .
# 메모장으로 파일 열기
notepad.exe myfile.txt
# Windows 탐색기 열기
explorer.exe .
# PowerShell 실행
powershell.exe
code . 명령어로 VS Code가 열리면, VS Code가 자동으로 WSL 확장을 설치하라고 할 것입니다. 꼭 설치하세요! WSL 안의 파일을 원활하게 편집할 수 있습니다.
메모리 제한 설정¶
WSL2는 기본적으로 Windows 메모리의 절반을 사용합니다. 메모리 사용량을 제한하려면:
Windows 사용자 폴더에 .wslconfig 파일을 만듭니다:
파일 경로: C:\Users\Username\.wslconfig
[wsl2]
memory=4GB # WSL2에 할당할 최대 메모리
processors=4 # 할당할 CPU 코어 수
swap=2GB # 스왑 메모리 크기
설정 적용:
# PowerShell에서 실행
wsl --shutdown
# 다시 WSL을 열면 설정이 적용됩니다
WSL2 백업 및 복원¶
# 백업 (PowerShell에서 실행)
wsl --export Ubuntu D:\backup\ubuntu-backup.tar
# 복원
wsl --import Ubuntu D:\WSL\Ubuntu D:\backup\ubuntu-backup.tar
# 백업 파일은 꽤 크니 충분한 여유 공간이 있는 드라이브에 저장하세요
Windows Terminal에서 WSL 탭 설정¶
Windows Terminal을 사용 중이라면:
1. Ctrl+Shift+T로 새 탭 열기
2. 탭 옆의 + 버튼 옆 화살표를 누르면 WSL 프로필을 선택할 수 있습니다
3. 설정에서 WSL을 기본 프로필로 지정하면 매번 선택할 필요가 없습니다
팁: Windows Terminal은 https://aka.ms/terminal 에서 설치할 수 있습니다. 기본 명령 프롬프트보다 훨씬 편합니다!
10. 개발 환경 한 번에 설정 스크립트¶
새 컴퓨터나 새 서버를 세팅할 때마다 하나씩 설치하기 귀찮죠? 다음 스크립트를 사용하면 기본 개발 환경을 한 번에 설정할 수 있습니다.
#!/bin/bash
# ============================================================
# Ubuntu 개발 환경 자동 설정 스크립트
# 사용법: chmod +x setup-dev.sh && ./setup-dev.sh
# ============================================================
# 에러 발생 시 스크립트 중단
set -e
echo "========================================="
echo " 개발 환경 설정을 시작합니다!"
echo "========================================="
# ----------------------------------------------------------
# 1. 시스템 패키지 업데이트 및 기본 도구 설치
# ----------------------------------------------------------
echo ""
echo "[1/6] 시스템 패키지 업데이트 중..."
sudo apt update && sudo apt upgrade -y
echo "[1/6] 기본 개발 도구 설치 중..."
sudo apt install -y \
build-essential \ # gcc, g++, make 등 컴파일 도구
curl \ # API 테스트, 파일 다운로드
wget \ # 파일 다운로드
git \ # 버전 관리
vim \ # 터미널 에디터
nano \ # 간단한 터미널 에디터
htop \ # 시스템 모니터링
tree \ # 디렉토리 구조 시각화
unzip \ # zip 파일 압축 해제
ca-certificates \ # SSL 인증서
gnupg \ # 암호화 도구
lsb-release # 리눅스 배포판 정보
# ----------------------------------------------------------
# 2. Git 기본 설정
# ----------------------------------------------------------
echo ""
echo "[2/6] Git 기본 설정 중..."
# 사용자 이름과 이메일을 입력받아 설정
read -p "Git 사용자 이름을 입력하세요: " git_name
read -p "Git 이메일을 입력하세요: " git_email
git config --global user.name "$git_name"
git config --global user.email "$git_email"
git config --global core.editor vim # 기본 에디터를 vim으로 설정
git config --global init.defaultBranch main # 기본 브랜치명을 main으로
echo "Git 설정 완료!"
# ----------------------------------------------------------
# 3. nvm + Node.js 설치
# ----------------------------------------------------------
echo ""
echo "[3/6] nvm(Node Version Manager) 설치 중..."
# nvm 설치
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# nvm을 현재 셸에 로드
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# Node.js 22 LTS 설치 및 기본 설정
nvm install 22
nvm alias default 22
echo "Node.js $(node --version) 설치 완료!"
echo "npm $(npm --version) 설치 완료!"
# ----------------------------------------------------------
# 4. pyenv + Python 설치
# ----------------------------------------------------------
echo ""
echo "[4/6] Python 빌드 의존성 설치 중..."
sudo apt install -y \
libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev \
libsqlite3-dev libncursesw5-dev \
xz-utils tk-dev libxml2-dev \
libxmlsec1-dev libffi-dev liblzma-dev
echo "[4/6] pyenv 설치 중..."
curl https://pyenv.run | bash
# 셸 설정 파일에 pyenv 추가
SHELL_RC="$HOME/.zshrc"
if [ ! -f "$SHELL_RC" ]; then
SHELL_RC="$HOME/.bashrc"
fi
# 이미 설정이 있는지 확인 후 추가
if ! grep -q "pyenv" "$SHELL_RC"; then
echo "" >> "$SHELL_RC"
echo "# pyenv 설정" >> "$SHELL_RC"
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> "$SHELL_RC"
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> "$SHELL_RC"
echo 'eval "$(pyenv init -)"' >> "$SHELL_RC"
fi
# pyenv를 현재 셸에 로드
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
# Python 3.12 설치
pyenv install 3.12.0
pyenv global 3.12.0
echo "Python $(python --version) 설치 완료!"
# ----------------------------------------------------------
# 5. SSH 키 생성 (선택 사항)
# ----------------------------------------------------------
echo ""
read -p "SSH 키를 생성할까요? (y/n): " ssh_choice
if [ "$ssh_choice" = "y" ]; then
read -p "이메일 주소를 입력하세요: " ssh_email
ssh-keygen -t ed25519 -C "$ssh_email"
echo "SSH 키가 생성되었습니다!"
echo "공개 키:"
cat ~/.ssh/id_ed25519.pub
fi
# ----------------------------------------------------------
# 6. 방화벽 기본 설정
# ----------------------------------------------------------
echo ""
echo "[6/6] 방화벽(UFW) 기본 설정 중..."
sudo ufw allow ssh # SSH 접속 허용
sudo ufw --force enable # 방화벽 활성화 (확인 프롬프트 건너뛰기)
sudo ufw status
# ----------------------------------------------------------
# 완료!
# ----------------------------------------------------------
echo ""
echo "========================================="
echo " 설치 완료!"
echo "========================================="
echo ""
echo "설치된 도구:"
echo " Git: $(git --version)"
echo " Node.js: $(node --version)"
echo " npm: $(npm --version)"
echo " Python: $(python --version)"
echo " Vim: $(vim --version | head -1)"
echo ""
echo "다음 단계:"
echo " 1. 터미널을 닫았다가 다시 열으세요"
echo " 2. GitHub에 SSH 키를 등록하세요"
echo " 3. 프로젝트를 만들고 코딩을 시작하세요!"
echo ""
스크립트 사용법¶
# 1. 스크립트 파일 만들기
nano setup-dev.sh
# 위 내용을 붙여넣고 저장 (Ctrl+O, Enter, Ctrl+X)
# 2. 실행 권한 부여
chmod +x setup-dev.sh
# 3. 실행
./setup-dev.sh
주의: 스크립트를 실행하기 전에 내용을 꼭 읽어보세요! 무엇을 설치하는지 이해하는 것이 중요합니다.
11. 실습 미션¶
배운 것을 직접 해보며 익혀봅시다!
미션 1: Vim 탈출 훈련 (난이도: 하)¶
목표: Vim을 실행하고, 글을 쓰고, 저장하고, 빠져나오기
1. vim practice.txt 를 실행하세요
2. i 를 눌러 Insert 모드로 들어가세요
3. "안녕하세요! 제 이름은 ___입니다." 를 입력하세요
4. Esc 를 눌러 Normal 모드로 돌아가세요
5. :wq 를 입력하고 Enter 를 눌러 저장하고 종료하세요
6. cat practice.txt 로 내용이 잘 저장되었는지 확인하세요
도전 과제:
- 다시 vim practice.txt 를 열어서
- yy 로 한 줄을 복사하고
- p 로 붙여넣기 해보세요
- gg 로 맨 위로, G 로 맨 아래로 이동해보세요
미션 2: Node.js로 "Hello World" 웹 서버 (난이도: 하)¶
# 1. nvm으로 Node.js 설치
nvm install 22
nvm use 22
# 2. 프로젝트 폴더 만들기
mkdir hello-web
cd hello-web
npm init -y
# 3. Express 설치
npm install express
# 4. 서버 코드 작성
cat > server.js << 'EOF'
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World! 나의 첫 웹 서버!');
});
app.listen(port, () => {
console.log(`서버가 http://localhost:${port} 에서 실행 중입니다!`);
});
EOF
# 5. 서버 실행
node server.js
# 6. 브라우저에서 http://localhost:3000 접속!
# (WSL 사용자는 Windows 브라우저에서 접속하면 됩니다)
# 서버를 종료하려면 Ctrl+C 를 누르세요
미션 3: Python 가상환경으로 프로젝트 만들기 (난이도: 중)¶
# 1. pyenv로 Python 버전 확인
pyenv global 3.12.0
python --version
# 2. 프로젝트 폴더 만들기
mkdir my-python-app
cd my-python-app
# 3. 가상환경 만들기
python -m venv venv
# 4. 가상환경 활성화
source venv/bin/activate
# 프롬프트가 (venv)로 바뀌었는지 확인!
# 5. requests 라이브러리 설치
pip install requests
# 6. 간단한 스크립트 작성
cat > api_test.py << 'EOF'
import requests
response = requests.get('https://api.github.com')
print(f"상태 코드: {response.status_code}")
print(f"GitHub API: {response.json()['current_user_url']}")
EOF
# 7. 실행
python api_test.py
# 8. 작업 완료 후 가상환경 비활성화
deactivate
# 확인: pip list를 실행하면 requests가 안 보일 거예요!
# (가상환경을 벗어났으니까요)
pip list
미션 4: Docker로 데이터베이스 실행해보기 (난이도: 중)¶
# 1. Redis 이미지 다운로드
docker pull redis
# 2. Redis 컨테이너 실행 (백그라운드)
docker run -d --name my-redis -p 6379:6379 redis
# 3. 실행 중인 컨테이너 확인
docker ps
# 4. Redis 컨테이너 안에서 명령어 실행
docker exec -it my-redis redis-cli
# redis-cli 프롬프트가 열립니다!
# Redis에서 데이터 저장 & 불러오기
127.0.0.1:6379> SET name "Leo"
127.0.0.1:6379> GET name
# "Leo" 라고 나오면 성공!
127.0.0.1:6379> exit
# 5. 컨테이너 중지 & 삭제
docker stop my-redis
docker rm my-redis
# 6. 깨끗하게 정리
docker rmi redis
미션 5: SSH로 GitHub 연결하기 (난이도: 중)¶
# 1. SSH 키 생성
ssh-keygen -t ed25519 -C "[email protected]"
# 2. 공개 키 확인
cat ~/.ssh/id_ed25519.pub
# 3. 공개 키를 복사해서 GitHub에 등록
# Settings -> SSH and GPG keys -> New SSH key
# 4. 연결 테스트
ssh -T [email protected]
# 5. SSH를 사용해서 저장소 클론
git clone [email protected]:username/repo.git
미션 6: 종합 -- 나만의 개발 블로그 만들기 준비 (난이도: 상)¶
목표: 지금까지 배운 모든 것을 활용해서 개발 환경을 완성하세요!
체크리스트:
[ ] build-essential, curl, wget, git, vim, nano 설치됨
[ ] nvm으로 Node.js 설치됨 (node --version 확인)
[ ] pyenv로 Python 설치됨 (python --version 확인)
[ ] SSH 키 생성 및 GitHub 등록 완료
[ ] 방화벽(UFW) 설정됨 (sudo ufw status)
[ ] Vim에서 i -> 입력 -> Esc -> :wq 할 수 있음
[ ] nano에서 파일을 열고 저장할 수 있음
[ ] Python 가상환경을 만들고 활성화/비활성화할 수 있음
[ ] Docker로 컨테이너를 실행하고 중지할 수 있음
모두 체크했다면, 당신은 이제 리눅스 개발 환경의 기본을 갖춘 겁니다!
요약¶
이 문서에서 배운 내용을 한눈에 정리합니다:
| 주제 | 핵심 명령어 |
|---|---|
| 필수 패키지 | sudo apt install build-essential curl wget git vim nano |
| Node.js (nvm) | nvm install 22, nvm use 22, npm init, npm install |
| Python (pyenv) | pyenv install 3.12.0, pyenv global 3.12.0, python -m venv |
| Docker | docker pull, docker run, docker ps, docker stop |
| SSH | ssh-keygen, ssh user@server, scp, ~/.ssh/config |
| 방화벽 | sudo ufw enable, sudo ufw allow 22, sudo ufw status |
| Vim | i (입력), Esc (Normal), :wq (저장+종료), :q! (강제 종료) |
| nano | nano 파일명, Ctrl+O (저장), Ctrl+X (종료) |
기억하세요: 모든 개발자도 처음에는 이 명령어들이 낯설었습니다. 하나씩 연습하다 보면 자연스럽게 손에 익을 거예요. 코딩의 세계에 오신 것을 환영합니다!
다음 문서에서는 리눅스 셸 스크립트 기초를 배워봅니다. 반복 작업을 자동화하는 멋진 방법을 알게 될 거예요!