콘텐츠로 이동

03. 리눅스 개발 환경 세팅하기

"개발 환경은 요리사의 주방과 같아요. 도구가 잘 갖춰져 있으면 요리(코딩)가 즐거워집니다!"

이 문서에서는 리눅스에서 코딩을 시작하기 위해 필요한 도구들을 하나씩 설치하고 설정해봅니다. 처음에는 명령어가 많아 보여도, 하나씩 따라 하다 보면 금방 익숙해질 거예요.


목차

  1. 개발 필수 패키지
  2. Node.js 설치 (nvm)
  3. Python 설치 (pyenv)
  4. Docker 기초
  5. SSH 설정
  6. 방화벽 기초 (ufw)
  7. 에디터 - Vim과 nano
  8. 버전 관리 도구 요약
  9. WSL2 특화 팁
  10. 개발 환경 한 번에 설정 스크립트
  11. 실습 미션

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이 뭐예요?

nvmNode 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 "your_email@example.com"

몇 가지를 물어보는데, 기본값 그대로 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 ... your_email@example.com

이 출력 내용을 GitHub 등에 등록하면 됩니다.

GitHub에 SSH 키 등록

  1. 위 명령어로 공개 키 내용을 복사합니다
  2. GitHub 접속 -> Settings -> SSH and GPG keys -> New SSH key
  3. 복사한 공개 키를 붙여넣고 저장

연결 테스트:

ssh -T git@github.com
# Hi username! You've successfully authenticated... 라고 나오면 성공!

더 자세한 내용은 Git 튜토리얼 문서를 참고하세요!

원격 서버 접속

# 기본 형식
ssh 사용자명@서버IP주소

# 예시
ssh ubuntu@192.168.1.100
ssh root@my-server.com

처음 접속하면 이런 메시지가 나옵니다:

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 ubuntu@192.168.1.100
# 이후:
ssh myserver

scp로 파일 전송

scp(Secure Copy)는 SSH를 이용해 파일을 안전하게 전송합니다:

# 로컬 -> 원격: 파일 보내기
scp myfile.txt ubuntu@192.168.1.100:/home/ubuntu/

# 로컬 -> 원격: 폴더 보내기 (-r 옵션)
scp -r myproject/ ubuntu@192.168.1.100:/home/ubuntu/

# 원격 -> 로컬: 파일 가져오기
scp ubuntu@192.168.1.100:/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_ed25519 3. 원격 서버에 공개 키가 등록되었는지 확인


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 "your_email@example.com"

# 2. 공개 키 확인
cat ~/.ssh/id_ed25519.pub

# 3. 공개 키를 복사해서 GitHub에 등록
#    Settings -> SSH and GPG keys -> New SSH key

# 4. 연결 테스트
ssh -T git@github.com

# 5. SSH를 사용해서 저장소 클론
git clone git@github.com: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 (종료)

기억하세요: 모든 개발자도 처음에는 이 명령어들이 낯설었습니다. 하나씩 연습하다 보면 자연스럽게 손에 익을 거예요. 코딩의 세계에 오신 것을 환영합니다!


다음 문서에서는 리눅스 셸 스크립트 기초를 배워봅니다. 반복 작업을 자동화하는 멋진 방법을 알게 될 거예요!