
cat >> ~/.ssh/config << EOF
Host *
UseRoaming no
HashKnownHosts yes
VisualHostKey yes
PasswordAuthentication no
ChallengeResponseAuthentication no
StrictHostKeyChecking ask
VerifyHostKeyDNS yes
ForwardAgent no
ForwardX11 no
ServerAliveInterval 300
ServerAliveCountMax 2
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group14-sha256
EOF
cat > ~/.gnupg/gpg-agent.conf << EOF pinentry-program /opt/homebrew/bin/pinentry-mac default-cache-ttl 34560000 max-cache-ttl 34560000 EOF

cat > nginx.ssl.conf << EOF
server {
listen 443 ssl;
server_name localhost;
ssl_certificate ~/.ssl/localhost+1.pem;
ssl_certificate_key ~/.ssl/localhost+1-key.pem;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
}
}
EOF
cat > ~/.zshrc_secrets << 'EOF'
# 개발 환경별 시크릿 로딩
function load_secrets() {
if [ -f .env ]; then
export $(grep -v '^#' .env | xargs)
fi
if command -v doppler &> /dev/null; then
eval $(doppler secrets download --no-file --format=env-no-quotes)
fi
}
# cd 할 때 자동으로 시크릿 로딩
function cd() {
builtin cd "$@"
load_secrets
}
EOF
echo 'source ~/.zshrc_secrets' >> ~/.zshrc
cat > ~/scripts/security-scan.sh << 'EOF'
#!/bin/bash
echo "🔍 Running security scans..."
# Node.js 프로젝트
if [ -f "package.json" ]; then
echo "📦 Scanning Node.js dependencies..."
npm audit
eslint . --config .eslintrc.security.js
fi
# Python 프로젝트
if [ -f "requirements.txt" ] || [ -f "pyproject.toml" ]; then
echo "🐍 Scanning Python dependencies..."
pip-audit
bandit -r .
fi
# Go 프로젝트
if [ -f "go.mod" ]; then
echo "🔷 Scanning Go dependencies..."
govulncheck ./...
fi
echo "✅ Security scan complete!"
EOF
chmod +x ~/scripts/security-scan.sh
FROM node:18-alpine as builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build FROM node:18-alpine # 보안 업데이트 RUN apk update && apk upgrade # 비root 사용자 생성 RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser WORKDIR /app COPY --from=builder --chown=appuser:appgroup /app/dist ./dist COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules # 불필요한 파일 제거 RUN rm -rf /tmp/* /var/cache/apk/* EXPOSE 3000 CMD ["node", "dist/index.js"]
version: '3.8'
services:
app:
build: .
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
#!/bin/bash # ~/scripts/optimize-dev-env.sh echo "🚀 Optimizing development environment..."
docker system prune -a -f echo "✅ Optimization complete!"

#!/bin/bash # ~/scripts/backup-dev-env.sh BACKUP_DIR="$HOME/Backups/dev-env-$(date +%Y%m%d)" mkdir -p "$BACKUP_DIR" echo "📦 Creating development environment backup..."
tree ~/projects -L 2 > "$BACKUP_DIR/project-structure.txt" echo "✅ Backup completed: $BACKUP_DIR"
#!/bin/bash
# ~/scripts/restore-dev-env.sh
BACKUP_DIR="$1"
if [ -z "$BACKUP_DIR" ]; then
echo "Usage: restore-dev-env.sh "
exit 1
fi
echo "🔄 Restoring development environment from $BACKUP_DIR..."
# 설정 파일 복원
if [ -d "$BACKUP_DIR/config" ]; then
rsync -av "$BACKUP_DIR/config/" ~/
fi
# VSCode 설정 복원
if [ -d "$BACKUP_DIR/vscode" ]; then
rsync -av "$BACKUP_DIR/vscode/" "~/Library/Application Support/Code/User/"
fi
# Homebrew 패키지 복원
if [ -f "$BACKUP_DIR/brew-packages.txt" ]; then
xargs brew install < "$BACKUP_DIR/brew-packages.txt"
fi
if [ -f "$BACKUP_DIR/brew-casks.txt" ]; then
xargs brew install --cask < "$BACKUP_DIR/brew-casks.txt"
fi
# npm 글로벌 패키지 복원
if [ -f "$BACKUP_DIR/npm-globals.txt" ]; then
grep -E '^[^@]+@[0-9]' "$BACKUP_DIR/npm-globals.txt" | \
awk -F'@' '{print $1"@"$NF}' | \
xargs npm install -g
fi
echo "✅ Restoration complete!"
#!/bin/bash
# ~/scripts/dev-dashboard.sh
clear
echo "🚀 개발 환경 대시보드"
echo "===================="
echo ""
# 시스템 정보
echo "💻 시스템 정보"
echo "└─ macOS: $(sw_vers -productVersion)"
echo "└─ 메모리: $(sysctl hw.memsize | awk '{printf("%.2f GB", $2/1024/1024/1024)}')"
echo "└─ CPU: $(sysctl -n machdep.cpu.brand_string)"
echo ""
# 프로그래밍 언어 버전
echo "📚 언어 버전"
echo "└─ Node.js: $(node --version)"
echo "└─ Python: $(python3 --version | awk '{print $2}')"
echo "└─ Go: $(go version | awk '{print $3}')"
echo ""
# 개발 도구 상태
echo "🛠 개발 도구"
echo "└─ Git: $(git --version | awk '{print $3}')"
echo "└─ Docker: $(docker --version | awk '{print $3}' | sed 's/,//')"
echo "└─ Minikube: $(minikube version --short)"
echo "└─ Kubectl: $(kubectl version --client --short | awk '{print $3}')"
echo ""
# 활성 프로젝트
echo "📁 활성 프로젝트"
for project in ~/projects/*/; do
if [ -d "$project" ]; then
name=$(basename "$project")
if [ -d "$project/.git" ]; then
branch=$(cd "$project" && git rev-parse --abbrev-ref HEAD 2>/dev/null)
echo "└─ $name (branch: $branch)"
else
echo "└─ $name"
fi
fi
done
echo ""
# 리소스 사용량
echo "📊 리소스 사용량"
echo "└─ CPU: $(ps aux | awk '{cpu+=$3} END {printf("%.1f%%", cpu)}')"
echo "└─ 메모리: $(ps aux | awk '{mem+=$4} END {printf("%.1f%%", mem)}')"
echo "└─ 디스크: $(df -h / | awk 'NR==2 {print $5}')"
echo ""
# Docker 컨테이너
if command -v docker &> /dev/null; then
echo "🐳 Docker 컨테이너"
docker ps --format "table {{.Names}}\t{{.Status}}" | tail -n +2 | while read line; do
echo "└─ $line"
done
fi
echo ""
# 실행 중인 서비스
echo "🌐 실행 중인 서비스"
lsof -i :3000 | grep LISTEN | awk '{print "└─ Port 3000: " $1}'
lsof -i :8000 | grep LISTEN | awk '{print "└─ Port 8000: " $1}'
lsof -i :8080 | grep LISTEN | awk '{print "└─ Port 8080: " $1}'
echo ""
echo "📝 오늘의 할 일"
echo "└─ Run: security-scan.sh"
echo "└─ Check: brew outdated"
echo "└─ Update: npm outdated -g"
echo ""
보안과 최적화의 핵심 포인트:
2025년 풀스택 개발자의 성공은 단순한 기술 스킬을 넘어서, 환경 구축과 관리 능력에 크게 좌우됩니다. 특히 원격 근무 환경에서는 보안과 성능 최적화가 개발 생산성에 직접적인 영향을 미칩니다.
이 가이드에서 다룬 설정들은 M3/M4 맥북의 성능을 최대한 활용하면서도, 보안성과 안정성을 확보하는 데 초점을 맞췄습니다. 특히 Docker Desktop 대신 Minikube를 활용하는 방법은 메모리 효율성 면에서 큰 장점을 제공합니다.
[^1]: Homebrew 공식 문서
[^2]: Minikube 설치 가이드
[^3]: fnm GitHub Repository
[^4]: uv 공식 문서
[^5]: Docker Desktop for Mac 문서
[^6]: Apple Silicon 개발 최적화 가이드
[^7]: GitHub Actions 워크플로우 문서
[^8]: macOS 보안 Best Practices