터미널 탭 20개, 내 정신 상태를 나타내는 지표
- 03 Dec, 2025
터미널 탭 20개, 내 정신 상태를 나타내는 지표
오전 10시 47분. 노트북을 열었다. 터미널 탭이 어젯밤 그대로다. 23개. 닫을 수가 없다. 어떤 게 뭔지 모른다.

아침의 탭 정리, 실패
첫 번째 탭. npm run dev 돌아가는 중.
두 번째 탭. docker-compose logs -f 보고 있었나보다.
세 번째 탭. PostgreSQL 접속 상태. 쿼리 반쯤 쓴 흔적.
닫으면 안 될 것 같다. 다 의미가 있었을 거다. 어젯밤의 나는.
네 번째부터 열한 번째까지는 SSH 접속이다.
- 프로덕션 서버 3대
- 스테이징 서버 1대
- DB 마스터
- 왜인지 모를
htop돌아가는 창 3개
열두 번째 탭에서 git status 쳐봤다.
Changes not staged for commit:
modified: src/api/user.js
modified: src/components/Header.tsx
modified: migrations/20240115_add_index.sql
modified: docker-compose.yml
modified: .env.production
5개 파일. 전부 다른 작업이다. 프론트, 백엔드, DB, 인프라, 환경설정.
이게 내 하루다.
오전: 컨텍스트 스위칭의 연속
10시 52분. 슬랙 메시지. “로그인 버튼 클릭 시 로딩 표시 안 나와요.”
좋아. 프론트부터 본다.
src/components/LoginButton.tsx 연다.
탭 하나 추가. 24개.
const handleLogin = async () => {
setLoading(true); // 이거 있는데?
await loginAPI();
setLoading(false);
}
코드는 멀쩡하다. 크롬 개발자도구 연다. 탭 25개. 네트워크 탭 확인. API 응답이 0.2초. 너무 빨라서 로딩이 안 보이는 거였다.
“빠른 건데요” 라고 말할 수 없다.
setTimeout 300ms 추가한다.
11시 8분. 커밋하려는데 슬랙. “DB 용량 90% 넘었어요. 확인 부탁드려요.”

프론트 작업 멈춘다. 커밋 안 한다. 탭 전환. PostgreSQL 들어간다.
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
LIMIT 10;
logs 테이블이 38GB다.
3개월치 로그가 쌓여있다.
파티셔닝 해야 하는데 시간이 없다. 일단 3개월 전 데이터 아카이빙. 새 터미널 탭 연다. 26개.
pg_dump --table=logs --where="created_at < '2024-10-01'" > logs_archive.sql
덤프 돌리는데 15분 걸린다고? 그동안 다른 거 해야지.
정신이 5개로 분열되는 순간
11시 23분. 덤프는 진행 중.
아까 프론트 작업 커밋하려고 했지.
git add 하려는데 슬랙.
“API 응답 느린데 확인 가능하세요?”
백엔드로 간다.
node.js 프로세스 로그 확인.
탭 27개.
tail -f /var/log/app/api.log | grep "slow query"
나온다. /api/users/list 엔드포인트.
쿼리가 3초 걸린다.
코드 열어본다. 탭 28개.
const users = await db.query(`
SELECT * FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE users.status = 'active'
`);
인덱스가 없다. status 컬럼에.
이거 내가 짠 건데. 언제 짠 거지.
인덱스 추가 마이그레이션 파일 만든다. 탭 29개.
11시 47분. PostgreSQL 덤프 끝났다. 아직 삭제는 안 했다. 백업 확인부터.
psql test_db < logs_archive.sql
테스트 DB에 복원해본다. 이것도 10분 걸린다.
그동안 인덱스 추가? 아니다. 프로덕션에 바로 추가하면 락 걸린다. 새벽에 해야 한다. 메모해둔다.
메모장 탭 연다. 30개.
“TODO: 새벽 3시 인덱스 추가 - users.status”
이 메모를 볼 가능성은 30%다.

점심, 먹으면서 AWS 콘솔
12시 18분. 편의점 김밥 뜯는다. 한 손으로 먹고 한 손으로 탭 정리.
닫아도 될 것 같은 거 찾는다.
htop 3개 중 2개 닫는다. 28개.
AWS 콘솔 확인한다. 습관이다. CloudWatch 들어간다.
EC2 CPU 사용률 78%. 오전보다 올랐다. 평소 50%인데.
뭔가 있다. 확인해야 한다. 김밥 씹으면서 서버 접속.
top -c
node 프로세스가 2개다.
하나는 정상. 하나는?
ps aux | grep node 쳐본다.
좀비 프로세스다. PM2 재시작 안 된 거.
pm2 restart all 친다.
CPU 사용률 내려간다. 52%.
김밥 다 먹었다. 12시 34분. 점심시간 16분 썼다.
오후: 긴급 요청의 연속
2시 11분. 대표님 슬랙. “결제 모듈 테스트 환경 급하게 필요합니다.”
결제 모듈. 토스페이먼츠. 프론트도 고쳐야 하고 백엔드도 고쳐야 하고.
스테이징 서버에 배포해야 한다. 근데 스테이징 서버 환경변수가 다르다.
.env.staging 파일 연다. 탭 29개.
토스 테스트 키 찾는다. 노션에 있을 거다.
브라우저 탭 연다. 30개. 노션 로그인 만료됐다. 다시 로그인.
테스트 키 찾았다. 복사한다.
.env.staging 에 붙여넣는다.
프론트 코드 수정.
PaymentButton.tsx 연다. 탭 31개.
const clientKey = process.env.REACT_APP_TOSS_CLIENT_KEY;
환경변수 추가해야 한다.
.env.development 도 수정. 탭 32개.
백엔드 코드 수정.
payment.controller.js 연다. 탭 33개.
결제 승인 API 수정하고. 웹훅 엔드포인트 추가하고.
3시 2분. 배포 준비 끝.
git commit -m "Add payment test environment" 친다.
배포 스크립트 돌린다. 탭 34개.
./deploy.sh staging
5분 걸린다. 기다린다. 그동안 다른 거 못 한다. 불안해서.
3시 7분. 배포 끝. 테스트해본다. 결제 버튼 누른다.
에러 난다. 콘솔 확인. “CORS policy error”
아. NGINX 설정 안 했다. 서버 접속. 탭 35개.
sudo vim /etc/nginx/sites-available/default
CORS 헤더 추가.
add_header 'Access-Control-Allow-Origin' '*';
sudo nginx -t 테스트.
sudo systemctl reload nginx 재시작.
다시 테스트. 된다. 대표님한테 메시지. “완료했습니다.”
3시 29분.
저녁: 장애의 전조
6시 43분. 슬랙 알림. “사이트 느려요.”
심장이 빨리 뛴다. 조건반사다.
CloudWatch 연다. 이미 열려있다. RDS CPU 91%.
뭔가 쿼리가 터졌다. PostgreSQL 접속. 슬로우 쿼리 확인.
SELECT * FROM pg_stat_activity
WHERE state = 'active'
ORDER BY query_start;
10초 넘게 돌아가는 쿼리가 3개다.
전부 orders 테이블 조인.
내가 오전에 추가한 인덱스. 아직 안 만들었다. 새벽에 하려고 했는데.
지금 만들어야 한다. 프로덕션이 느리면 장애다.
CREATE INDEX CONCURRENTLY idx_users_status ON users(status);
CONCURRENTLY 옵션. 락 안 걸린다.
하지만 시간이 오래 걸린다.
진행 상황 확인할 방법이 없다. 기다린다. 7분.
7시 2분. 인덱스 생성 완료. 쿼리 속도 확인. 0.3초로 줄었다.
RDS CPU 58%로 내려간다. 숨 쉰다.
아무도 모른다. 방금 장애를 막았다는 걸.
밤: 드디어 내 시간?
9시 17분. 퇴근 시간 한참 지났다. 사무실에 나 혼자.
오늘 한 일 정리해본다.
- 프론트 버그 수정 1건
- DB 용량 정리 (미완)
- API 성능 개선
- 결제 모듈 테스트 환경 구축
- 인덱스 긴급 추가
5개 다른 영역이다.
오늘 못 한 일.
- 프론트 리팩토링
- 백엔드 테스트 코드 작성
- DB 파티셔닝 설계
- CI/CD 파이프라인 개선
- 로그 아카이빙 자동화
5개 다 못 했다.
터미널 탭 확인. 37개. 이제 정리해야 한다.
하나씩 닫는다. 어떤 건 뭐하던 건지 모른다. 그냥 닫는다.
15개 남았다. 여기서 멈춘다. 내일 쓸 것들이다.
리팩토링이나 하자.
user.service.js 파일 연다. 탭 16개.
코드 보다가 슬랙 알림. “API 타임아웃 에러 났어요.”
9시 48분. 다시 시작한다.
이게 정상인가
퇴근은 11시 23분. 집 가는 지하철에서 생각한다.
오늘 내가 한 일. 프론트엔드 개발자의 일. 백엔드 개발자의 일. DBA의 일. DevOps 엔지니어의 일. 그리고 장애 대응.
5명이 할 일을 혼자 한다. 아니, 5명이 제대로 하면 더 잘할 일을. 나 혼자 대충 한다.
터미널 탭 20개는. 내 정신이 20갈래로 찢어져 있다는 뜻이다.
각 탭마다 다른 문맥. 다른 언어. 다른 문제.
React에서 PostgreSQL로. Node.js에서 NGINX로. AWS에서 다시 프론트로.
스위칭할 때마다. 뇌가 재부팅된다.
“멀티태스킹 잘하시네요.” 대표님이 칭찬한다.
멀티태스킹이 아니다. 생존이다.
채용 공고 올린 지 7개월. 아직도 혼자다.
“역량 쌓기 좋은 환경이에요.” 맞다. 억지로 쌓인다. 원하지 않아도 쌓인다.
근데 깊이가 없다. 전부 얕다. 급해서.
제대로 하고 싶다. 한 가지를 깊게 파고 싶다. 코드 리뷰 받고 싶다. 테스트 코드 짜고 싶다.
시간이 없다. 터미널 탭 20개가 날 기다린다.
집 도착. 12시 9분. 노트북 가방 던진다.
씻고 자야지. 근데 슬랙 확인부터.
빨간 점이 하나 있다. 열어본다.
“내일 오전에 급한 건 있습니다.”
하하. 웃음이 나온다.
오늘도. 내일도. 터미널 탭 20개.
내일 아침 터미널 탭은 몇 개일까. 어차피 닫을 시간 없다.
