펫로스 극복을 위한 챗봇 서비스
저희 서비스 “무지개편지”의 목표는 펫로스 증후군을 앓는 사람들을 위해 챗봇이 주는 위로를 통해 극복의 토대를 제공하는 것입니다. 사용자들은 다른 사람에게 솔직히 말하기 어렵거나 시간이 많이 지나도 털어내지 못한 감정을 반려동물과의 가상 대화를 통해 부담 없이 털어놓을 수 있고, 이는 펫로스 증후군 극복에 긍정적인 작용을 할 수 있습니다. 시간이 흘러도 여전히 그리운, 당신의 가족이자 기억하고 싶은 이들에게 전하고 싶은 말을 모아 직접 보내보세요. “무지개 편지”는 그 말들이 닿길 기원하며 가상의 답변을 보내드립니다.
- java 17 : 사용한 프로그래밍 언어
- springboot (3.1.1) : 프레임워크
- JWT : 회원가입 및 로그인시 사용하는 토큰
- Open AI (GPT-4, DALL-E) : 텍스트 생성을 위한 GPT 4, 이미지 생성을 위한 DALL-E 3 API 활용
- EC2 : 서버
- RDS : 데이터베이스
- S3: 이미지 저장
- Open AI DALL-E
implementation 'com.theokanning.openai-gpt3-java:client:0.17.0'
implementation 'com.theokanning.openai-gpt3-java:service:0.17.0'참고
https://velog.io/@minji1289/Springboot-스프링부트로-DALL-E-API-호출하기
2. 로그인 JWT
implementation 'io.jsonwebtoken:jjwt-api:0.11.5’- AWS EC2 생성
| EC2 name | hack_server |
| AMI | Amazon Linux 2023 AMI |
| Instance Type | t2 micro (free tier eligible) |
| Key Pair | Create new key pair |
| VPC | Default |
| Subnet | Default |
| Auto-assign public IP | Enable |
| Security group | SSH, HTTP, HTTPS, 8080 |
2. RDS 설정
| Create method | Standard create |
| Engine option | MySQL Community |
| Templates | free tier |
| DB instance identifier | hack-db |
| Computer Resource | Don’t connect to an EC2 compute resource |
| Public access | Yes |
3. S3 설정
| Bucket name | hack-s3bucket |
| ACLs | enable |
| Block Public Access | disable |
4. 도메인 설정
aws route53에서 도메인 구매 후 api.rainbow-letter.com과 rainbow-letter.com 등록
5. EC2 서버에 ssh 접속
ssh -i {pem_key경로} ec2-user@{public_ip}
6. java 17 설치 및 타임존 변경
## ec2에 java 17 설치 sudo yum install java-17-amazon-correttojava -version //openjdk "17.0.7"
sudo rm /etc/localtime sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime date #타임존 확인
7. git 설치
sudo yum install git //git 설치
git --version //설치된 git 버전 확인8. MySQL 설치
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el9-3.noarch.rpm
# [제일 최신 버전으로 설치]
sudo yum install mysql-community-server
sudo systemctl start mysqld
sudo systemctl status mysqld- EC2 서버에 application.properties, build.gradle, gradlew, gradle 폴더 추가
a. open AI AP key
b. RDS 엔드포인트 및 패스워드
c. papago API key
- 배포 script 작성 후 ./deploy.sh or sh deploy.sh 로 실행
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=HACK_Server
cd $REPOSITORY/$PROJECT_NAME/
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
./gradlew build
echo "> 디렉토리로 이동"
cd $REPOSITORY
echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -fl wow_server.*.jar | grep java | awk '{print $1}')
echo "> 현재 구동중인 애플리케이션pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | head -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $JAR_NAME &
11. github action을 이용한 자동 배포
a. Github Repository의 Settings > Secrets and variables > Actions에 “Repository secrets" 3가지 추가
- HOST = EC2 인스턴스의 public IP
- USER = 사용자 (보통은 ec2-user)
- SSH_PRIVATE_KEY = `.pem` 키 파일 내용
b. github/workflows 폴더 생성 후 main.yml 파일 아래와 같이 추가
name: WORKFLOW_NAME # workflow 이름 설정
# workflow를 run하는 조건 설정
on:
push:
branches: [ main ] #설정한 workflow run 조건: branch [main]에 push를 할때마다
# workflow가 run할때 실행하는 내용 정의
jobs:
SSH:
runs-on: ubuntu-latest # OS(workflow label)
steps:
- uses: actions/checkout@v3 #Repository 참고
- name: ssh to ec2 #EC2에 접속
uses: appleboy/ssh-action@master #접속 제공 Repository
with:
key: ${{ secrets.SSH_PRIVATE_KEY }} #Repository secrets 사용
host: ${{ secrets.HOST }} #Repository secrets 사용
username: ${{ secrets.USER }} #Repository secrets 사용
script: | #실행할 코드
cd /home/ec2-user/app/step1 #배포 스크립트 파일이 있는 폴더로 이동
sh deploy.sh #배포 스크립트 파일 실행
#기존 deploy.sh 파일에서 nohup 명령어를 포함한 line을 지우고, 아래와 같이 `.yml` 스크립트 파일에 추가
nohup java -jar wow_server-0.0.1-SNAPSHOT.jar > nohup.out 2> nohup.err < /dev/null &
c. 기존 deploy.sh 파일에서 nohup 부분 주석 처리
## nohup java -jar $JAR_NAME &- git clone https://github.com/ewha-cse-HACK/HACK_Server.git
- application.properties 파일 설정
a. openAI api key
b. rds 혹은 local db 엔드포인트 및 패스워드
c. papago api key - 어플리케이션 실행
- postman에서
http://localhost:8080/{테스트할_URL}을 통해 API 조회 - postman 혹은 chrome에서
https://api.rainbow-letter.com/{테스트할_URL}을 통해 API 조회
- postman에서 http://localhost:8080/{테스트하고_싶은_api} 를 통해 API 조회
- postman 혹은 chrome에서 https://api.rainbow-letter.com/{테스트할_URL}을 통해 API 조회
├── settings.gradle
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── hack
│ │ └── hack_server
│ │ ├── Authentication
│ │ │ ├── Controller
│ │ │ │ └── UserController.java
│ │ │ ├── Dto
│ │ │ │ ├── JoinRequestDto.java
│ │ │ │ └── LoginRequestDto.java
│ │ │ ├── JwtAuthenticationFilter.java
│ │ │ ├── JwtAuthorizationFilter.java
│ │ │ ├── JwtProvider.java
│ │ │ ├── PrincipalDetails.java
│ │ │ └── Service
│ │ │ ├── PrincipalDetailsService.java
│ │ │ └── UserService.java
│ │ ├── ChatGpt
│ │ │ ├── ChatGptConfig.java
│ │ │ ├── Controller
│ │ │ │ └── ChatGptController.java
│ │ │ ├── Dto
│ │ │ │ ├── ChatGptAnswerResponseDto.java
│ │ │ │ ├── ChatGptRequestDto.java
│ │ │ │ ├── ChatGptResponseDto.java
│ │ │ │ ├── Choice.java
│ │ │ │ ├── DalleAnswerResponseDto.java
│ │ │ │ ├── MessageRequestDto.java
│ │ │ │ ├── MessageResponseDto.java
│ │ │ │ └── QuestionRequestDto.java
│ │ │ └── Service
│ │ │ └── ChatGptService.java
│ │ ├── Community
│ │ │ ├── Comment
│ │ │ │ ├── Controller
│ │ │ │ │ └── CommentController.java
│ │ │ │ ├── Dto
│ │ │ │ │ ├── CommentSaveRequestDto.java
│ │ │ │ │ └── CommentUpdateRequestDto.java
│ │ │ │ └── Service
│ │ │ │ └── CommentService.java
│ │ │ └── Post
│ │ │ ├── Controller
│ │ │ │ └── PostController.java
│ │ │ ├── Dto
│ │ │ │ ├── CommentDto.java
│ │ │ │ ├── PostAddRequestDto.java
│ │ │ │ ├── PostDetailResponseDto.java
│ │ │ │ ├── PostImageDto.java
│ │ │ │ ├── PostListResponseDto.java
│ │ │ │ ├── PostModifyRequestDto.java
│ │ │ │ └── PostResponseDto.java
│ │ │ └── Service
│ │ │ └── PostService.java
│ │ ├── Dalle
│ │ │ ├── Controller
│ │ │ │ └── ImageGeneratorController.java
│ │ │ ├── Dto
│ │ │ │ ├── JournalCommentDto.java
│ │ │ │ ├── JournalCommentResponseDto.java
│ │ │ │ ├── JournalListDto.java
│ │ │ │ ├── JournalListPageResponseDto.java
│ │ │ │ ├── JournalListResponseDto.java
│ │ │ │ └── JournalResponseDto.java
│ │ │ ├── Service
│ │ │ │ ├── AIService.java
│ │ │ │ └── JournalService.java
│ │ │ └── ServicesConfig.java
│ │ ├── Entity
│ │ │ ├── BaseTimeEntity.java
│ │ │ ├── Comment.java
│ │ │ ├── Heart.java
│ │ │ ├── Journal.java
│ │ │ ├── JournalComment.java
│ │ │ ├── Pet.java
│ │ │ ├── Post.java
│ │ │ ├── PostImage.java
│ │ │ └── User.java
│ │ ├── Global
│ │ │ ├── Config
│ │ │ │ ├── JpaConfig.java
│ │ │ │ └── SecurityConfig.java
│ │ │ └── S3
│ │ │ ├── S3Config.java
│ │ │ ├── S3ImageController.java
│ │ │ └── S3Uploader.java
│ │ ├── HackServerApplication.java
│ │ ├── MyPage
│ │ │ ├── Controller
│ │ │ │ └── MyPageController.java
│ │ │ ├── Dto
│ │ │ │ ├── MyPageRequestDto.java
│ │ │ │ ├── NickNameModifyRequestDto.java
│ │ │ │ └── ProfileImageModifyRequestDto.java
│ │ │ └── Service
│ │ │ └── MyPageService.java
│ │ ├── Papago
│ │ │ ├── NaverTransService.java
│ │ │ └── PapagoController.java
│ │ ├── Persona
│ │ │ ├── Controller
│ │ │ │ └── PersonaController.java
│ │ │ ├── Dto
│ │ │ │ ├── PersonaDto.java
│ │ │ │ ├── PersonaListRequestDto.java
│ │ │ │ ├── PetRequestDto.java
│ │ │ │ └── SpeciesRequestDto.java
│ │ │ └── Service
│ │ │ └── PersonaService.java
│ │ └── Repository
│ │ ├── CommentRepository.java
│ │ ├── HeartRepository.java
│ │ ├── JournalCommentRepository.java
│ │ ├── JournalRepository.java
│ │ ├── PetRepository.java
│ │ ├── PostImageRepository.java
│ │ ├── PostRepository.java
│ │ └── UserRepository.java
│ └── resources
│ ├── application.properties
│ ├── static
│ └── templates
- Authentication: 로그인/회원가입
- ChatGpt: 채팅
- Community: 커뮤니티
- Dalle: 일기 훔쳐보기
- MyPage: 마이페이지
- Papago: Papago API 호출
- Persona: 페르소나 생성
| 김민지 | 최유나 | 하윤지 |
|---|---|---|
![]() |
![]() |
![]() |
| Server AI |
Client Design |
Server AI |




