DX(Developer Experience)는 쉽게 말하면 "이 도구 쓸 때 얼마나 편하냐"의 문제라고 할 수 있다.
개발자가 도구, 플랫폼, 라이브러리, API를 사용할 때 느끼는 전반적인 경험을 말한다. UX가 사용자 경험이라면, DX는 개발자 경험이다.
"좋은 개발자 경험은 개발자에게 도움이 될 뿐만 아니라 효율성을 높이고 조직의 성과를 높이는 데 필수적입니다." — 개발자 경험(Dex)이 주목받는 시대 - 요즘IT
예전에는 HTML, CSS, JS 파일 몇 개면 웹사이트 하나 만들 수 있었다.
지금은 번들러, 트랜스파일러, 린터, 포매터, 테스트 도구 등 설정할 게 엄청 많아졌다. 이렇게 도구가 많아지니까 "어떤 도구가 쓰기 편한지"가 선택의 중요한 기준이 됐다.
Vercel CEO 길레르모 로치의 말:
"우수한 개발자 경험은 개발자 생산성 향상으로 이어져 눈에 보이는 수익 창출 효과를 낸다." — 공감도 지능이다: 개발자의 마음을 얻는 8가지 방법 - CIO
이런 인식이 퍼지면서 Vercel, 토스페이먼츠 같은 기업들은 DX 팀을 따로 만들어서 운영하고 있다고 한다.
실제로 Vite가 Webpack을 대체해가는 이유도 "더 빠르고 설정이 간단해서"라고 할 수 있다. 기능은 비슷한데 DX가 좋으니까 개발자들이 갈아타는 거다..!
Vite vs Webpack은 DX 차이를 보여주는 대표적인 예시다.
Webpack은 서버 시작할 때 모든 파일을 미리 번들링한다. 프로젝트가 커지면 서버 켜는 데만 몇 십 초씩 걸린다.
Vite는 필요한 파일만 그때그때 처리하기 때문에 프로젝트가 아무리 커도 서버 시작이 빠르다.
AB180(에어브릿지) 팀의 실제 사례:
"기존에 210초 정도 걸리던 빌드가 esbuild로 2.16초만에 끝났습니다." — Webpack → Vite: 번들러 마이그레이션 이야기 - AB180
| 측정 항목 | Webpack | Vite | 개선율 |
| 프로덕션 빌드 | 250초 | 90초 | 64% 감소 |
| 개발 서버 시작 | 수십 초 | 수 초 | 10배 이상 |
Webpack 설정은 보통 50~100줄 이상이다:
const path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: './src/index.js',output: {
Vite 설정은 보통 5줄 내외:
import { defineConfig } from 'vite'import react from '@vitejs/plugin-react'export default defineConfig({plugins: [react()]})
같은 일을 하는데 하나는 설정하는 데에 30분 이상의 시간을 들여야하고, 하나는 바로 시작할 수 있다. 이런 점이 DX 차이다.
에러 메시지도 DX의 중요한 부분이다.
Error: Something went wrong
TypeError: Cannot read property 'map' of undefined
이런 에러 만나면 구글링부터 시작해야 한다. 어디서 터진 건지, 뭘 고쳐야 하는지 전혀 알 수 없다.
file.ts:12:5 lint/correctness/noUnusedVariables ━━━━━━━━━━━✖ 이 변수는 선언됐지만 사용되지 않습니다.10 │ function calculateTotal(items) {11 │ const TAX_RATE = 0.08;> 12 │ const unusedVar = "hello";│ ^^^^^^^^^13 │ return items.reduce((sum, item) => sum + item.price, 0);ℹ 사용하지 않는 변수는 리팩토링이 불완전하다는 신호일 수 있습니다.
좋은 에러 메시지의 특징:
1️⃣ 정확한 위치 - 파일명, 줄 번호, 컬럼까지 표시
2️⃣ 문제 코드 하이라이팅 - 어느 부분이 문제인지 바로 보임
3️⃣ 해결 힌트 - 왜 문제인지, 어떻게 하면 되는지 안내
Next.js도 개발 중 에러가 나면 브라우저에 친절한 에러 오버레이를 띄워준다. 원본 코드 위치도 보여주고, 관련 문서 링크도 제공한다.
새로운 라이브러리 쓸 때 제일 먼저 보는 게 문서다. 문서가 좋으면 30분 만에 적용하고, 문서가 안 좋으면 하루 종일 삽질할지도..!
React 문서는 "이 페이지에서는 여러분이 매일 사용하게 될 React 개념의 80%를 소개합니다"라고 시작한다. 핵심부터 알려주는 거다. 그리고 문서 안에서 직접 코드를 수정하고 결과를 볼 수 있다.
"기존 튜토리얼 문서는 줄글과 예제 코드가 선형적으로 보여지고, 각 연동 단계의 결과물이 어떤 지 알 수 없었어요. 이런 경험을 개선하기 위해 튜토리얼을 인터렉티브하게 바꿨어요." — 토스페이먼츠 - 개발자의 학습을 돕는 모든 것
요즘 TypeScript가 거의 기본이 되면서, 라이브러리가 타입을 잘 지원하는지도 DX의 중요한 부분이 됐다.
const [count, setCount] = useState(0);setCount("hello"); // ❌ IDE에서 바로 빨간 줄! 실행 전에 에러 발견setCount(count + 1); // ✅ 정상
import someLib from 'some-old-library';someLib.doSomething(???); // 파라미터가 뭔지 모름, 자동완성 안 됨// 타입 에러가 런타임에서야 터짐
타입 없는 라이브러리 쓰면 매번 문서 찾아봐야 하고, 버그도 나중에 발견된다.
요즘 DX 트렌드를 한 마디로 정리하면: "더 빠르게, 더 간단하게"
ESLint + Prettier 조합은 다들 써봤겠지만, 설정 파일만 4~5개이고 플러그인 충돌 잡느라 시간 다 간다..☠️
Biome은 린팅이랑 포매팅을 하나로 합친 거라고 한다. 설정 파일도 biome.json 하나면 끝.
| 작업 | ESLint/Prettier | Biome | 차이 |
| 린팅 (10,000파일) | 45.2초 | 0.8초 | 56배 빠름 |
| 포맷팅 | 12.1초 | 0.3초 | 40배 빠름 |
"Lint 작업에서 ESLint: 16.32s, Biome: 0.79s로 약 20배 더 빠른 성능을 보여주었다." — Biome가 ESLint와 Prettier를 대체할 수 있을까? - 후니네 개발하우스
Biome은 Rust로 만들어져서 네이티브로 돌아가고, 파일을 한 번만 파싱해서 린팅+포매팅을 같이 처리한다. ESLint+Prettier는 각각 따로 파싱하니까 느릴 수밖에 없다.
요즘 도구들은 "설정 없이 바로 시작"을 지향한다.
과거에는 "모든 걸 설정할 수 있어야 한다"가 미덕이었는데, 지금은 "좋은 기본값으로 바로 시작"이 트렌드인 것 같다.
DX는 결국 "개발할 때 얼마나 덜 고통받는가?"의 문제다.
새로운 도구나 라이브러리 선택할 때, 기능만 보지 말고 DX도 같이 고려해보면 좋겠다.
이걸 참고해서 미래에 DX도 고려해보는 것도 좋을 것 같다!