You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
역할 기반 권한(RBAC): ADMIN / TEACHER / STUDENT / MENTOR 역할 분리
프로필 관리: 닉네임, 소개글, 기술 스택, SNS 링크, 프로필·배너 이미지 (S3)
방명록: 다른 사용자의 프로필에 방명록 작성
포트폴리오 프로젝트: 개인 프로젝트 등록 및 관리
게시물 & 커뮤니티
게시물: 마크다운 기반 작성, 페이지네이션, 좋아요, 조회수
댓글: 대댓글(계층 구조), 좋아요, 고정 댓글 기능
신고 & 제재: 게시물·사용자 신고 접수, 관리자 제재 처리
스터디 그룹
그룹 생성: 공개/비공개 설정, 정원 제한
멤버 관리: 가입 신청 → 승인 플로우, 역할(OWNER/MEMBER) 분리
상태 관리: RECRUITING / IN_PROGRESS / CLOSED
포인트 & 마켓플레이스
포인트 시스템: 지급·차감·사용 내역 관리, 잔액 조회
코인 시스템: 별도 화폐 단위 관리 (관리자 지급)
마켓플레이스: 아이템 등록·검색·구매·재고 관리, 장바구니
인벤토리: 구매한 아이템 보관 및 조회
운영 & 관리
관리자 대시보드: 웹 기반 어드민 UI (/admin)
S3 브라우저: 업로드 파일 관리 (/admin/s3)
헬스 체크: 애플리케이션 상태 모니터링
시작하기
사전 요구사항
Java 17+
MySQL 8.0+
(선택) Docker & Docker Compose
AWS S3 버킷 또는 IAM Role (EC2 배포 시 대체 가능)
환경 변수
프로젝트 루트의 .env 파일을 참고하여 환경 변수를 설정합니다.
# ── Database ──────────────────────────────────────────────DB_URL=jdbc:mysql://localhost:3306/lipsumdb?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8DB_USERNAME=rootDB_PASSWORD=your_password# ── JWT ───────────────────────────────────────────────────# 64자 이상의 랜덤 hex 문자열 권장JWT_SECRET=hCB8xQ7mVYF2wzG3JpA9kL5rN2uS8eD1tQ6yZ3mB7cP4vX9sR1aT6uW3qE8nK5bM# ── CORS ──────────────────────────────────────────────────CORS_ALLOWED_ORIGIN_PATTERNS=http://localhost:*,https://your-frontend.com# ── Cookie ────────────────────────────────────────────────# HTTPS 환경: true / HTTP 로컬 개발: falseCOOKIE_SECURE=false# ── AWS S3 ────────────────────────────────────────────────# EC2 IAM Role 사용 시 아래 두 항목 생략 가능AWS_ACCESS_KEY=your_access_keyAWS_SECRET_KEY=your_secret_key# ── GitHub OAuth ──────────────────────────────────────────GITHUB_CLIENT_ID=your_github_client_idGITHUB_CLIENT_SECRET=your_github_client_secretGITHUB_CALLBACK_URL=http://localhost:8080/api/auth/github/callbackFRONTEND_BASE_URL=http://localhost:3000# ── Logging ───────────────────────────────────────────────LOG_FILE=logs/app.log
로컬 실행
# 빌드 (테스트 제외)
./gradlew clean build -x test# 실행
java -jar build/libs/proj-0.0.1-SNAPSHOT.jar
# 포트 변경
java -jar build/libs/proj-0.0.1-SNAPSHOT.jar --server.port=9090
# 프로덕션 프로파일 (DDL: validate)
java -jar build/libs/proj-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
Docker 실행
# 이미지 빌드
docker build -t lipsum-backend .# 컨테이너 실행 (.env 파일 사용)
docker run -d \
--name lipsum \
--env-file .env \
-p 8080:8080 \
lipsum-backend
배포
본 프로젝트는 GitHub Actions를 통한 CI/CD 파이프라인이 구성되어 있습니다.
main 브랜치 push
│
▼
[build-and-push.yml]
Gradle 빌드 → Docker 이미지 빌드 → GHCR(GitHub Container Registry) 푸시
│
▼
[deploy.yml]
EC2 SSH 접속 → 최신 이미지 Pull → docker compose up -d → 구 이미지 정리
EC2 환경 요구사항:
Docker & Docker Compose 설치
GHCR 인증 설정 (docker login ghcr.io)
.env 파일 또는 IAM Role 구성
API 문서
서버 실행 후 Swagger UI에서 전체 API 목록을 확인할 수 있습니다.
http://localhost:8080/swagger-ui.html
표준 응답 형식
모든 엔드포인트는 ResponseEntity<ApiResponse<T>> 형태로 응답합니다.
Access Token 만료 (401 TOKEN_EXPIRED)
│
▼
[클라이언트] POST /api/auth/reissue
(Refresh Token은 HttpOnly Cookie로 자동 전송)
│
▼
새 Access Token + 새 Refresh Token 발급
GitHub OAuth
[클라이언트] GET /api/auth/github
│
▼
GitHub 로그인 페이지 리다이렉트
│
▼
GET /api/auth/github/callback?code=...
│
▼
GitHub API로 사용자 정보 조회
→ 기존 계정 연동 또는 신규 계정 생성
│
▼
프론트엔드로 리다이렉트 (토큰 포함)
쿠키 설정:
속성
값
HttpOnly
true
Secure
true (HTTPS) / false (로컬)
SameSite
None
Max-Age
7일
프로젝트 구조
src/main/java/com/ada/proj/
├── ProjApplication.java
├── config/ # Security, CORS, Cache, S3 설정
├── controller/ # REST 컨트롤러 (20개)
├── service/ # 비즈니스 로직 (20개)
├── entity/ # JPA 엔티티 (26개)
├── repository/ # Spring Data JPA 레포지터리 (26개)
├── dto/ # 요청/응답 DTO (75개)
├── security/ # JWT 필터, Provider, UserDetails
├── enums/ # Role, Status 등 열거형 (12개)
├── exception/ # 커스텀 예외 및 GlobalExceptionHandler
└── util/ # 공통 유틸리티
src/main/resources/
├── application.yml # 기본 설정
├── application-prod.yml # 프로덕션 설정 (DDL: validate)
└── logback-spring.xml # 로깅 설정 (UTF-8, 파일 출력)