## 예시 프로젝트 소개
예시 프로젝트는 당연히 필요하다. 프로젝트 과정을 처음부터 끝까지 기록으로 남기는 게 목표인데, 프로젝트 없이 기록을 진행할 순 없다. 다만, 어떤 프로젝트를 할지는 고민해봐야 한다. 프로젝트의 규모나 성질에 따라 본래 취지인 기록에 집중하기 힘들어질 수 있기 때문이다. 그래서 나는 고민 끝에 딱 토이 프로젝트 수준으로 예시 프로젝트를 진행하기로 하였다.
### 예시 프로젝트 주제 : `ChatGPT 프록시 서버`
**내가 선택한 예시 프로젝트의 주제는 ChatGPT 프록시 서버다**. 프로젝트 주제 선정 사유는 다음과 같다.
>0. **앞으로 개발할 ChatGPT 응용 서비스를 위해**
> ChatGPT를 응용한 서비스는 이미 시중에 많이 존재하고, 나도 ChatGPT 응용에 관심이 많다. 미리 ChatGPT 프록시 서버를 만들어두면 앞으로 ChatGPT 관련 서비스를 만들 때 큰 도움이 될 것이다.
>1. **서버이자 클라이언트인 구조**
> 프록시 서버는 요청을 처리하는 서버이자 요청을 보내는 클라이언트다. 이런 구조 덕분에 [[Server Programming/Spring Boot 🌿/readme 👋🏻#기록할 내용|그간 공부했던 것들]]을 적용하기 편하다.
>2. **프롬프트 템플릿 처리**
> ChatGPT를 잘 활용하려면 일을 시키는 프롬프트를 잘 작성해야 한다. 이를 Fancy한 용어로 프롬프트 엔지니어링[^1] 이라고 한다. 이런 프롬프트 엔지니어링은 템플릿 형태로 이뤄지는데([[프롬프트 기법 정리|템플릿 예시]]), 자바의 `String::format`로는 복잡한 템플릿을 다루기 힘들다. 또한, ChatGPT 응용 서비스마다 이런 템플릿을 다루는 로직을 추가하는 것도 비효율적이다. 따라서 이런 템플릿을 CRUD하고 클라이언트의 요청에 따라 템플릿으로 프롬프트를 생성하는 독립적인 서버를 만드려 한다.
## `ChatGPT 프록시 서버` 개요
### 주요 서비스
>0. **Chat GPT API 중계**
> `ChatGPT 프록시 서버`는 Chat GPT API 키를 사용자에게 숨기고, API를 최소한으로 사용하도록 Chat GPT API 중계 서비스를 제공한다.
>1. **REST API를 통한 프롬프트 템플릿 관리**
> `ChatGPT 프록시 서버`는 자신을 이용하는 클라이언트가 프롬프트 템플릿을 쉽게 CRUD 할 수 있도록 REST API를 제공한다.
>2. **프롬프트 템플릿을 통한 프롬프트 생성**
> `ChatGPT 프록시 서버`는 프롬프트 템플릿을 채울 콘텐츠를 `Map` 형식으로 받아 프롬프트를 생성하는 서비스를 제공한다.
### test 패키지 구조
```
src/test/java/io.gitlab.red.chatgptproxyserver
├── config
| ├── PromptTemplateTestConfig(ⓒ)
│ ... (생략)
├── assertor
│ ├── SingleArgAssertor(ⓘ)
│ └── DoubleArgAssertor(ⓘ)
├── PromptTemplateRepositoryTest(ⓒ)
... (생략)
```
[^1]:개인적으로 **엔지니어링**이라는 단어는 과분하다고 생각한다.