맥북의 파일 구조와 환경 변수(PATH)의 작동 원리를 완벽히 이해하고 올바르게 MySQL(LTS 버전)을 설치하는 과정을 정리했습니다.
brew install mysql@8.4
설치는 위 명령어 한 줄만 입력하면 끝납니다. 그런데 MySQL은 도대체 어디에 설치된 것일까요? 구조를 한 번만 제대로 이해해두면 앞으로 어떤 패키지를 설치하더라도 헷갈리지 않을 수 있습니다.
맥의 핵심 운영 디렉토리 /usr, /bin, /etc 등은 macOS의 핵심 시스템 파일이 설치되는 곳입니다. Homebrew가 이런 종류의 폴더에 직접 파일을 심으면 OS 업데이트나 시스템 보호 메커니즘(System Integrity Protection)과 충돌이 발생할 수 있습니다.
그래서 Homebrew는 처음부터 /opt/homebrew라는 독립적인 영역을 잡고, 해당 영역 안에서만 패키지를 관리합니다. /opt는 이름 그대로 Optional입니다. 맥북의 기본 시스템을 건드리지 않고 개발 도구를 설치하기 위한 안전구역입니다.
Intel Mac vs Apple Silicon Mac의 차이
Intel Mac은
/usr/local/Cellar/, Apple Silicon(M1/M2/M3)은/opt/homebrew/Cellar/하위에 설치됩니다.brew --prefix를 터미널에 입력하면 현재 맥에 맞는 Homebrew 루트 경로를 확인할 수 있습니다.
Homebrew가 패키지를 설치하면 실제 바이너리, 라이브러리, 설정 파일 등은 아래 경로에 들어갑니다.
/opt/homebrew/Cellar/mysql@8.4/8.4.10_1/
경로에 8.4.10_1처럼 패치 버전 숫자가 적혀 있습니다. 나중에 8.4.11로 업데이트되는 순간 이 경로는 바뀝니다. 만약 설정 파일에 이 경로를 직접 적어두면 업데이트할 때마다 경로를 일일이 고쳐야 하는 끔찍한 상황이 펼쳐집니다.
이 문제를 해결하기 위해 Homebrew는 Cellar 외에 별도의 opt 폴더를 관리합니다.
/opt/homebrew/opt/mysql@8.4
→ (심볼릭 링크) →
/opt/homebrew/Cellar/mysql@8.4/8.4.10_1/
/opt/homebrew/opt/mysql@8.4는 실제 파일이 아니라 현재 설치된 최신 버전을 가리키는 바로가기(심볼릭 링크)입니다. 패치 버전이 8.4.11, 8.4.12로 올라가도 이 심볼릭 링크는 자동으로 새 경로를 가리키도록 Homebrew가 업데이트해줍니다.
그래서 우리가 설정 파일에 적어야 할 경로는 항상 이 고정된 opt 경로입니다. brew --prefix mysql@8.4를 치면 이 경로가 출력됩니다.
$ brew --prefix mysql@8.4
/opt/homebrew/opt/mysql@8.4
설치는 됐습니다. 그런데 터미널에서 mysql이라고 쳐도 command not found가 뜹니다.
터미널에 mysql이라고 입력하면 셸(zsh)은 "mysql이라는 이름의 실행 파일을 어디서 찾아야 하지?"를 판단해야 합니다. 이때 참조하는 것이 바로 $PATH라는 환경 변수입니다.
$PATH의 실체는 단순한 텍스트 문자열입니다. 여러 폴더 경로가 콜론(:)으로 이어진 하나의 긴 문자열이죠.
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
셸은 명령어가 입력되면 이 문자열을 콜론으로 잘라서 앞에서부터 순서대로 각 폴더를 뒤집니다. 해당 이름의 실행 파일을 찾는 즉시 실행하고, 끝까지 없으면 command not found를 뱉습니다.
MySQL을 방금 /opt/homebrew/opt/mysql@8.4/bin/에 설치했지만, 이 경로는 기본 $PATH에 포함되어 있지 않습니다. 그래서 터미널이 찾지 못하는 것입니다. 해결책은 간단합니다. 경로를 $PATH에 추가해주면 됩니다.
# ~/.zshrc에 MySQL 실행 폴더 경로 추가
echo 'export PATH="/opt/homebrew/opt/mysql@8.4/bin:$PATH"' >> ~/.zshrc
# 변경 사항 즉시 반영
source ~/.zshrc
조립된 $PATH를 시각화하면 이렇습니다.
/opt/homebrew/opt/mysql@8.4/bin : /usr/local/bin : /usr/bin : /bin
↑ 1순위 ↑ 2순위 ↑ 3순위 ↑ 4순위
앞에 붙이는 이유는 버전 충돌 방지에 있습니다. macOS에는 기본적으로 시스템 mysql 클라이언트가 /usr/bin/ 같은 경로에 존재하거나, 이전에 설치했던 다른 버전의 mysql이 /usr/local/bin에 남아있을 수 있습니다. 새 경로를 뒤에 붙이면 셸이 구버전을 먼저 발견하고 실행해버립니다.
앞에 붙여야 우리가 원하는 8.4 LTS 버전이 우선순위를 점하게 됩니다. 이를 우선순위 오버라이딩(Priority Overriding)이라고 합니다.
export 키워드를 왜 붙이는지 궁금합니다.
셸 변수(MY_VAR="hello")는 현재 터미널 세션에만 존재하는 지역 변수입니다. 하지만 MySQL처럼 자식 프로세스(서브 셸, 외부 프로그램 등)도 이 경로를 알아야 할 때는 export로 환경 변수로 승격시켜야 합니다. export PATH=...는 "이 변수를 이 터미널에서 실행되는 모든 자식 프로세스에게도 물려줘라"는 선언입니다.
환경 변수를 어느 파일에 설정하느냐도 자주 헷갈리는 포인트입니다. ~/.zshrc는 터미널 탭을 새로 열 때마다 실행되는 인터랙티브 셸 설정 파일이고, ~/.zprofile은 맥 부팅 직후 로그인 셸이 시작될 때 한 번만 실행됩니다. 일반적인 개발 환경 PATH 설정은 ~/.zshrc에 넣는 것이 관례입니다.
$ which mysql
/opt/homebrew/opt/mysql@8.4/bin/mysql
which 명령어는 "셸이 실제로 어떤 경로의 실행 파일을 쓰고 있는가?"를 보여줍니다. 위처럼 mysql@8.4 경로가 찍히면 PATH 설정이 완벽하게 적용된 것입니다.
이제 MySQL 바이너리의 위치도 알려줬으니, 데이터베이스 서버를 직접 켜고 초기 설정을 진행합니다.
brew services start mysql@8.4
brew services는 Homebrew가 패키지를 백그라운드 서비스(데몬)로 관리하기 위한 도구입니다. 한 번 등록해두면 맥북이 재부팅되어도 MySQL이 자동으로 켜집니다.
# 서비스 시작 + 부팅 시 자동 시작 등록
brew services start mysql@8.4
# 서비스 중지
brew services stop mysql@8.4
# 서비스 재시작
brew services restart mysql@8.4
# 전체 서비스 상태 목록 확인
brew services list
서버가 켜졌으면 보안 초기화 스크립트를 실행합니다.
mysql_secure_installation
mysql_secure_installation은 MySQL이 기본 제공하는 보안 강화 스크립트로, 실행하면 아래 항목들을 대화형으로 설정합니다.
Would you like to setup VALIDATE PASSWORD component? [Y/N]:
비밀번호 복잡도 검증 플러그인 활성화 여부입니다. 로컬 개발 환경이라 1234 같은 단순한 암호를 쓰려면 N을 선택합니다. 프로덕션 환경이라면 Y 후 레벨을 STRONG으로 설정하는 것을 권장합니다.
New password: (입력해도 화면에 아무것도 안 보임)
Re-enter new password:
보안상 입력한 문자가 화면에 표시되지 않습니다. 타이핑이 되고 있으니 입력 후 Enter를 누르면 됩니다.
MySQL 설치 직후에는 비밀번호 없이 접속 가능한 익명 계정이 존재합니다. 보안을 위해 반드시 삭제합니다.
root 계정은 MySQL의 최고 관리자입니다. 원격에서 root로 직접 접속하는 것은 심각한 보안 위협이 됩니다. 로컬 개발 환경이라면 원격 접속을 차단합니다.
MySQL 기본 설치 시 test라는 더미 데이터베이스가 생성됩니다. 불필요하므로 삭제합니다.
지금까지 변경한 권한 설정을 즉시 메모리에 반영하는 단계입니다. Y를 선택해야 재부팅 없이 바로 적용됩니다.
모든 설정이 끝났습니다. 정상적으로 접속되는지 확인합니다.
mysql -u root -p
-u root는 MySQL 사용자를 root로 지정하는 옵션입니다. 생략하면 현재 맥 계정명으로 로그인을 시도해 인증이 실패합니다. -p는 비밀번호 입력 프롬프트를 띄우는 옵션입니다.
비밀번호를 입력하고 mysql> 프롬프트가 나오면 접속 성공입니다. 최종적으로 버전을 확인합니다.
SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.4.10 |
+-----------+
1 row in set (0.00 sec)
8.4.x 버전이 출력되면 LTS 버전이 정상적으로 설치된 것입니다. exit를 입력해 빠져나옵니다.