Hapi.js 소개
Hapi.js는 Node.js에서 웹 애플리케이션과 서비스를 구축하기 위한 강력하고 풍부한 프레임워크입니다. 개발 프로세스를 간소화하고 확장 가능하며 보안이 강화된 애플리케이션을 쉽게 구축할 수 있는 강력한 기능과 플러그인 세트를 제공합니다.
역사
Hapi.js는 Eran Hammer에 의해 만들어졌으며 2011년에 처음 출시되었습니다. 월마트에서 자사의 전자상거래 플랫폼을 처리하기 위해 처음 개발되었으며, 이후 오픈소스화되어 독특한 기능과 확장성 때문에 Node.js 커뮤니티에서 인기를 얻게 되었습니다.
기능
1. 라우팅
Hapi.js는 유연하고 선언적인 라우팅 시스템을 제공합니다. 여러 HTTP 메서드, URL 매개변수 및 쿼리 매개변수로 된 라우트를 정의할 수 있습니다. 아래는 예시입니다:
const Hapi = require('hapi');
const server = Hapi.server({
port: 3000,
host: 'localhost'
});
server.route({
method: 'GET',
path: '/hello/{name}',
handler: (request, h) => {
return `안녕하세요, ${request.params.name}님!`;
}
});
async function startServer() {
await server.start();
console.log('서버가 실행 중입니다:', server.info.uri);
}
startServer();
위의 예시에서는 "/hello/{name}" 경로에서 GET 요청을 수신하는 라우트를 정의합니다. 이 경로로 요청이 올 때, 서버는 URL에서 제공된 이름 매개변수를 포함한 인사 메시지를 응답합니다.
2. 요청 수명 주기
Hapi.js는 상세한 요청 수명 주기를 제공하여 요청의 여러 단계를 처리할 수 있습니다. 이에는 인증, 유효성 검사, 사전 처리 및 응답 생성이 포함됩니다. 요청 수명 주기의 다른 단계에서 플러그인 및 훅을 정의하여 기능을 확장할 수 있습니다. 아래는 예시입니다:
server.ext('onPreHandler', (request, h) => {
console.log('요청이 수신되었습니다:', request.path);
return h.continue;
});
위의 예시에서는 server.ext 메서드를 사용하여 사전 핸들러 훅을 정의합니다. 이 훅은 각 수신 요청의 핸들러 함수보다 먼저 실행됩니다. 우리는 요청의 경로를 로깅하고 h.continue를 호출하여 요청 수명 주기를 계속합니다.
3. 인증과 권한 부여
Hapi.js는 내장된 인증 및 권한 부여 기능을 제공합니다. 세션 기반, 토큰 기반 또는 OAuth와 같은 다양한 인증 전략을 간편하게 통합할 수 있습니다. 또한 특정 라우트 또는 리소스에 대한 액세스 제어 규칙을 정의할 수 있습니다. 아래는 예시입니다:
const Bcrypt = require('bcrypt');
const users = {
john: {
username: 'john',
password: '$2b$10$1Kxv7iXq3c7gjQJ8M6jMduPp2z5mIYF2uNt7Q0mZyWn7pI1n6Xm2e' // 'password'
}
};
const validateUser = async (request, username, password, h) => {
const user = users[username];
if (!user) {
return { credentials: null, isValid: false };
}
const isValid = await Bcrypt.compare(password, user.password);
return { credentials: { id: user.id, name: user.name }, isValid };
};
server.auth.strategy('basic', 'basic', { validate: validateUser });
server.route({
method: 'GET',
path: '/private',
options: {
auth: 'basic'
},
handler: (request, h) => {
return `환영합니다, ${request.auth.credentials.name}님!`;
}
});
위의 예시에서는 server.auth.strategy 메서드를 사용하여 기본 인증 전략을 정의합니다. 우리는 사용자 자격 증명을 검사하는 유효성 검사 함수를 제공합니다. validateUser 함수는 Bcrypt를 사용하여 비밀번호 해시를 비교합니다. 그런 다음 이 인증 전략을 auth 옵션으로 설정하여 라우트에 적용합니다.
4. 플러그인과 확장성
Hapi.js는 응용 프로그램에 쉽게 통합할 수 있는 풍부한 플러그인 생태계를 가지고 있습니다. 이러한 플러그인은 로깅, 캐싱, 데이터베이스 통합 등과 같은 추가 기능을 제공합니다. 또한 응용 프로그램의 기능을 확장하기 위해 사용자 정의 플러그인을 만들 수도 있습니다. 아래는 JWT 인증을 위해 hapi-auth-jwt2 플러그인을 사용하는 예시입니다:
const HapiJwt = require('hapi-auth-jwt2');
await server.register(HapiJwt);
const validateUser = async (decoded, request, h) => {
const user = await User.findById(decoded.id);
if (!user) {
return { isValid: false };
}
return { isValid: true };
};
server.auth.strategy('jwt', 'jwt', {
key: 'your_secret_key',
validate: validateUser
});
server.route({
method: 'GET',
path: '/private',
options: {
auth: 'jwt'
},
handler: (request, h) => {
return `환영합니다, ${request.auth.credentials.name}님!`;
}
});
위의 예시에서는 server.register 메서드를 사용하여 hapi-auth-jwt2 플러그인을 등록합니다. 그런 다음 server.auth.strategy 메서드를 사용하여 JWT 인증 전략을 정의합니다. validateUser 함수는 디코딩된 JWT 토큰을 유효성 검사하고 데이터베이스에서 사용자를 검색하기 위해 호출됩니다. 마지막으로, jwt 인증 전략을 라우트에 적용합니다.
예시
더 많은 예시와 자세한 문서는 공식 Hapi.js 웹사이트에서 확인할 수 있습니다. 해당 웹사이트에서는 Hapi.js를 시작하고 기능을 깊이 이해하기 위한 포괄적인 가이드, 튜토리얼 및 API 참조가 제공됩니다.
Hapi.js는 Node.js에서 웹 애플리케이션과 서비스를 구축하기 위한 강력하고 다용도의 프레임워크입니다. 다양한 기능, 강력한 플러그인 생태계 및 명확한 문서로 인해 개발자들 사이에서 인기 있는 선택지입니다.