Spring Boot Mailing System
🚀

Spring Boot Mailing System

notion image

Ten projekt jest obecnie rozwijany w celu pogłębienia moich umiejętności w zakresie Spring Boot, Hibernate, projektowania REST API oraz wstrzykiwania zależności.

Idea jest taka:

Kiedyś, jako mój pierwszy poważniejszy projekt, stworzyłem aplikację imitującą system mailowy. Bez żadnych frameworków. Czysta Java, model client-server oraz sockety. Po prostu kod, który działał i pozwolił mi zrozumieć komunikacje.

Znam już logikę działania tej aplikacji, więc teraz "przenoszę" ją do frameworka, dzięki czemu mogę się skoncentrować na nauce Spring Boota i Hibernate'a, a nie na wymyślaniu funkcjonalności.

notion image

🎯 Funkcjonalności


  • Zarządzanie użytkownikami: tworzenie użytkowników i przypisywanie ról (ADMIN, USER)
  • Uwierzytelnianie JWT: logowanie użytkowników i generowanie tokenów JWT
  • REST API: udostępnione endpointy dla kluczowych funkcjonalności aplikacji
  • Integracja z bazą danych: PostgreSQL w produkcji, H2 w testach
  • Automatyczne migracje bazy danych: zarządzanie zmianami schematu bazy za pomocą Flyway
  • Konfiguracja środowiskowa: użycie pliku .env
notion image

🚀 Technologie i biblioteki


  • Java 21
  • Spring Boot 3.4.4
  • Spring MVC (Web)
  • Spring Security
  • Spring Data JPA
  • Hibernate / JPA
  • Bazy danych PostgreSQL i H2
  • JWT
  • Flyway
  • Spring Dotenv
  • Lombok
  • BCrypt (szyfrowanie haseł)
  • Docker & Docker Compose
  • Maven
    • notion image

🧪 Stack testowy


  • JUnit 5
  • Spring Boot Test
  • MockMvc
notion image

📂 Struktura projektu


. ├── src │ ├── main │ │ ├── java/com/jakubbone │ │ │ ├── config # Konfiguracja zabezpieczeń i Flyway │ │ │ ├── controller # Endpointy REST API │ │ │ ├── dto # Obiekty transferu danych │ │ │ ├── model # Modele encji JPA │ │ │ ├── repository # Repozytoria JPA │ │ │ └── utils # Narzędzia (JWT) │ │ └── resources │ │ ├── db/migration # Skrypty migracyjne Flyway (PostgreSQL i H2) │ │ ├── application.properties │ │ └── application-test.properties │ └── test # Testy jednostkowe i integracyjne ├── Dockerfile # Budowanie obrazu Dockera ├── docker-compose.yml # Orkiestracja kontenerów ├── pom.xml # Zarządzanie zależnościami Maven └── .env # Zmienne konfiguracyjne
notion image

🛠️ Konfiguracja środowiska


Aplikacja używa pliku .env do przechowywania danych wrażliwych, np:

SPRING_DATASOURCE_USERNAME=spring_user SPRING_DATASOURCE_PASSWORD=spring123 JWT_SECRET=secret_jwt_key
notion image

🐳 Uruchamianie aplikacji


Środowisko produkcyjne (PostgreSQL + Docker):

docker-compose up -d mvn spring-boot:ru

Środowisko testowe (H2):

mvn test
notion image

🗃️ Zarządzanie bazą danych przy pomocy Flyway


Migracje bazy danych są automatycznie stosowane przy starcie aplikacji. Przykładowa konfiguracja strategii „clean migrate”:

public FlywayMigrationStrategy cleanMigrateStrategy() { return flyway -> { flyway.clean(); // usuwa istniejący schemat flyway.migrate(); // stosuje migracje (V1, V2...) }; }
notion image

🔑 Bezpieczeństwo i uwierzytelnianie


Aplikacja korzysta z JWT i Spring Security:

  • Hasła są szyfrowane za pomocą BCrypt
  • Tokeny JWT są generowane po pomyślnym logowaniu i służą do zabezpieczania endpointów REST
notion image

✅ Testy automatyczne


Projekt zawiera testy integracyjne i jednostkowe z użyciem JUnit:

  • Wykorzystuje bazę danych H2
  • Waliduje działanie logowania, generowanie tokenów i odpowiedzi endpointów
mvn clean test
notion image

📦 Budowanie za pomocą Dockera


Budowanie i uruchamianie:
docker-compose up --build
notion image

🌐 API


Metoda
Endpoint
Opis
POST
/api/login
Logowanie, uwierzytelnianie i generowanie tokenu JWT
GET
/api/uptime
Zwraca aktualną wersję aplikacji
GET
/api/info
Zwraca czas działania aplikacji w sekundach
notion image

🔗 Repozytorium


SpringBoot-Mailing-System
jakubBoneUpdated Apr 23, 2025