Cerințe prealabile
În cadrul acestui laborator, ne vom concentra pe dezvoltarea unui server web folosind Java și framework-ul Spring Boot. Chiar dacă nu aveți experiență în Spring Boot, acesta este un framework ușor de învățat pentru cei care cunosc Java și programarea orientată pe obiect. Vă recomandăm să parcurgeți acest ghid oficial pentru o scurtă introducere în Spring Boot.
Spring Boot este un framework popular pentru dezvoltarea aplicațiilor enterprise, oferind un set robust de instrumente pentru dezvoltarea rapidă și eficientă a aplicațiilor web. Beneficiile utilizării Spring Boot includ modularitatea, scalabilitatea, integrarea facilă cu diverse tehnologii și suport extins din partea comunității.
Dacă întâmpinați dificultăți în înțelegerea scheletului laboratorului, puteți consulta documentația oficială Spring Boot și resursele oferite de comunitatea Spring pentru dezvoltatori.
Unelte
Înainte de a începe dezvoltarea efectivă, trebuie să pregătiți următoarele:
IDE și pachete pentru Java Spring Boot
- Recomandăm utilizarea IntelliJ IDEA ca IDE principal. Puteți solicita o licență academică gratuită pentru varianta Ultimate folosind adresa de e-mail instituțională.
- Asigurați-vă că aveți instalat Java 17+ și Maven sau Gradle pentru gestionarea dependențelor.
- Alternativ, puteți folosi Spring Boot CLI pentru a crea rapid proiecte Spring Boot.
Baza de date PostgreSQL
- Pentru a folosi baza de date PostgreSQL, o opțiune este să instalați PostgreSQL pe mașina locală, deși nu este recomandată.
- O alternativă mai bună este să instalați Docker și Docker Compose. Rulați comanda de docker-compose cu fișierul YAML găsit în GitLab-ul laboratorului:
docker-compose -f .\docker-compose.yml -p mobylab-app-db up -d
Un client de bază de date
- Pentru PostgreSQL, puteți utiliza PGAdmin.
- Dacă doriți un client universal, puteți opta pentru DBeaver.
Această configurație vă va permite să începeți dezvoltarea unei aplicații backend folosind Spring Boot și PostgreSQL. Dacă aveți întrebări sau probleme, consultați documentația Spring Boot sau comunitatea de dezvoltatori.
📄️ Concepte de baza in dezvoltarea de aplicatii web
În cadrul acestui laborator, vom împărți aplicația web în două componente distincte: frontend și backend. Frontend-ul reprezintă partea vizibilă a aplicației pentru utilizator și rulează în browserul acestuia. Având frontend-ul ca o entitate independentă, acesta va fi dezvoltat sub forma unei aplicații SPA (Single-Page Application). Spre deosebire de un MPA (Multi-Page Application), o aplicație SPA constă într-o singură pagină care își modifică dinamic conținutul în funcție de acțiunile utilizatorului și datele furnizate de backend.
📄️ Pregătirea unui proiect
Pentru a vă ajuta în implementarea proiectului de la laborator, puteți utiliza scheletul proiectului Spring disponibil pe GitLab. Cu toate acestea, pentru a începe, vom crea un proiect de backend în IDE-ul preferat, selectând un template pentru Spring Boot, după cum se arată mai jos.
📄️ Interacțiunea cu baza de date
Pe lângă logica aplicației, trebuie să existe persistența datelor asupra cărora se efectuează logica efectivă. În acest sens, majoritatea aplicațiilor folosesc baze de date. Pentru a simplifica interacțiunea programelor cu baza de date, au fost implementate ORM-uri (Object-Relational Mapping). Acestea sunt framework-uri care realizează o corespondență între tabelele și tipurile de date din baza de date cu obiectele, numite entități, și tipurile declarate în codul aplicației.
📄️ Injectarea de dependente
Introducere
📄️ Tratarea cererilor HTTP
Trebuie clarificat în primul rând cum funcționează aplicația de backend în Spring Boot. Când aplicația este pornită, se deschide un port și se așteaptă cererile HTTP. Cererea este parsată și transformată într-un context HTTP. Contextul este trimis către un filter chain care va apela rutinele adecvate pentru acea cerere și va întoarce răspunsul înapoi în acel lanț. Fiecare pas executat în acest lanț se numește filter, iar o parte din acestea pot fi definite de către dezvoltatori. Ultimul filtru executat la tratarea cererii apelează clase definite de dezvoltator de tip controller. În controller se specifică ce endpoint-uri/rute din API-ul serverului corespund la ce metode din acea clasă. O clasă controller este o clasă specială ai cărei metode publice sunt apelate la accesul rutelor corespunzătoare metodei, acestea sunt decorate cu @RestController. Pentru ca framework-ul să identifice controllerele și rutele, se decorează clasa și metodele cu adnotări. De exemplu, @RestController care specifică framework-ului că această clasă trebuie să fie folosită ca controller; @RequestMapping("/api/controller") pus pe clasă și @GetMapping("/my-route") pe metoda din controller specifică că atunci când se accesează ruta "/api/controller/my-route" cu un HTTP GET, se apelează acea metodă în cauză.
📄️ Autentificare și Autorizare
În această secțiune, vom discuta despre autentificare și autorizare. Pentru autentificarea utilizatorilor, vom folosi o schemă simplă de autentificare cu adresa de email și parola, care va returna un jeton (token) folosind standardul JWT (JSON Web Token). JWT-ul este un JSON semnat în format Base64. Generați din swagger-ul proiectul laboratorului JWT-ul pe ruta de login cu user "admin@default.com" și parola "default" pentru a vedea cum arată.