실시간 채팅 및 개인 맞춤 퀘스트 제공 등 소셜 기능을 제공하는 서비스입니다.
API와 WebSocket을 통해 클라이언트와 통신하며, 그룹, 클럽, 채팅, 개인화된 퀘스트 제공으로 소셜 활동을 지원합니다.
본 프로젝트는 MSA(Microservice Architecture)를 지향하며, 기능별로 모듈이 분리되어 있습니다.
chat-api와 chat-websocket은 현재는 모듈로 분리되어 있지만 조만간 각각의 Repository로 분리해서 관리할 목적으로 개발되었습니다.
추후 2개의 Repository로 분리할 예정입니다.
chat-api
: API 서버로, 사용자인증, 그룹 관리, 퀘스트 관리 등 핵심 비즈니스 로직을 처리합니다.chat-websocket
: WebSocket 서버로, 실시간 채팅 및 이벤트 push 기능을 담당합니다.chat-core
: 공통으로 사용되는 데이터 모델(Entity) 및 유틸리티 클래스를 포함하는 모듈입니다.
- Java 17, Spring Boot 3.x, JPA, JWT
- Database
- API: MySQL
- Websocket: AWS DynamoDB
- Database Migration: Liquibase
- Authentication: AWS Cognito
- Build Tool: Gradle
- Containerization: Docker, AWS ECR
- CI/CD: Jenkins, Github Action, ArgoCD
- Java 17 (Amazon Corretto 17 권장)
- Spring Boot 3.x
- MySQL & AWS DynamoDB
- AWS 계정 (Cognito, DynamoDB 사용을 위해)
프로젝트를 실행하기 위한 설정 방법입니다.
chat-api
와 chat-websocket
모듈의 src/main/resources/application.yaml
파일을 열어 아래 항목들을 자신의 환경에 맞게 수정해야 합니다.
# chat-api/src/main/resources/application.yaml 예시
spring:
datasource:
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: none # Liquibase를 사용하므로 none으로 설정
defer-datasource-initialization: true
# AWS Cognito 설정
security:
oauth2:
resourceserver:
jwt:
issuer-uri: ${ISSUER_URI}
jwk-set-uri: ${JWK_SET_URI}
client-id: ${CLIENT_ID} # User Pool에 등록된 앱 클라이언트 ID
- AWS Cognito 서비스에서 사용자 풀(User Pool)을 생성해야 합니다.
- 생성된 User Pool의 ID와 앱 클라이언트 ID를
application.yaml
파일에 기입합니다.
프로젝트 루트 디렉토리에서 아래 명령어를 실행하여 전체 프로젝트를 빌드합니다.
./gradlew clean build
프로젝트 루트 디렉토리에 있는 Dockerfile.api
와 Dockerfile.websocket
파일을 사용하여 API 서버와 WebSocket 서버를 Docker build 합니다.
docker build -f Dockerfile.api -t nameless-api .
docker build -f Dockerfile.websocket -t nameless-ws .
본 프로젝트는 Jenkins를 통해 master branch에 commit하면 AWS ECR에 docker image를 push 한 뒤, AWS EKS 환경에서 실행하도록 구성했습니다.
- 데이터베이스 스키마 관리는 Liquibase를 사용합니다.
chat-api/src/main/resources/db/changelog
디렉토리의db.changelog-master.yaml
파일에 변경사항(Changeset)을 추가하여 스키마를 변경 및 관리합니다.- 애플리케이션 실행 시 Liquibase가 자동으로 변경사항을 감지하여 데이터베이스에 반영합니다.
- GitHub Actions:
.github/workflows/ci-build-test.yml
에 정의되어 있으며, Pull Request 시 자동으로 빌드 및 테스트를 수행합니다. - Jenkins:
jenkinsfile
을 통해 ECR 빌드 및 배포 파이프라인을 구성했습니다.
전체 화면을 캡쳐하다보니 우측 하단의 챗봇 아이콘이 여러 번 보이는 것입니다.
실제 서비스에서는 페이지를 스크롤해도 우측 하단에 잘 위치해 있습니다.
매일 사용자 맞춤 퀘스트가 3개 할당됩니다.
퀘스트를 완료할 때 퀘스트에 대한 피드백을 전송하면, AI는 다음 퀘스트 생성할 때 피드백 결과에 따라 개인화된 퀘스트를 생성합니다.