현대 개발에서 API 래핑은 중요한 기술입니다. API를 래핑하면 개발자는 읽기 쉽고, 유지 관리 및 확장 가능한 코드를 생성하여 궁극적으로 개발 효율성을 높일 수 있습니다. 오늘은 Reddit의 API와 상호작용하기 위해 Node.js에서 간단하면서도 효과적인 래퍼를 구축하는 방법을 살펴보겠습니다.
Reddit과 상호작용하는 애플리케이션을 개발할 때 API를 직접 호출하는 것은 가능하지만 이상적이지는 않습니다. 코드를 더욱 모듈화하고 유지 관리하기 쉽게 만들고 싶다면 API를 래핑하는 것이 필수적입니다. API를 래핑하면 다음을 수행할 수 있습니다.
액세스 토큰 획득 및 검색 쿼리 수행과 같이 Reddit API와 상호 작용하는 데 필요한 필수 기능을 포함하는 기본 Reddit 클래스부터 시작하겠습니다.
코드에서는 Reddit 클래스의 생성자를 정의하는 것부터 시작합니다. 이 생성자는 주로 clientId, clientSecret, userAgent 및 기본 baseURL과 같은 Reddit API에 필요한 중요한 매개변수를 초기화하는 일을 담당합니다. 이러한 매개변수는 민감한 정보가 하드코딩되지 않도록 환경 변수에서 검색됩니다.
export class Reddit { private baseURL: string; private clientId: string; private clientSecret: string; private userAgent: string; private token?: string; constructor() { this.clientId = getEnvironmentVariable('REDDIT_CLIENT_ID')!; this.clientSecret = getEnvironmentVariable('REDDIT_SECRET')!; this.userAgent = getEnvironmentVariable('REDDIT_USER_AGENT')!; this.baseURL = getEnvironmentVariable('REDDIT_BASE_URL')!; } }
요청 URL을 작성하는 것은 API 래핑의 중요한 부분입니다. API 엔드포인트와 선택적 옵션 매개변수를 사용하는 buildUrl 메소드를 생성합니다. 이 메소드는 옵션 객체를 URL 쿼리 문자열로 변환하여 완전한 요청 URL을 구성합니다.
private buildUrl(endpoint: string, options?: RedditSearchOptions): string { const preparedParams: [string, string][] = Object.entries({ ...options }) .filter( ([key, value]) => value !== undefined && value !== null && key !== 'apiKey', ) .map(([key, value]) => [key, `${value}`]); const searchParams = new URLSearchParams(preparedParams); return `${this.baseURL}/${endpoint}?${searchParams}`; }
Reddit API는 인증을 위해 OAuth2가 필요하므로 먼저 액세스 토큰을 얻어야 합니다. getAccessToken 메소드는 액세스 토큰을 검색하고 저장하기 위해 POST 요청을 보냅니다. 이 토큰은 반복되는 요청을 피하기 위해 캐시됩니다.
private async getAccessToken(): Promise{ if (this.token) return this.token; const auth = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString( 'base64', ); const headers = new Headers(); headers.append('Authorization', `Basic ${auth}`); headers.append('Content-Type', 'application/x-www-form-urlencoded'); const response = await fetch(`${this.baseURL}/api/v1/access_token`, { method: 'POST', headers, body: 'grant_type=client_credentials', }); if (!response.ok) { throw new Error(`Error fetching access token: ${response.statusText}`); } const data = (await response.json()) as { access_token: string; }; this.token = data.access_token; return this.token; }
호출 메소드는 일반 API 호출 함수입니다. 먼저 액세스 토큰을 얻은 다음 요청 URL을 작성하고 마지막으로 요청하고 응답을 처리합니다. API 요청이 실패하면 오류가 발생하므로 이 래퍼를 사용할 때 오류를 균일하게 처리할 수 있습니다.
private async invoke( endpoint: string, options?: RedditSearchOptions, ): Promise { const token = await this.getAccessToken(); const headers = new Headers(); headers.append('Authorization', `Bearer ${token}`); headers.append('User-Agent', this.userAgent); const response = await fetch(this.buildUrl(endpoint, options), { method: 'GET', headers, }); if (!response.ok) { throw new Error(`Error fetching data: ${response.statusText}`); } return (await response.json()) as T; }
마지막으로 findMany 메소드를 사용하여 검색 요청을 수행합니다. 이 방법을 사용하면 사용자는 쿼리 문자열 및 기타 선택적 매개변수를 기반으로 검색하여 검색 결과를 반환할 수 있습니다.
public async findMany( q: string, options: RedditSearchOptions = {}, ): Promise{ return this.invoke('/search', { ...options, q }); }
이 게시물을 통해 Reddit API를 래핑하여 API 호출을 보다 간단하고 유지 관리하기 쉽게 만드는 방법을 배웠습니다. 이 래핑 방법은 Reddit뿐만 아니라 외부 API와 자주 상호 작용하는 대부분의 애플리케이션에도 적용 가능합니다. 래핑된 코드는 재사용성을 향상시키고 향후 확장 및 유지 관리에 상당한 편의성을 제공합니다.
실제 프로젝트에서 추가 최적화에는 더 자세한 오류 처리 추가, 추가 API 기능 지원 또는 성능 최적화를 위한 캐싱 레이어 생성이 포함될 수 있습니다. 그러나 래핑의 기본을 익히는 것은 모든 개발자에게 필수적인 기술입니다. 이 포스팅을 통해 이러한 기법들을 업무에 적용하여 더욱 우아한 코드를 작성하실 수 있기를 바랍니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3