ServBay로 Hapi.js 개발환경 구축하기
Hapi.js는 애플리케이션 및 API 구축에 적합한 강력하고 유연한 Node.js 프레임워크입니다. ServBay는 Node.js 개발자를 위해 Node.js 런타임, 다양한 데이터베이스, 그리고 설정이 간편한 웹 서버 기능을 통합 제공하는 편리한 로컬 개발 환경입니다. 본 문서에서는 ServBay 환경에서 Hapi.js 프로젝트를 생성하고 실행하는 방법, ServBay의 사이트 기능을 통한 접근 설정, 그리고 ServBay 내장 데이터베이스 연결 예시를 안내합니다.
Hapi.js란 무엇인가요?
Hapi.js는 Walmart Labs에서 개발한, 애플리케이션과 서비스를 구축하기 위한 강력하고 유연한 Node.js 프레임워크입니다. 뛰어난 플러그인 시스템, 구성 위주의 접근 방식, 내장 보안 기능으로 유명하며, 개발자가 고성능·유지보수성이 뛰어난 웹 앱과 API를 보다 효율적으로 개발할 수 있도록 돕습니다.
Hapi.js의 주요 특징 및 장점
- 플러그인 시스템: Hapi.js는 강력하고 사용이 쉬운 플러그인 시스템을 제공하여, 프레임워크의 기능 확장 또는 비즈니스 로직을 재사용 가능한 모듈로 쉽게 구성할 수 있습니다.
- 구성 우선: 다양한 구성을 활용해 라우팅·유효성 검증·캐싱 등의 동작을 세밀하게 정의할 수 있습니다.
- 입력 검증: 선언형 데이터 유효성 검증 기능을 제공하는 Joi 라이브러리가 내장되어 있어, 데이터의 무결성과 보안을 보장합니다.
- 풍부한 생태계: 활발한 커뮤니티와 공식/서드파티 플러그인이 인증, 권한, 캐싱, 로깅 등 다양한 필요 기능을 지원합니다.
- 보안: 입력 검증과 CORS 제어 등 다양한 보안 기능이 내장되어 있어, 일반적인 웹 보안 위협으로부터 안전하게 보호해줍니다.
- 로깅과 디버깅: 요청 라이프사이클의 상세 로그와 효과적인 디버깅 도구를 제공합니다.
Hapi.js 덕분에 개발자는 비즈니스 로직에 집중할 수 있고, HTTP 처리·라우팅·유효성 검증·보안과 같은 복잡한 저수준 문제는 프레임워크가 처리합니다.
ServBay로 Hapi.js 프로젝트 시작하기
이 절에서는 ServBay의 Node.js 환경을 사용해 기본적인 Hapi.js 프로젝트를 만드는 방법과 ServBay 사이트(리버스 프록시) 기능을 활용해 접근하는 방법을 안내합니다.
사전 준비사항
시작 전, 다음 사항을 준비하세요.
- macOS에 ServBay를 정상 설치했는지 확인하세요.
- ServBay 앱 내 패키지 탭에서 Node.js 패키지가 활성화되어 있는지 확인하세요. ServBay 컨트롤 패널의 "패키지" 탭에서 Node.js를 확인 및 활성화할 수 있습니다.
- 기본적인 터미널 사용법과 Node.js의 npm 패키지 매니저를 다룰 수 있어야 합니다.
Hapi.js 프로젝트 만들기
프로젝트 폴더 초기화
터미널을 열고, ServBay의 기본 웹 루트 디렉터리(
/Applications/ServBay/www
)로 이동하세요. 이곳에 새 프로젝트 폴더(예:servbay-hapi-app
)를 만들고 해당 폴더로 진입합니다.bashcd /Applications/ServBay/www mkdir servbay-hapi-app cd servbay-hapi-app
1
2
3Node.js 프로젝트 초기화
프로젝트 폴더에서 npm으로 Node.js 프로젝트를 초기화합니다.
bashnpm init -y
1이 명령어로 프로젝트 루트에
package.json
파일이 생성됩니다.Hapi.js 의존성 설치
npm을 사용해 Hapi.js 핵심 라이브러리를 설치합니다.
bashnpm install @hapi/hapi
1이로써
@hapi/hapi
가 프로젝트의 의존성에 추가됩니다.앱 진입 파일 생성
프로젝트 루트에
server.js
파일을 생성하고 아래 예제 코드를 추가합니다. 이 코드는 간단한 Hapi.js 서버를 만듭니다.javascript'use strict'; // 엄격 모드 활성화 const Hapi = require('@hapi/hapi'); const init = async () => { const server = Hapi.server({ port: process.env.PORT || 3000, // 기본 3000 포트 혹은 환경변수 PORT 값 사용 host: 'localhost' // 로컬 루프백 주소에 바인딩 }); // 간단한 루트 라우트 정의 server.route({ method: 'GET', path: '/', handler: (request, h) => { return 'Hello from Hapi.js powered by ServBay!'; } }); // 서버 시작 await server.start(); console.log('Server running on %s', server.info.uri); }; // 처리되지 않은 Promise Rejection 에러 process.on('unhandledRejection', (err) => { console.error(err); process.exit(1); // 프로세스 종료 }); // init 함수 호출로 앱 구동 init();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33위 코드는
localhost
의 지정 포트(기본 3000)에서 Hapi 서버를 구동하고, 루트 경로(/
)에 GET 요청 처리기를 제공합니다.
개발 모드 진입 및 ServBay 사이트 설정
개발 과정 중 Node.js 앱을 직접 실행하고, ServBay의 리버스 프록시 기능으로 이를 커스텀 도메인에 매핑하여 브라우저에서 접근할 수 있습니다. 또한 ServBay가 제공하는 SSL 인증서도 활용 가능합니다.
Hapi.js 개발 서버 실행
터미널에서
servbay-hapi-app
프로젝트 폴더에 있는지 확인 후,node
명령으로server.js
파일을 실행합니다. ServBay 리버스 프록시와 연동을 위해 예시로 8585 포트를 지정할 수 있습니다.bashPORT=8585 node server.js
1서버가 시작되면,
Server running on http://localhost:8585
와 같은 메시지가 나타납니다. 이 터미널 창을 열어두어야 서버가 동작을 유지합니다.ServBay에서 사이트(리버스 프록시) 구성
ServBay 앱을 실행하고, "사이트" 탭에서 왼쪽 하단 "+" 버튼을 클릭해 새 사이트를 추가합니다.
- 이름 (Name):
ServBay Hapi Dev
(자유롭게 지정 가능, ServBay 목록에서 구분용) - 도메인 (Domain):
servbay-hapi-dev.servbay.demo
(.servbay.demo
서픽스 활용 권장—실제 도메인과 충돌 방지, 그리고 ServBay의 로컬 CA 인증서 이용) - 사이트 타입 (Type):
리버스 프록시(Reverse Proxy)
선택 - 프록시 대상 (Proxy to):
- 프로토콜 (Protocol):
http
- IP 주소 (IP Address):
127.0.0.1
(Node.js 서버가 로컬 루프백에서 실행 중이기 때문) - 포트 (Port):
8585
(node server.js
실행 시 지정한 PORT 값과 동일)
- 프로토콜 (Protocol):
"추가"를 클릭해 설정을 완성합니다. ServBay는 자동으로 웹서버(예: Caddy 또는 Nginx)를 구성,
https://servbay-hapi-dev.servbay.demo
로 들어오는 요청을http://127.0.0.1:8585
로 리버스 프록시합니다. 또한.servbay.demo
도메인에 대해 SSL 인증서(ServBay User CA 발급)를 자동 생성 및 신뢰 추가하므로, 로컬에서도 안전하게 HTTPS 접근이 가능합니다.보다 상세한 사이트 설정법은 ServBay 사이트 구성 문서를 참고하세요.
- 이름 (Name):
Hapi.js 개발 앱 접근
웹 브라우저를 열고, 설정한 도메인인
https://servbay-hapi-dev.servbay.demo
로 접속하세요. "Hello from Hapi.js powered by ServBay!" 메시지가 보이면 성공입니다.이제
server.js
파일을 수정하거나, nodemon 같은 툴과 연동해 핫 리로드 환경을 구축하면 해당 변경사항이 ServBay 리버스 프록시를 통해 브라우저에 실시간 반영됩니다.
운영(프로덕션) 버전 배포(예시)
운영환경에서는 보다 견고한 프로세스 관리(예: PM2)와 별도의 설정이 필요할 수 있습니다. 아래는 다른 포트로 실행하고 ServBay 리버스 프록시와 연동하는 간단한 예시입니다.
Hapi.js 운영 서버 실행
운영환경용으로 다른 포트(예: 8586)와
production
환경설정으로 앱을 실행한다고 가정합니다:bashPORT=8586 NODE_ENV=production node server.js
1(참고: 실제 운영환경에서는 PM2와 같은 툴로 Node.js 프로세스를 관리하며, ServBay도 PM2 통합을 지원합니다.)
ServBay에서 운영용 사이트(리버스 프록시) 추가
ServBay 앱에서 "사이트" 탭 → "+" 클릭 → 아래와 같이 입력:
- 이름 (Name):
ServBay Hapi Prod
- 도메인 (Domain):
servbay-hapi-prod.servbay.demo
- 사이트 타입 (Type):
리버스 프록시(Reverse Proxy)
- 프록시 대상 (Proxy to):
- 프로토콜 (Protocol):
http
- IP 주소 (IP Address):
127.0.0.1
- 포트 (Port):
8586
- 프로토콜 (Protocol):
"추가"를 클릭하세요.
- 이름 (Name):
운영 버전 Hapi.js 앱 접근
브라우저에서
https://servbay-hapi-prod.servbay.demo
에 접속하면, 개발 버전과 동일한 화면(코드가 분기되어 있으면 상이할 수 있음)을 확인할 수 있습니다. 이 작업을 통해 운영환경 포트와 설정을 모의하며 안전하게 로컬 테스트가 가능합니다.
ServBay의 사이트 기능을 사용하면, 여러 로컬 개발 또는 운영 환경의 도메인을 손쉽게 관리하고, 여러 포트에서 실행 중인 Hapi.js(또는 기타 Node.js) 인스턴스와 매핑할 수 있습니다.
ServBay 데이터베이스 연결하기
ServBay는 MySQL, MariaDB, PostgreSQL, MongoDB, Redis 등 다양한 데이터베이스 시스템을 내장·지원합니다. 이 절에선 Hapi.js 프로젝트에서 이 데이터베이스들과 연결하는 방법을 예시로 안내합니다.
중요: 데이터베이스 연결 전, ServBay 앱의 "패키지" 탭에서 필요한 데이터베이스 패키지를 활성화하고 해당 DB 서비스가 실행 중인지 반드시 확인하세요. ServBay 컨트롤 패널에서 각 DB의 실행 상태를 쉽게 확인할 수 있습니다.
ServBay의 기본 DB 사용자명과 비밀번호는 아래와 같습니다.
- MySQL/MariaDB: 사용자명
root
, 비밀번호password
- PostgreSQL: 사용자명
user
, 비밀번호password
- MongoDB: 인증 필요 없음 (기본 설정)
- Redis: 인증 필요 없음 (기본 설정)
참고: 보안을 위해, ServBay를 비로컬 환경에서 사용할 경우 데이터베이스 기본 비밀번호를 변경하길 강력히 권장합니다. ServBay의 메뉴를 통해 MySQL, MariaDB, PostgreSQL의 root 비밀번호를 손쉽게 재설정할 수 있습니다. 자세한 방법은 데이터베이스 비밀번호 재설정 문서를 참고하세요.
아래는 각 데이터베이스 연결 예시 코드입니다. 먼저 반드시 npm으로 해당 DB 클라이언트 라이브러리를 설치해야 합니다.
MySQL 연결
MySQL 클라이언트 라이브러리 설치:
bashnpm install mysql2 # 또는 mysql
1연결 예시 코드(
mysql2
사용):javascriptconst mysql = require('mysql2'); const connection = mysql.createConnection({ host: 'localhost', user: 'root', // ServBay 기본 사용자명 password: 'password', // ServBay 기본 비밀번호 database: 'servbay_hapi_app' // 실제 데이터베이스명으로 교체 }); connection.connect(err => { if (err) { console.error('Error connecting to MySQL: ' + err.stack); return; } console.log('Connected to MySQL as id ' + connection.threadId); }); // 필요시 연결 종료 // connection.end();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19MariaDB 연결
MariaDB 클라이언트 라이브러리 설치:
bashnpm install mariadb
1연결 예시 코드:
javascriptconst mariadb = require('mariadb'); const pool = mariadb.createPool({ host: 'localhost', user: 'root', // ServBay 기본 사용자명 password: 'password', // ServBay 기본 비밀번호 database: 'servbay_hapi_app', // 실제 데이터베이스명으로 교체 connectionLimit: 5 // 커넥션 풀 크기 }); pool.getConnection() .then(conn => { console.log("Connected to MariaDB"); // conn.query(...) 쿼리 실행 conn.release(); // 커넥션 반환 }) .catch(err => { console.error("Not connected to MariaDB due to error: " + err); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18PostgreSQL 연결
PostgreSQL 클라이언트 라이브러리 설치:
bashnpm install pg
1연결 예시 코드:
javascriptconst { Pool } = require('pg'); const pool = new Pool({ user: 'user', // ServBay 기본 사용자명 host: 'localhost', database: 'servbay_hapi_app', // 실제 데이터베이스명으로 교체 password: 'password', // ServBay 기본 비밀번호 port: 5432, // PostgreSQL 기본 포트 }); pool.connect((err, client, done) => { if (err) { console.error('Error connecting to PostgreSQL: ', err); return; } console.log('Connected to PostgreSQL'); client.query('SELECT NOW()', (err, res) => { done(); // 커넥션 반환 if (err) { console.error('Error executing query', err.stack); } else { console.log('PostgreSQL current time:', res.rows[0].now); } }); }); // 애플리케이션 종료 시 커넥션 풀 자동 종료 // pool.end();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27MongoDB 연결
MongoDB 클라이언트 라이브러리 설치:
bashnpm install mongoose # 또는 mongodb
1연결 예시 코드(
mongoose
사용):javascriptconst mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/servbay-hapi-app', { useNewUrlParser: true, useUnifiedTopology: true, // ServBay 기본 MongoDB는 인증 필요 없음, 인증 설정 시 아래 옵션 추가 // authSource: 'admin', // user: 'your_username', // pass: 'your_password', }) .then(() => console.log('MongoDB connected')) .catch(err => console.error('MongoDB connection error:', err)); // 애플리케이션 실행 내내 연결 유지 // 연결 끊기: mongoose.connection.close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Redis 연결
Redis 클라이언트 라이브러리 설치:
bashnpm install redis
1연결 예시 코드:
javascriptconst redis = require('redis'); // 기본 연결값: host: 'localhost', port: 6379 const client = redis.createClient(); client.on('error', function (err) { console.error('Redis Error: ' + err); }); client.on('connect', function () { console.log('Redis client connected'); }); // Redis 서버 연결 client.connect(); // redis v4+는 connect() 호출 필요 // 예시: 키-값 설정 및 조회 // async function exampleRedisUsage() { // await client.set('mykey', 'myvalue'); // const value = await client.get('mykey'); // console.log('Value from Redis:', value); // await client.del('mykey'); // } // exampleRedisUsage(); // 애플리케이션 종료 시 연결 끊기 // client.quit();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
위와 같은 연결 코드를 Hapi.js 앱에 통합하면, ServBay가 제공하는 각종 데이터베이스 서비스를 로컬 개발 환경에서 자유롭게 사용할 수 있습니다.
요약
ServBay를 활용하면 macOS에서 Hapi.js 개발환경 구축이 매우 효율적입니다. ServBay는 쉽고 체계적인 Node.js 런타임 관리, 다수의 즉시 사용 가능한 데이터베이스, 그리고 사이트 기능(리버스 프록시와 자동 SSL 설정 제공)을 통한 Web 접근 환경 간편화를 모두 지원합니다. 본 문서의 안내를 따르면 빠르게 Hapi.js 프로젝트를 시작하고, ServBay의 다양한 기능으로 개발 효율을 극대화할 수 있습니다.