사용한 라이브러리
openai
Node.js library for the OpenAI API. Latest version: 3.2.1, last published: 5 days ago. Start using openai in your project by running `npm i openai`. There are 209 other projects in the npm registry using openai.
www.npmjs.com
OpenAI 공식문서에 나오는 사용법 (공식문서 일부분 긁어 왔습니다.)
import { Configuration, OpenAIApi } from "openai";
const configuration = new Configuration({
organization: "org-F4bQQACSfPvYO4DWxNN9ynas",
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const response = await openai.listEngines();
Organization IDs can be found on your Organization settings page.
OpenAI API
An API for accessing new AI models developed by OpenAI
platform.openai.com
apikey는 아래 이미지의 View API keys를 들어가면 발급받을 수 있습니다.

위 사용법을 보고 부족 할 수 있으니 실제 사용했던 코드 내용을 공유해 드리겠습니다. 아래처럼 인터페이스를 구현하면 됩니다.
const { Configuration, OpenAIApi } = require('openai');
const configuration = new Configuration({
organization: process.env.ORG_ID,
apiKey: process.env.API_KEY,
});
const openai = new OpenAIApi(configuration);
const openAI = async ({ messages }) => {
const completion = await openai.createChatCompletion({
model: 'gpt-3.5-turbo',
messages,
});
return completion.data.choices[0].message;
};
모델은 gpt-3.5-turbo를 사용하였습니다.
해당 모델의 응답은 'completion.data.choices[0].message' 여기서 찾을 수 있습니다.
해당 모델의 더 자세한 가이드를 확인해 보세요.
모델 gpt-3.5-turbo의 큰 장점은 대화형이라고 생각하는데 그렇게 때문에 message를 전달할 때도 아래처럼 대화기록으로 요청할 수 있습니다.
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
공식문서에서 API KEY는 되도록이면 클라이언트에 노출하지 말라고 해서 간단하게 express로 작은 서버를 하나 구현 했습니다.
- 해당 문구
Important note: When using Javascript, all API calls should be made on the server-side only, since making calls in client-side browser code will expose your API key. See here for more details.
직접 구현한 코드
const http = require('http');
const express = require('express');
const cors = require('cors');
const morgan = require('morgan');
const dotenv = require('dotenv');
dotenv.config();
const app = express();
app.use(
cors({
origin: 'https://open-ai-git-main-kimjuno97.vercel.app',
})
);
app.use(morgan('combined'));
app.use(express.json());
app.get('/ping', (req, res, next) => {
res.json({ message: 'pong' });
});
const { Configuration, OpenAIApi } = require('openai');
const configuration = new Configuration({
organization: process.env.ORG_ID,
apiKey: process.env.API_KEY,
});
const openai = new OpenAIApi(configuration);
const openAI = async ({ messages }) => {
const completion = await openai.createChatCompletion({
model: 'gpt-3.5-turbo',
messages,
});
return completion.data.choices[0].message;
};
/** 안될떄마다 업데이트 참고 할 곳
* 1. https://platform.openai.com/docs/guides/chat/introduction
*/
app.post('/', async (req, res) => {
try {
const { messages } = req.body;
const answer = await openAI({ messages });
return res.status(200).json({ answer });
} catch (err) {
return res.status(400).json({ messages: 'BAD_REQUEST' });
}
});
const server = http.createServer(app);
const PORT = process.env.PORT;
const start = async () => {
try {
server.listen(PORT, () => console.log(`Server is listening on ${PORT}`));
} catch (err) {
console.error(err);
}
};
start();
이후 클라이언트 코드에 해당 api와 통신 할 수 있게끔 코드를 작성하면 됩니다.
클라이언트는 next.js를 사용하였고, vercel에서 자동 배포까지 무료(카드 등록안했으니까 무료?)로 지원해 줘서 그대로 사용했습니다.
(근데 nextjs 기능 거의 다 모름, 서버사이드 렌더링 때문에 정적 호스팅으로 배포하면 안 될 텐데, 어떻게 해주는지도 잘 모름.)
우선 사용할 수 있게 빠르게 배포 하고 싶어서 다음에 공부해야지~ 하고 넘어갔습니다.
서버 배포 과정
하지만 서버 배포는 나름 최선을 다했습니다. (이건 내 지갑이랑 연결되어있으니)
일단 AWS EC2를 사용했습니다.
인스턴스 시작까지 워낙 레퍼런스가 많으니 넘어가고 ( 방화벽 보안그룹의 https, http 허용만 잘 체크해주세요~)
아참 그리고 os는 ubuntu를 사용하였습니다.
(그냥 해당 이미지 공유 해드림.)


HTTPS, HTTP 저거 허용해주세요
터미널로 접근한 다음 아래의 과정을 거쳤습니다..!
( 해당 과정은 레퍼런스가 너무 많아서 생략하겠습니다.!)
1. 패키지 업데이트하기
sudo apt-get update
2. node 설치
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh | bash
설치 방법은 다양하게 있습니다. 저는 nvm으로 함.
해당 명령어를 치고 마무리되면 아래와 같은 문구가 보입니다.
=> Appending nvm source string to /home/ubuntu/.bashrc
=> Appending bash_completion source string to /home/ubuntu/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
ubuntu@ip-172-31-0-231:~$ nbm --version
아래처럼 export부터 복사해서 터미널에 입력하면 됩니다.
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
ubuntu@ip-172-31-0-231:~$ nbm --version
해당 과정을 마치고 nvm 설치되었는지 확인 후 node 설치
nvm --verion //설치 되었는지 확인해보고
nvm install v19.4.0 // node 설치
어쩌다 보니 개발 당시에 로컬에 19.4.0을 사용하고 있어서 여기서도 맞춰서 설치했습니다. ( 별차이 없지만, 혹여나 해서,)
다음으로 node 설치 확인하면서 겸사겸사 npm 버전도 확인
ubuntu@ip-172-31-0-231:~$ node --version
v19.4.0
ubuntu@ip-172-31-0-231:~$ npm --version
9.2.0
3. node를 관리할 pm2 설치
npm install pm2 -g // 설치
npm list -g // 설치 확인해보기
pm2를 사용하면 node.js로 굴러가는 애플리케이션이 충돌 날 때 자동으로 재시작해준다 합니다.
크게 아래와 같은 장점이 있다고 합니다. (chapGPT가)
- 자동 애플리케이션 다시 시작: PM2는 Node.js 애플리케이션이 충돌하는 경우 자동으로 다시 시작하여 사용자가 애플리케이션을 항상 사용할 수 있도록 합니다.
- 로드 밸런싱: PM2는 애플리케이션의 여러 인스턴스를 실행하고 들어오는 요청을 분산하여 고가용성과 성능을 보장할 수 있습니다.
- 모니터링 및 로깅: PM2는 실시간 모니터링 및 로깅 기능을 제공하여 개발자가 애플리케이션 메트릭을 추적하고 문제를 디버그 하고 오류를 해결할 수 있도록 합니다.
- 제로 다운타임 배포: PM2는 다음을 수행할 수 있습니다. 애플리케이션의 새 인스턴스를 시작하고 점진적으로 이전 인스턴스를 대체하는 롤링 배포를 통해 배포 프로세스 중에 다운타임이 발생하지 않도록 합니다.
4. github에서 코드 가져오고 pm2 start app.js
github에서 코드를 가져온 다음에 pm2 start 명령어로 해당 코드를 실행시켜 줍니다.
아! 그리고 env는 git에 안 올라가는데 저는 nano 명령어로 env 파일을 만들어서 넣어 줬습니다. (빠르게 하려고..)
그 후 'pm list'로 실행되고 있는지 확인.
5. nginx 설치
sudo apt-get install nginx
설치 후 nginx 환경파일 설정을 해줍니다.
환경파일 있는 경로는 '/etc/nginx/site-available/default' 여기입니다.
cd /etc/nginx/site-available
일단 환경파일 있는 곳까지 이동하고,
sudo rm default // 삭제
sudo nano default // 생성
아래와 같이 default 파일을 만들어 줄 것입니다.
해당 내용을 채우기 위해 https 통신을 위한 도메인 구매 및 ssl 인증서 발급부터 진행하겠습니다.
server{
listen 80;
server_name 도메인명 www.도메인명
charset utf-8;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
server_name 도메인명 www.도메인명
charset utf-8;
ssl_certificate /etc/letsencrypt/live/도메인명/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/도메인명/privkey.pem;
location / {
proxy_pass http://127.0.0.1:4000;
}
}
5. https 통신을 위한 서버 도메인 구매와 ssl 인증서 발급
웹을 넘어 클라우드로. 가비아
그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브
www.gabia.com
도메인을 구입하고 아래의 매뉴얼을 참고하여 ec2 인스턴스의 퍼블릭 IPv4주소를 연결해줍니다.
가비아: 국내 1위
customer.gabia.com
호스트에 '@' 값에 퍼블릭 IPv4주소를 넣어주면 됩니다. ( 난독증 있었는지 30분이나 걸렸다는..)

여기까지 마무리했으면 위의 nginx환경파일에서 도메인명을 맞춰주고 사용하면 됩니다.
nginx 설정 문법 검사 및 재기동
sudo nginx -t
sudo systemctl restart nginx
도메인을 구매한 이유는 SSL인증서 발급을 위해서입니다.
SSL 발급은 해당 블로그를 참고해서 진행해 주세요
해당 과정을 마무리하고, 배포된 클라이언트에서 서버 도메인으로 통신하면 된다.
DirectAccess 클라이언트가 오류 참고자료
DirectAccess 클라이언트가 IP-HTTPS와 연결할 수 없음 - Windows Client
해지 확인이 실패하기 때문에 DirectAccess 클라이언트는 IP-HTTPS(Secure Hypertext Transfer Protocol) 연결을 통해 인터넷 프로토콜을 사용하여 DirectAccess 서버에 연결하지 못할 수 있습니다.
learn.microsoft.com
댓글