Apache Zeppelin 프론트엔드 개발 모드 셋업 가이드
Apache Zeppelin은 백엔드(Java/Scala)와 프론트엔드(AngularJS + Webpack)가 분리되어 있어, UI만 수정할 때는 전체 Maven 빌드 없이 프론트엔드 개발 서버만 띄워서 작업할 수 있습니다.
사내 빅데이터 모니터링 플랫폼에서 Zeppelin 노트북 UI를 커스터마이징할 때, 매번 mvn package -DskipTests를 돌리는 것은 수 분이 걸리는 고통스러운 작업이었습니다. 개발 모드를 활용하면 파일을 저장하는 즉시 브라우저에서 변경 사항을 확인할 수 있습니다.
구조 이해
Zeppelin의 프론트엔드는 zeppelin-web/ 디렉토리 아래에 위치하며, 별도의 package.json과 Webpack 설정을 갖고 있습니다.
zeppelin/
├── bin/
│ └── zeppelin-daemon.sh ← 백엔드 Thrift 서버 기동
├── zeppelin-web/
│ ├── package.json
│ ├── bower.json
│ └── app/ ← AngularJS 소스 코드프론트엔드 개발 서버는 백엔드(localhost:8080)로 API 요청을 프록시하기 때문에, 반드시 백엔드 데몬이 먼저 실행 중이어야 합니다.
실행 순서
1단계: Zeppelin 백엔드 데몬 실행
$ bin/zeppelin-daemon.sh start기본적으로 http://localhost:8080에서 기동됩니다. 로그는 logs/zeppelin-*.log에서 확인합니다.
# 실행 상태 확인
$ bin/zeppelin-daemon.sh status
# 로그 실시간 확인
$ tail -f logs/zeppelin-*.log2단계: 프론트엔드 의존성 설치 (최초 1회)
zeppelin-web/ 디렉토리로 이동해서 패키지를 설치합니다.
$ cd zeppelin-web
$ yarn install
npm install도 동작하지만, Zeppelin 공식 빌드 스크립트는yarn을 사용하므로 Yarn을 권장합니다.
3단계: 프론트엔드 개발 서버 실행
$ yarn run dev성공하면 http://localhost:9000으로 개발 서버가 뜨고, 소스 파일을 수정하면 자동으로 브라우저가 새로고침됩니다. API 요청은 내부적으로 localhost:8080으로 프록시됩니다.
자주 하는 작업
특정 포트로 백엔드 변경
백엔드가 기본 포트가 아닌 곳에서 뜨고 있다면, zeppelin-web/Gruntfile.js (또는 webpack.config.js)의 프록시 설정을 수정합니다.
// webpack.config.js 또는 Gruntfile.js 내 proxy 설정 예시
proxy: {
'/api': {
target: 'http://localhost:8080', // 백엔드 주소
changeOrigin: true
}
}빌드 결과물을 Zeppelin에 반영
개발이 완료됐다면 프론트엔드를 빌드해서 Zeppelin 웹 리소스 폴더에 복사합니다.
$ yarn run build # dist/ 산출물 생성또는 전체 Maven 빌드를 통해 최종 패키징합니다.
$ mvn package -pl zeppelin-web -DskipTests주의사항
- 개발 서버(
localhost:9000)는 핫 리로드 전용으로, 실서비스에 배포하는 용도가 아닙니다. - Zeppelin 버전에 따라 Node.js 호환 버전이 다릅니다.
.nvmrc또는package.json의engines항목을 먼저 확인하세요. - WebSocket(
/ws) 연결도 프록시를 통해 백엔드로 전달되므로, 실시간 노트 실행 결과 수신도 개발 모드에서 정상 작동합니다.