AI 여행지 추천, AI 여행 플래너 웹
개발기간: 2024.07
1인 개발
배포: Vercel
사용 기술
- Next.Js (ver.14)
- Typescript
- TailWind CSS
- react-query(v.5)
GoTrip은 OpenAI의 GPT-4 API를 활용하여 사용자가 선호하는 여행지를 추천하고 맞춤형 여행 계획을 제공하는 웹 애플리케이션입니다.
메인 페이지에서는 3D 지구본 모델을 통해 직관적이고 즐거운 사용자 경험을 제공합니다
또한, 날씨, 대기질 지수, 환율, 항공편 일정 API를 통해 여행지의 상세한 정보를 실시간으로 제공합니다.
- 사용자 인터렉션에 따라 줌인,줌아웃,회전. 국가 포인트 클릭 시 줌인되며 간단한 국가 여행정보 라벨이 나옵니다.
코드 바로가기
![](https://private-user-images.githubusercontent.com/129649787/351630247-226bcfed-1dd0-4347-a3a8-273ee8de911b.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk4NDAyNjAsIm5iZiI6MTczOTgzOTk2MCwicGF0aCI6Ii8xMjk2NDk3ODcvMzUxNjMwMjQ3LTIyNmJjZmVkLTFkZDAtNDM0Ny1hM2E4LTI3M2VlOGRlOTExYi5naWY_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxOFQwMDUyNDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kMjcwNmJkODZjMWI1MzM5YTBhNTkzZDlmYzJkYzYyY2Y4MzRhZmQ0MmE4NGI2NjE1MTFiYTJjOWFmOWJiMjQ5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.TemdeWUOev5RR5GWIPWg-yfxwdBstW_zOFUqwX3TWdI)
- 사용자의 선호도 및 정보를 입력하여 OpenAI의 GPT-4 API를 이용해 여행지를 추천합니다. 텍스트 입력 뿐만 아니라 SpeechRecognition을 이용하여 음성으로도 입력이 가능합니다.
코드 바로가기
![](https://private-user-images.githubusercontent.com/129649787/351631166-c740dbde-361f-4883-9d6a-ebd7a6d5fed8.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk4NDAyNjAsIm5iZiI6MTczOTgzOTk2MCwicGF0aCI6Ii8xMjk2NDk3ODcvMzUxNjMxMTY2LWM3NDBkYmRlLTM2MWYtNDg4My05ZDZhLWViZDdhNmQ1ZmVkOC5naWY_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxOFQwMDUyNDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01ZTIxNDZlZTAxODVmYTFmY2ZkZjAyYmE2ZDI2N2E4M2EzY2E2M2FjMDcxOTk5NDEyODA0OTdmNGE4ZDI0M2ZkJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.KUOA0QzT4U7rpKWrR57H59He1BTsH9Qku8y7N5b0uFI)
- 날씨, 대기질 지수, 환율, 항공편 일정 API를 통해 여행지의 상세한 정보를 실시간으로 제공합니다.
- 데이터를 캐싱하고, 효율적으로 재사용하기 위해 react-query를 사용하였습니다.
코드 바로가기
![](https://private-user-images.githubusercontent.com/129649787/351633570-bed26682-4c35-40a6-b113-9a3b03fbd4bc.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk4NDAyNjAsIm5iZiI6MTczOTgzOTk2MCwicGF0aCI6Ii8xMjk2NDk3ODcvMzUxNjMzNTcwLWJlZDI2NjgyLTRjMzUtNDBhNi1iMTEzLTlhM2IwM2ZiZDRiYy5qcGc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxOFQwMDUyNDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yNjU1ZjJkN2YxNjQ2MGQwNTI4MDM4NmJjOWNlMzJmZWM3NGM5YjRjMThhMmUxYmJlMjg5M2MwYWU4ZjA3M2QzJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Z0HVyJ6qN6NROBkU16LbxRiIlUYGpEu5wd4AgwDn5VA)
- 사용자에게 나이, 성별, 예산, 일정, 나라를 입력받아 GPT-4 API를 이용하여 여행 계획을 생성하여 제공합니다.
코드 바로가기
![](https://private-user-images.githubusercontent.com/129649787/351634629-718a50f4-1ba3-466a-877e-7b3d97e6de39.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk4NDAyNjAsIm5iZiI6MTczOTgzOTk2MCwicGF0aCI6Ii8xMjk2NDk3ODcvMzUxNjM0NjI5LTcxOGE1MGY0LTFiYTMtNDY2YS04NzdlLTdiM2Q5N2U2ZGUzOS5qcGc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxOFQwMDUyNDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kYTM0MzYxY2EwNjc5OTY5NjJiNDUyZTJjYjU5Y2U2OWMwOGZlMTYyMmVjYjlmNzkyYzg3MTdhZWYxNjBhNThlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.tTlEIpdGd2aVhltfXfv05gN20oUH-vP46F9ooIieil8)
![](https://private-user-images.githubusercontent.com/129649787/351634834-64840b41-738c-47c1-98c9-991b89388bfa.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk4NDAyNjAsIm5iZiI6MTczOTgzOTk2MCwicGF0aCI6Ii8xMjk2NDk3ODcvMzUxNjM0ODM0LTY0ODQwYjQxLTczOGMtNDdjMS05OGM5LTk5MWI4OTM4OGJmYS5qcGc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxOFQwMDUyNDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00MDdiZDUzYWU4NjJkYTc1ZjQ4NDM1YzMzNTdhM2JmZmRkMGRlOWRiZTQxYjc3YzY5NmNkYzNiZjY2YTFhMDhhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.ZmsFO1kOCXcUdKts2KBtayrpuE8SJFBSgJcmm2drUYI)
3D 모델을 사용하는 메인 페이지에서 초기 렌더링 속도가 느려, 사용자가 오랜 시간 동안 흰 화면을 보게 되어 사용자 경험에 부정적인 영향을 미쳤습니다.
다이나믹 임포트(dynamic import)를 사용하여 3D 모델을 비동기적으로 로드하였습니다. 이로 인해 초기 로딩 시 필요한 리소스만 우선 로드되었으며, 로딩 UI를 제공하여 사용자에게 즉각적인 시각적 피드백을 제공할 수 있었습니다.
- FCP(First Contentful Paint) 를 약 57% 단축(201.59ms -> 85.26ms).
다이나믹 임포트를 활용하여 초기 로딩 시간을 효과적으로 단축하고, 대규모 리소스를 효율적으로 관리하는 방법을 배웠습니다. 이를 통해 사용자 경험을 크게 개선할 수 있었습니다.
OpenAI API는 보안상의 이유로 클라이언트 측에서 직접 호출할 수 없습니다. 이를 해결하기 위해 서버 측에서 API를 호출할 수 있도록 구현했습니다.
서버 측에서 OpenAI API를 호출하기 위해 Next.js에서 제공하는 API 라우트를 사용했습니다. 이 라우트는 클라이언트 요청을 받아 OpenAI API에 전달하고, 결과를 다시 클라이언트에게 전달하는 역할을 합니다.
코드 바로가기
이전에는 API를 클라이언트 측에서 호출하기 때문에 OpenAI API 정책 상 에러가 반환되었습니다. 서버 측 라우트를 도입한 후, API 키가 안전하게 보호되며 API 호출이 원활히 이루어졌습니다.
For building and running the application you need:
- [Node.js]
- [npm]
$ git clone https://github.com/mmm7k/GoTrip.git
$ npm install
$ npm run dev
- [Visual Studio Code]
- [Git]
- [Github]
- [npm]