Ndaemy

2026년 7월 17일

macOS 개발 환경 세팅 (1): 터미널 환경

들어가며

macOS에서 개발 환경을 세팅하려는 개발자들에게 오랫동안 subicura 님의 Mac 개발 환경 가이드를 추천해왔습니다. 잘 쓰인 글이지만 시간이 꽤 흘렀고, 이제는 현재 세팅과 맞지 않는 부분이 많습니다. iTerm2, asdf, Intel/Apple Silicon 분기 같은 것들이 그렇습니다.

마침 최근에 맥을 포맷하고 처음부터 다시 세팅했습니다. 그 과정을 기록해두면 다음에 누군가에게 추천할 글이 되겠다 싶어서 시리즈로 정리합니다.

  1. 터미널 환경 — Homebrew, Ghostty, oh-my-zsh, Starship (이 글)
  2. 개발 도구 — git, mise, CLI 도구, 앱
  3. AI 세팅 — Claude Code, opencode, 그리고 설정 관리

여기 나오는 도구들은 제가 추천하는 조합입니다. 반드시 똑같이 따라 할 필요는 없고, 다른 도구로 바꿔도 전체 흐름은 그대로 적용됩니다.

설정을 마친 Ghostty 터미널 — TokyoNight 테마와 Starship 프롬프트

Homebrew

macOS의 사실상 표준 패키지 관리자입니다. 터미널 도구부터 GUI 앱까지 대부분 이걸로 설치합니다. 아직 아무것도 없는 상태이니 기본 터미널 앱(Terminal.app)을 열고 공식 사이트의 설치 스크립트를 실행합니다.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

설치가 끝나면 brew 명령을 PATH에 등록하라는 "Next steps" 안내가 나옵니다. CPU 아키텍처 등 환경에 따라 출력되는 명령이 다를 수 있으니, 본인 화면에 안내된 명령을 그대로 실행합니다. Apple Silicon 맥 기준으로는 아래와 같습니다.

echo >> ~/.zprofile
echo 'eval "$(/opt/homebrew/bin/brew shellenv zsh)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv zsh)"

💡 혹시 Intel CPU 맥을 사용 중이라면 Homebrew 경로가 /opt/homebrew가 아닌 /usr/local이고, Intel 지원 자체가 단계적으로 종료되고 있다는 점을 알아두세요.

brew --version이 버전을 출력하면 준비 완료입니다.

Ghostty

터미널 앱은 Ghostty를 씁니다. 예전에는 iTerm2가 대세였지만, 지금 새로 고른다면 Ghostty입니다. Claude Code 같은 CLI 코딩 에이전트를 쓰기 시작하면 터미널이 곧 주 작업 공간이 되는데, 에이전트가 쏟아내는 대량 출력도 지연 없이 받아낼 만큼 빠르고, 네이티브 macOS 앱이라 시스템과도 잘 어울립니다.

brew install --cask ghostty

설치했으면 Terminal.app은 닫고, 여기서부터는 Ghostty를 열어서 진행합니다.

설치 직후의 Ghostty 기본 화면 — 기본 폰트와 테마, 불투명한 배경

폰트

터미널 폰트는 두 가지를 설치합니다.

brew install --cask font-meslo-lg-nerd-font font-pretendard
  • MesloLGS Nerd Font — 코드용 본문 폰트. Nerd Font는 일반 폰트에 개발용 아이콘(git 브랜치, 폴더, 언어 로고 등)을 패치한 폰트로, 뒤에서 설치할 Starship 프롬프트가 이 아이콘들을 사용합니다. 저는 MesloLGS Nerd Font를 추천하지만, 다른 Nerd Font를 사용하셔도 무방합니다.
  • Pretendard — 한글 폴백용 폰트. 코딩 폰트 대부분은 한글 글리프가 없어서 한글은 폴백 폰트로 렌더링되는데, 폴백을 지정하지 않으면 macOS 시스템 폴백에 맡겨집니다. 이때 명조(serif) 계열 폰트가 선택되는 경우가 있어 코딩 화면과 이질적입니다. 폴백 폰트를 직접 지정하면 항상 원하는 폰트로 렌더링됩니다.

폴백을 지정하지 않으면 한글이 이렇게 명조 계열로 렌더링되곤 합니다.

한글이 명조 계열 폰트로 폴백되어 코딩 폰트와 어긋나 보이는 모습

Pretendard를 폴백으로 지정하면 한글이 고딕으로 매끈하게 나옵니다.

Pretendard를 폴백으로 지정한 뒤 — 한글이 고딕으로 렌더링된다

💡 FiraCode처럼 ligature가 있는 폰트를 골랐다면 => 같은 기호가 화살표로 합쳐져 보입니다. 원치 않으면 설정에 font-feature = -caltfont-feature = -liga 두 줄을 추가해 끌 수 있습니다.

설정

Ghostty 설정은 텍스트 파일 하나로 관리합니다. Ghostty에서 ⌘ ,를 누르면 설정 파일이 텍스트 편집기(기본적으로 TextEdit)로 열립니다. 파일이 없으면 새로 만들어 줍니다. 실제 경로는 ~/Library/Application Support/com.mitchellh.ghostty/config.ghostty입니다.

💡 TextEdit이 아닌 다른 편집기로 열고 싶다면 터미널에서 ghostty +edit-config를 실행하세요. $VISUAL 또는 $EDITOR에 지정된 편집기로 열립니다. macOS는 이 환경변수들을 기본으로 설정해두지 않아서, 비어 있다면 export EDITOR=vim처럼 먼저 지정해야 합니다.

제 설정 전체는 이렇습니다.

theme = "TokyoNight"
 
# 폰트
font-family = MesloLGS Nerd Font
font-family = Pretendard
font-size = 14
font-thicken = true
 
# 창
window-padding-x = 12
window-padding-y = 12
macos-titlebar-style = transparent
 
# 스크롤백 — 단위는 바이트 (기본 10MB)
scrollback-limit = 100000000
 
# 마우스
mouse-hide-while-typing = true
 
# 쉘 통합
shell-integration = zsh
 
# 배경 — 반투명 + 블러
background-opacity = 0.85
background-blur = macos-glass-regular
 
# quick terminal — 어느 앱에서든 ⌃` 로 토글
keybind = global:ctrl+grave_accent=toggle_quick_terminal

설명이 필요한 옵션 몇 가지만 살펴보겠습니다.

  • font-family를 두 번 지정하면 위에서부터 순서대로 폴백됩니다. MesloLGS에 없는 한글은 Pretendard로 렌더링됩니다.
  • font-thicken은 macOS 전용 옵션으로, 글자를 살짝 더 두껍게 렌더링합니다.
  • macos-titlebar-style = transparent는 타이틀바를 투명하게 만들어 터미널 배경과 한 덩어리로 보이게 합니다. 기본값이지만 명시해 두었습니다. 탭 바를 타이틀바에 통합하는 tabs 스타일도 있는데, macOS 26(Tahoe)부터 렌더링 버그가 여럿 보고되어 수정이 이어지고 있지만, 이 글을 쓰는 시점에도 남은 문제가 있어 쓰지 않았습니다.
  • scrollback-limit의 단위는 줄 수가 아니라 바이트입니다. CLI 코딩 에이전트와 작업하다 보면 세션 하나의 출력이 어마어마해져서, 거슬러 올라가 볼 수 있게 기본값(10MB)보다 크게 잡았습니다.
  • background-opacity + background-blur로 반투명 유리 느낌을 낼 수 있습니다. 다만 macos-glass-* 값은 macOS 26 이상 전용이라, 이전 버전이라면 background-blur = true를 쓰면 됩니다. blur는 opacity가 1 미만일 때만 의미가 있어서 두 옵션은 세트입니다.
  • 마지막 줄의 global: 키바인드는 quick terminal을 켭니다. Ghostty가 포커스되어 있지 않아도, 어느 앱에서든 ⌃ `를 누르면 화면 상단에서 터미널이 내려옵니다.

다른 앱 위로 내려온 Ghostty quick terminal

전역 단축키라서, 이 설정을 넣고 리로드하면 macOS가 손쉬운 사용(Accessibility) 권한을 요청합니다. 허용해야 동작합니다.

quick terminal 설정 후 처음 리로드하면 뜨는 손쉬운 사용 권한 요청 다이얼로그

파일을 저장한 뒤 실행 중인 Ghostty에서 ⌘ ⇧ ,를 누르면 설정이 리로드됩니다. 단, background-opacity는 macOS에서는 리로드로 반영되지 않아 Ghostty를 완전히 종료했다가 다시 열어야 하고, scrollback-limit은 새로 여는 탭/창부터 적용됩니다.

설정 적용 후의 Ghostty — 반투명 배경 너머로 배경화면이 비친다

폰트가 의도대로 적용됐는지는 +show-face 명령으로 확인할 수 있습니다. 글자별로 어떤 폰트에 매칭됐는지 보여줍니다. 참고로 ghostty CLI는 Ghostty가 자기 창 안의 쉘에서만 PATH에 등록해주기 때문에, 다른 앱의 터미널에서는 ghostty 명령이 잡히지 않습니다.

ghostty +show-face --string="한글 abc"

Ghostty를 재시작한 뒤 배경이 반투명한 TokyoNight 테마로 보이고, +show-face 출력에서 한글이 Pretendard로 매칭되면 완료입니다.

oh-my-zsh

macOS 기본 쉘은 zsh입니다. oh-my-zsh는 zsh 설정 프레임워크로, 플러그인과 각종 편의 기능을 쉽게 얹을 수 있게 해줍니다. 공식 사이트에서 안내하는 설치 스크립트를 실행합니다.

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

⚠️ 설치 스크립트는 기존 ~/.zshrc를 oh-my-zsh 기본 템플릿으로 교체합니다(기존 파일은 ~/.zshrc.pre-oh-my-zsh로 백업됩니다). 이전에 .zshrc에 직접 넣어둔 내용이 있다면, 백업 파일에서 필요한 부분을 새 .zshrc로 옮겨 오세요.

쉘 설정은 파일 하나에 모아두면 관리가 쉽습니다. 그래서 이 시점에 .zprofile의 내용을 .zshrc로 옮기고 .zprofile은 삭제합니다. 필수는 아닙니다.

Homebrew를 설치하며 만들었던 ~/.zprofile에는 이 한 줄이 들어 있습니다.

eval "$(/opt/homebrew/bin/brew shellenv zsh)"

이 줄을 ~/.zshrcsource $ZSH/oh-my-zsh.sh보다 로 옮겨 넣습니다.

plugins=(
  # ...
)
 
# homebrew
eval "$(/opt/homebrew/bin/brew shellenv zsh)"
 
source $ZSH/oh-my-zsh.sh

그리고 빈 껍데기가 된 .zprofile을 삭제합니다.

rm ~/.zprofile

위치가 중요한 이유가 있습니다. oh-my-zsh는 소싱되는 시점에 zsh 자동완성을 초기화(compinit)하는데, Homebrew의 completion 경로 등록이 그보다 먼저 이뤄져야 합니다. source $ZSH/oh-my-zsh.sh 아래에 두면 brew를 비롯한 CLI들의 탭 자동완성이 아무 오류 표시 없이 동작하지 않게 됩니다 (Homebrew 공식 문서 참고).

새 터미널을 열었을 때 프롬프트가 화살표()로 시작하는 oh-my-zsh 기본 모양으로 바뀌어 있으면 성공입니다.

플러그인

oh-my-zsh 기본 설치에 플러그인 두 개를 얹습니다. 둘 다 프롬프트가 아니라 쉘 입력줄에서 동작하는 기능이라, 어떤 프롬프트 테마를 쓰든 유용합니다.

# 명령어 문법 하이라이팅 — 오타난 명령이 빨간색으로 보입니다
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
 
# 히스토리 기반 자동완성 — 입력 중에 회색으로 제안이 뜨고 →로 수락합니다
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

~/.zshrcplugins 배열에 등록합니다. git은 기본값으로 이미 들어 있습니다. 주의할 점이 하나 있습니다. zsh-syntax-highlighting은 공식 문서반드시 마지막에 로드하라고 안내하므로 배열 끝에 둡니다.

plugins=(
  git
  zsh-autosuggestions
  zsh-syntax-highlighting
)

저장한 뒤 다시 로드하면 적용됩니다.

source ~/.zshrc

zsh-syntax-highlighting과 zsh-autosuggestions 동작 모습 — 오타는 빨간색, 정상 명령은 초록색, 회색 자동완성 제안

존재하는 명령은 초록색, 오타는 빨간색으로 표시되고, 전에 입력했던 명령이 회색 제안으로 뜨면 두 플러그인 모두 동작 중입니다.

공짜로 따라오는 것들

oh-my-zsh를 깔면 별도 설정 없이 얻는 편의 기능이 꽤 많습니다. 제가 자주 사용하는 것들은 아래와 같습니다.

  • git 플러그인 aliasgst(status), gsw(switch), gco(checkout), ga(add), gcmsg(commit -m), gp(push), gl(pull) 등. 전체 목록은 방대하지만 몇 개만 익혀도 체감이 큽니다.
  • auto_cdcd 없이 디렉토리 이름만 입력해도 해당 디렉토리로 이동합니다. ~/Documents/dev처럼 경로만 입력하면 됩니다.
  • auto_pushdcd 할 때마다 이전 디렉토리가 스택에 쌓입니다. popd를 입력하면 직전 위치로 돌아갑니다. auto_cd와 결합하면 디렉토리 이름만 입력해도 pushd처럼 동작하는 셈입니다.
  • 기본 aliasl(= ls -lah)처럼 자주 쓰는 명령의 축약형이 여럿 정의되어 있습니다.

Starship

쉘 프롬프트는 Starship을 씁니다. 프롬프트는 터미널이 명령을 기다릴 때 입력줄 앞에 표시되는 부분으로, oh-my-zsh 기본 테마의 화살표와 현재 경로 표시가 여기에 해당합니다.

subicura 가이드가 추천했던 Powerlevel10k는 사실상 개발이 멈춘 상태입니다. README 최상단에 "THE PROJECT HAS VERY LIMITED SUPPORT"라는 공지가 박혀 있습니다. 동작이 안 되는 건 아니지만, 활발히 유지보수되는 Starship을 정석으로 판단했습니다. Rust로 만들어져 빠르고, zsh뿐 아니라 어느 쉘에서든 같은 설정으로 동작합니다.

Starship은 Nerd Font를 전제로 합니다. 이 글의 Ghostty 폰트 설정을 따라왔다면 이미 준비되어 있고, 아니라면 쓰는 터미널에 Nerd Font를 설치해 적용해 주세요.

폰트가 준비됐으면 Starship을 설치합니다.

brew install starship

~/.zshrc에서 두 군데를 수정합니다. oh-my-zsh가 자체 프롬프트 테마를 그리지 않도록 ZSH_THEME을 빈 값으로 바꾸고, 파일 맨 끝에 Starship 초기화 명령을 추가합니다.

ZSH_THEME=""
# starship
eval "$(starship init zsh)"

source ~/.zshrc 하면 바로 적용됩니다. 기본 설정만으로 현재 디렉토리, git 브랜치, 프로젝트의 언어 버전까지 표시됩니다.

Starship 프롬프트 — 현재 디렉토리, git 브랜치, Node.js 버전이 표시된다

커스터마이징하고 싶다면 ~/.config/starship.toml설정을 작성하면 됩니다. 저는 기본값 그대로 사용합니다. 기본값이 잘 만들어져 있다는 것도 이 도구의 장점입니다.

프롬프트가 위 예시처럼 보이면 적용된 것입니다. 아이콘이 네모(□)로 깨져 보인다면 Ghostty의 폰트 설정(MesloLGS Nerd Font)을 다시 확인하세요.

₩ → ` 키바인딩

한글 키보드로 개발하다 보면 반드시 만나는 문제입니다. 한글 입력 상태에서 백틱(`) 키를 누르면 가 입력됩니다. 마크다운과 쉘에서 백틱을 수시로 쓰는데, 매번 영문으로 전환하기는 귀찮습니다.

~/Library/KeyBindings/DefaultKeyBinding.dict 파일을 만들면 해결됩니다.

mkdir -p ~/Library/KeyBindings
 
cat <<EOF > ~/Library/KeyBindings/DefaultKeyBinding.dict
{
  "₩" = ("insertText:", "\`");
  "~₩" = ("insertText:", "₩");
}
EOF

한글 상태에서도 키가 백틱을 입력하고, 정말 원화 기호가 필요할 때는 ⌥(option) + ₩를 누르면 됩니다. 실행 중인 앱에는 바로 적용되지 않고, 앱을 재시작해야 반영됩니다. 참고로 이 방식은 macOS 네이티브 텍스트 입력 시스템을 쓰는 앱에만 적용되기 때문에, 자체 입력 처리를 하는 일부 앱에서는 동작하지 않을 수 있습니다.

앱을 재시작한 뒤 한글 입력 상태에서 키를 눌러 백틱이 입력되면 완료입니다.

마치며

여기까지 하면 터미널 환경이 완성됩니다. 최종 ~/.zshrc는 (템플릿 주석을 걷어내면) 이 정도로 단순합니다.

export ZSH="$HOME/.oh-my-zsh"
 
ZSH_THEME=""
 
plugins=(
  git
  zsh-autosuggestions
  zsh-syntax-highlighting
)
 
# homebrew — oh-my-zsh 소싱보다 먼저
eval "$(/opt/homebrew/bin/brew shellenv zsh)"
 
source $ZSH/oh-my-zsh.sh
 
# starship
eval "$(starship init zsh)"

다음 편에서는 이 터미널 위에서 쓸 개발 도구들을 세팅합니다. git과 GitHub CLI, 언어 버전 관리자 mise, 그리고 자주 쓰는 CLI 도구와 앱들입니다.