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.
🎯 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
🚀 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
🧪 Stack testowy
- JUnit 5
- Spring Boot Test
- MockMvc
📂 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
🛠️ 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
🐳 Uruchamianie aplikacji
Środowisko produkcyjne (PostgreSQL + Docker):
docker-compose up -d mvn spring-boot:ru
Środowisko testowe (H2):
mvn test
🗃️ 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...) }; }
🔑 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
✅ 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
📦 Budowanie za pomocą Dockera
Budowanie i uruchamianie:
docker-compose up --build
🌐 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 |
🔗 Repozytorium
SpringBoot-Mailing-System
jakubBone • Updated Apr 23, 2025