REST API server for a blog platform. Users sign up via Google OAuth, write posts, and leave comments. Built with Spring Boot, deployed to AWS with Docker and GitHub Actions CI/CD.
Backend: Java 17, Spring Boot, Spring Security, JWT, Spring Data JPA, QueryDSL
Database: MySQL 8, Redis (caching)
Infrastructure: Docker Compose, GitHub Actions, AWS (EC2, ECR, RDS)
Testing: JUnit 5, Gradle
Authentication
- Google OAuth2 social login
- JWT-based session management (access + refresh tokens)
- Spring Security integration
Posts & Comments
- CRUD operations with author-only edit/delete
- Pagination with QueryDSL dynamic queries
- Comment threads on posts
User Management
- Profile view and update
- Account deletion
CI/CD pipeline runs on every push to develop:
- Build — Gradle build + unit tests on GitHub Actions
- Package — Jib builds Docker image, pushes to AWS ECR
- Deploy — Self-hosted runner pulls image and runs on EC2
See .github/workflows/ci-cd.yml for the full pipeline.
# Start MySQL + Redis
docker compose -f docker/docker-compose.yml up -d
# Run the app
./gradlew bootRunsrc/main/java/me/jaeyeop/blog/
├── post/ # Post domain (hexagonal architecture)
│ ├── adapter/ # REST controllers, JPA repositories
│ ├── application/ # Use cases, service layer
│ └── domain/ # Entities, value objects
├── comment/ # Comment domain (same structure)
├── user/ # User management
└── commons/ # Shared config, auth, error handling
├── authentication/ # OAuth2 + JWT
├── token/ # Token management
├── config/ # Spring configuration
└── error/ # Global exception handling

