Skip to content

asa9874/DevQuest-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

135 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎮 DevQuest

게임처럼 즐기며 학습할 수 있는 개발자 플랫폼

개발자가 퀘스트, 스킬, 몬스터, 길드 시스템을 통해 게임을 하듯 재미를 느끼며 역량을 키울 수 있도록 기획된 프로젝트입니다.

🔗 Links

🎯 프로젝트 목표

  • 단순한 게시글 기능을 넘어, 여러 엔티티 간의 복잡한 관계가 얽힌 시스템을 설계하고 구현하는 경험 축적
  • JPA와 JPQL을 활용해 엔티티 간의 관계를 효율적으로 처리하는 구조 설계
  • 비즈니스 중심의 설계를 위한 도메인 중심 디렉토리 구조 채택

🛠 Tech Stack

  • Backend: Spring Boot, Spring Data JPA
  • AI Server: Flask, LangChain
  • Database: MySQL, Redis
  • Auth & Network: JWT, OAuth2, STOMP (WebSocket + SockJS)
  • Infrastructure: AWS EC2 (Ubuntu), Docker, NGINX
  • Frontend: React, Vite, TypeScript, Tailwind CSS

Flask Docker

Spring MySQL Redis

React Vite TypeScript

image

💡 주요 기능

1. 회원 및 인증 (Auth/Member)

  • Spring Security와 JWT를 활용한 Stateless 인증 구현
  • JWT Payload에 이메일, 회원 ID, 권한(Role) 정보 포함
  • Redis를 활용하여 로그아웃 시 토큰을 블랙리스트에 등록하여 만료 처리

2. 퀘스트 (Quest)

  • 사용자가 자신만의 퀘스트를 생성하고 타인과 공유하며 학습
  • 자기계발 목적이므로 퀘스트의 성공/실패 여부는 도전한 사용자 본인이 직접 결정

3. 길드 (Guild)

  • 사용자들 간 정보를 공유하고 소통할 수 있는 단체 시스템
  • 길드장(OWNER), 관리자(ADMIN), 일반 회원(MEMBER) 권한 분리 및 가입/탈퇴/강제 추방 지원
  • 길드 내 게시글 및 댓글 작성 기능
  • STOMP 기반 WebSocket을 통한 길드 전용 실시간 채팅 제공

4. 몬스터 및 퀴즈 (Monster & Quiz)

  • 몬스터는 여러 퀴즈들의 집합으로 구성
  • 몬스터 도전을 통해 연관된 퀴즈를 풀고, 정답 개수에 따라 사냥 성공 여부 결정

5. AI 연동

  • Flask 및 LangChain을 활용한 AI 서버 구축
  • LLM을 통해 퀴즈 및 퀘스트 자연어 자동 생성
  • AI를 활용한 길드 검색 기능 제공

6. 스킬 (Skill)

  • 사용자가 습득할 수 있는 기술 스택 시스템
  • 선제 스킬 습득, 퀘스트 완료, 몬스터 처치 등 지정된 사전 조건을 만족해야 스킬 획득 가능

🚀 배포 및 트러블슈팅

인프라 구조

  • AWS EC2 프리티어(t2.micro) 환경에서 Docker Compose를 사용하여 배포
  • 실제 포트를 노출하지 않고 보안을 강화하기 위해 NGINX 리버스 프록시 적용

트러블슈팅 및 회고

  1. 단방향 매핑과 DTO Projection
    • 엔티티 방향을 단방향으로 설정하고, 응답 반환 시 JPQL DTO Projection을 사용하여 한 번의 쿼리로 데이터를 효율적으로 조회했습니다.
  2. Cascade 처리 문제
    • 모든 엔티티를 단방향으로 구성하여 중간 테이블 자동 삭제(Cascade)가 불가능했습니다. 이를 해결하기 위해 게시글 삭제 시 댓글도 함께 삭제되도록 Service 계층에서 로직을 직접 제어하며 복잡한 의존성 문제를 해결했습니다.
  3. 배포 중 메모리 부족 현상
    • EC2 프리티어(1GB RAM) 환경에서 Spring Boot, Flask, DB 컨테이너 동시 실행 시 서버 다운 발생.
    • 해결: 2GB의 Swap 메모리를 추가하고, MySQL과 Redis의 컨테이너 메모리 사용량을 제한하여 안정적인 배포에 성공했습니다.
  4. Redis 활용 계획 변경
    • 초기 기획에서는 일일 퀘스트 및 실시간 인기 퀘스트 캐싱에 사용할 예정이었으나, 기획 변경으로 제외되어 현재는 로그아웃 토큰 블랙리스트 관리용으로만 사용하고 있습니다.

About

개발퀘스트 웹사이트

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors