Skip to content

yw7148/portfolio

Repository files navigation

Youngwon's Portfolio

Backend/Full-stack Developer Youngwon
Portfolio url: http://youngwon.me
Youngwon's server configuration: https://github.com/yw7148/server

Welcome to my Backend developer portfolio repository! This project showcases my skills and projects as a backend developer, including various technologies and tools I've mastered.

youngwon

🚀 Features

  • REST API: Project listing, project program listing, and contact submission APIs.
  • Contract-first API: OpenAPI YAML drives generated Kotlin/Spring interfaces and request/response models.
  • Oracle persistence: Oracle Database integration with Flyway-managed schema migrations.
  • Modular backend: Spring Modulith separates contact and project modules.
  • Testing: Unit, web MVC, architecture, and Oracle Testcontainers integration tests.
  • Deployment packaging: GitHub Actions and Docker build the deployable application image.

🗺️ Roadmap

  • JWT-based authentication and authorization.
  • Login, registration, and OAuth integration.
  • Additional portfolio runtime features beyond the current REST API surface.

🛠️ Technologies Used

for DevOps information, please refer Server Repository

  • Backend: Spring Boot 4.0.3 (Java 17, Kotlin, package namespace me.youngwon.portfolio)
  • Database: Oracle Database Free (Local/Test), Oracle Database (Production)
  • Testing: Spring Test (JUnit)
  • Containerization: Docker
  • CI/CD: GitHub Actions
  • Others: OpenAPI Generator, Spring Modulith, Flyway

📂 Project Structure

.
├── src
|   ├── main
│   |   ├── kotlin
│   |   ├── openapi
│   |   └── resources
│   └── test
├── Dockerfile
├── build.gradle
├── .github/workflows
│   ├── ci.yml
│   └── release.yml
├── docs
│   └── refactoring-to-kotlin.md
├── LICENSE
└── README.md

📖 Getting Started

Prerequisites

  • Docker

Local Oracle DB

docker compose up -d

Default local connection:

  • URL: jdbc:oracle:thin:@localhost:1521/FREEPDB1
  • Username: portfolio
  • Password: portfolio

Build docker image

In my case, --platform linux/amd64,linux/arm64 is added to support multi-platform (my production environment is linux/arm64)

to build multi-platform image, docker buildx builder is required in docker build environment:
docker buildx create --name mybuilder --bootstrap --use
for more information: Multi-Platform Images | Docker Docs

DOCKER_BUILDKIT=1 docker buildx build \
    --platform linux/amd64,linux/arm64 \
    -t yw7148/portfolio:latest \
    .

For a single-platform local image:

docker build -t yw7148/portfolio:latest .

CI/CD

GitHub Actions workflows now handle the repository CI/CD flow.

  • Push to main: runs clean test bootJar
  • Push a Git tag: runs build/test, creates a GitHub Release, then publishes Docker images to Docker Hub

Required GitHub repository secrets

  • DOCKERHUB_USERNAME
  • DOCKERHUB_TOKEN

Docker image tags published on release

  • yw7148/portfolio:<git-tag>
  • yw7148/portfolio:latest

Deploy

Before deploy with Docker, an env file is required

.env

DB_URL=
DB_USER=
DB_PW=
JWT_SECRET=

The prod profile activates prod-db and prod-server, so the application listens on port 9001.

Run Docker container

docker run --pull always -d --name portfolio -p 9001:9001 \
    -e PROFILE=prod \
    --env-file ${path_to_envfile} \
    yw7148/portfolio:latest

📄 API Contract

The backend contract now starts from OpenAPI YAML.

  • Spec location: src/main/openapi/portfolio-api.yaml
  • Validate spec: ./gradlew openApiValidate
  • Generate Kotlin/Spring stubs: ./gradlew openApiGenerate
  • Generated server stubs: build/generated/openapi/src/main/kotlin
  • Current REST endpoints in progress: /api/v1/projects, /api/v1/projects/{projectId}/programs, /api/v1/contacts

The backend now targets REST APIs only.

  • Legacy Thymeleaf page routes are no longer part of the active runtime path
  • Static resource mappings are disabled in application configuration
  • Integration tests use Oracle Testcontainers, so build/test does not need an external DB connection
  • Flyway migrations use m.n.i version names such as V0.0.1__baseline_schema.sql
  • Logical relations are managed with indexed columns instead of physical foreign key constraints

✅ Current Checkpoint

The repository currently passes this verification baseline:

./gradlew clean test openApiValidate openApiGenerate bootJar

Current state:

  • Spring Boot 4.0.3
  • REST-only backend runtime
  • Kotlin package namespace me.youngwon.portfolio
  • OpenAPI-first contract in src/main/openapi/portfolio-api.yaml
  • Spring Modulith-based contact / project modules
  • Flyway-managed Oracle schema
  • GitHub Actions-based CI/CD and Docker packaging

📬 Contact

📝 License

Distributed under the MIT License. See LICENSE for more information.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors