-
Notifications
You must be signed in to change notification settings - Fork 0
4. Arhitektura i dizajn sustava
Pri izradi aplikacije koristili smo klijent-poslužitelj arhitektonski stil s odvojenim kompenentama za frontend i backend koje komuniciraju korištenjem REST API-ja. Stil je odabran zbog jednostavnosti održavanja, skalabilnosti i neovisnosti koja omogućava brz i jednostavan razvoj jer dvije grupe mogu neovisno raditi na odvojenim komponentama koje se kasnije lako spoje u cjelinu.
-
Frontend:
Odgovoran je za korisničko sučelje. Omogućuje prikaz podataka korisnicima(informacije o dostupnim gramofonske pločama, informacije o profilu korisnika i dr.). Implementiran je u Reactu i koristi HTML, CSS i JavaScript. -
Backend:
Zadužen je za radnu logiku aplikacije i pristup podatcima koji su spremljeni u bazi. Obrađuje HTTP metode i komunicira s bazom podataka radi spremanja ili brisanja podataka. Implementiran je u Spring boot-u. -
Baza podataka
Služi kao spremište za podatke o korisnicima, gramofonskim pločama i transakcijama izvršenim na aplikaciji. Koristimo PostgreSQL. -
Autentifikacijski podsustav:
Koristili smo OAuth 2.0 koji omogućava korisnicima prijavu korz vanjski autentifikacijski servis.
Koristimo relacijsku bazu podataka za pohranu važnih podataka o korisnicima, pločama, ponudama na stranici te već izvršenim transakcijama. U početku razvoja radi jednostavnosti smo koristili H2 DBMS no u kasnijoj fazi razvoja smo izabrali koristiti PostgreSQL. PostgreSQL baza odabrana je zbog svoje brzine i fleksibilnosti u razvoju, kao i mogućnosti integracije u Spring okruženje.
Koristimo HTTP/HTTPS za komunikaciju između klijenta i poslužitelja. Oauth 2.0 za autentifikaciju korisnika te SMTP, POP, IMAP za slanje mailova kako bi korisnici znali kada su zaprimili ponudu ili da je dostupna ploča koja ih zanima.
Cirkulacija podataka i informacija u sustavu SwitchPoint slijedi jasno definiran tok koji se može podijeliti u nekoliko ključnih faza:
-
Prijava i autentifikacija korisnika:
Korisnik započinje interakciju sa sustavom prijavom ili registracijom putem korisničkog sučelja. Nakon unosa vjerodajnica, sustav šalje zahtjev za autentifikaciju prema poslužitelju, gdje se provjeravaju uneseni podaci u bazi korisnika. Uspješna prijava omogućuje korisniku pristup svim funkcionalnostima platforme.
-
Pregled dostupnih ploča:
Nakon prijave, korisniku se prikazuju dostupne gramofonske ploče koje su drugi korisnici dodali na platformu za razmjenu. Podaci o pločama dohvaćaju se iz centralne baze podataka i prikazuju u korisničkom sučelju, omogućujući filtriranje i pretraživanje prema preferencijama korisnika.
-
3. Dodavanje ploča za razmjenu
Korisnici koji žele sudjelovati u razmjeni unose podatke o vlastitim pločama putem posebnog obrasca. Informacije poput naziva albuma, izvođača, stanja ploče i dodatnih detalja šalju se prema poslužitelju, gdje se pohranjuju u bazi podataka i postaju dostupne za pregled ostalim korisnicima.
-
Slanje ponuda za zamjenu
Kada korisnik pronađe željenu ploču, može poslati ponudu za zamjenu. Sustav šalje obavijest korisniku koji posjeduje ploču te pruža mogućnost prihvaćanja ili odbijanja ponude. Komunikacija između korisnika odvija se unutar platforme putem poruka, čime se osigurava privatnost i sigurnost podataka.
-
Zaključivanje razmjene
Kada obje strane prihvate ponudu, sustav bilježi detalje dogovorene razmjene. Podaci o pločama ažuriraju se u bazi podataka kako bi se prikazalo da su razmijenjene, čime se održava točnost dostupnih ponuda.
Što se tiče sklopovskih i programskih zahtjeva, aplikacija je implementirana kao web-aplikacija, što znači da korisnici pristupaju platformi putem web-preglednika. Za optimalno iskustvo preporučuje se korištenje modernih web-preglednika poput Google Chromea, Mozilla Firefoxa ili Microsoft Edgea. Budući da je aplikacija hostirana na poslužitelju, korisnici ne trebaju brinuti o specifičnim hardverskim zahtjevima osim stabilne internetske veze. Za poslužiteljsku stranu, pretpostavlja se da je aplikacija implementirana koristeći standardne web-tehnologije, što znači da bi poslužitelj trebao imati podršku za relevantne programske jezike i baze podataka, kao i adekvatne resurse poput procesorske snage i memorije za rukovanje očekivanim brojem korisnika.
Odabir klijent-poslužitelj arhitekture u našem projektu bio je vođen više ključnih čimbenika koji osiguravaju da arhitektura zadovoljava zahtjeve skalabilnosti, održivosti i modularnosti. U nastavku su objašnjeni glavni razlozi koji su utjecali na naš izbor.
Ključni čimbenici
-
Skalabilnost
Klijent-poslužitelj arhitektura nudi prirodnu podjelu rada između klijenata i poslužitelja, što omogućuje lakšu horizontalnu i vertikalnu skalabilnost. Poslužiteljsku komponentu možemo skalirati dodavanjem više resursa ili instanci, dok se klijentske aplikacije mogu neovisno razvijati i skalirati prema potrebama korisnika. -
Održivost
Održivost je ključni aspekt pri odabiru arhitekture. Klijent-poslužitelj arhitektura omogućuje centralizirano upravljanje i održavanje poslužiteljskog dijela, što smanjuje složenost nadogradnji, popravaka i sigurnosnih zakrpa. Ova centralizacija smanjuje potrebu za istovremenim nadogradnjama svih klijentskih aplikacija. -
Neovisnost
Smatrali smo da je klijent-poslužitelj arhitektura pogodna našem timu jer smo se lako mogli podijeliti u tim za frontend i tim za backend komponentu aplikacije. To je omogućilo neovisan razvoj komponenti i da članove tima koji imaju iskustva s nekom od komponenti zadužimo za njihov razvoj.
Arhitektura aplikacije može se podijeliti na tri glavne komponente:
- Frontend
- Backend
- Baza podataka
Frontend komponenta omogućuje korisniku pristup web stranici te svim pregledima i multimedijskom sadržaju na njima. Korisnik pristupa web stranici putem HTTPS protokola (Hypertext Transfer Protocol Secure), koji osigurava sigurnu komunikaciju. Preglednik interpretira primljeni sadržaj od poslužitelja te ga prikazuje u obliku razumljivom korisniku. Frontend aplikacije izrađen je u HTML-u, CSS-u i JavaScriptu koristeći ReactJS, koji omogućava modularan dizajn s komponentama koje se mogu lako ponovo koristiti. React koristi virtualni DOM za optimizaciju rada, smanjujući manipulaciju stvarnog DOM-a.
Backend komponenta koja obrađuje HTTPS zahtjeve korisnika i šalje im potrebne podatke. Naš poslužitelj je razvijen u Java programskom jeziku uz pomoć Spring Boot okvira, što omogućava jednostavnu konfiguraciju i ubrzava razvoj. Spring Boot koristi višeslojnu arhitekturu koja sadrži:
- Controller sloj koji prima i obrađuje HTTP zahtjeve.
- Data Access sloj koji upravlja komunikacijom s bazom podataka.
- Exception Handling sloj za hvatanje i obradu grešaka.
Baza podataka za web aplikaciju koristi relacijski model podataka. Kao RDBMS (Relational Database Management System) koristi se PostgreSQL verzija 15.0.
Baza podataka za web aplikaciju koristi relacijski model podataka. Kao RDBMS (Relational Database Management System) koristi se PostgreSQL verzija 15.0.
Stvaramo ER dijagram baze podataka u kojem navodimo sve entitete, njihove
atribute te međusobne veze. Daljnje tipove podataka, primarne, strane i alternativne
ključeve navodimo u relacijskoj shemi baze podataka.
Primarni ključevi biti će označeni zvjezdicom pored imena atributa, a strani ključevi s FK. Primjerice id (*) ili id(FK).
Ovaj entitet sadržava sve važne informacije o korisniku koji koristi aplikaciju. Sadrži atribute: user_id, date_created, email, hash_password, location i username.
Ovaj entitet je u vezi One-to-Many s entitetom user_vinyls preko korisnikovog user_id-a.
| Atribut | Tip podataka | Opis varijable |
|---|---|---|
| user_id(*) | BIGINT | Jedinstveni identifikator zaposlenika |
| date_created | TIMESTAMP | Datum kreiranja računa |
| VARCHAR(255) | E-mail korisnika | |
| hash_password | VARCHAR(255) | Hash lozinke korisnika |
| username | VARCHAR(255) | Jedinstveni naziv korisnika za web-aplikaciju |
| sub | VARCHAR(255) | Jedinstveni identifikator za OAuth2 |
| latitude | FLOAT(53) | Latituda korisnika |
| longitude | FLOAT(53) | Longituda korisnika |
Ovaj entitet sadržava popis svih transakcija, te sadržava njihovo stanje. Sadrži atribute: transaction_id (*), status, timestamp, receiver_user_id i sender_user_id.
Ovaj entitet je u vezi One-to-Many s entitetom korisnici preko transaction-ovog receiver_user_id i sender_user_id-a.
| Atribut | Tip podataka | Opis varijable |
|---|---|---|
| transaction_id(*) | BIGINT | Jedinstveni identifikator transakcije |
| status | ENUM('CANCELED', 'COMPLETED', 'PENDING') | Stanje transakcije |
| timestamp | TIMESTAMP | Vrijeme stvaranja nove transakcije |
| receiver_user_id | BIGINT | Jedinstveni naziv korisnika primatelja gramofonske ploče |
| sender_user_id | BIGINT | Jedinstveni naziv korisnika pošaljitelja gramofonske ploče |
Ovaj entitet spaja gramofonske ploče korisnika primatelja s transakcijom .Sadrži atribute: transaction_id() i uservinyl_id() .
Ovaj entitet je u vezi One-to-Many s entitetom transaction preko transaction_id i u vezi One-to-Many vezi je s user_vinyls preko uservinyl_id.
| Atribut | Tip podataka | Opis varijable |
|---|---|---|
| transaction_id (*) | BIGINT | Jedinstveni identifikator transakcije |
| uservinyl_id (*) | BIGINT | Jedinstveni identifikator ploče od nekog korisnika |
Ovaj entitet spaja gramofonske ploče korisnika pošaljitelja s transakcijom .Sadrži atribute: transaction_id () i uservinyl_id ().
Ovaj entitet je u vezi One-to-Many s entitetom transaction preko transaction_id i u vezi One-to-Many vezi je s user_vinyls preko uservinyl_id.
| Atribut | Tip podataka | Opis varijable |
|---|---|---|
| transaction_id (*) | BIGINT | Jedinstveni identifikator transakcije |
| uservinyl_id (*) | BIGINT | Jedinstveni identifikator ploče od nekog korisnika |
Ovaj entitet sadržava sve važne informacije o gramofonskim pločama koje posjeduje korisnik. Sadrži atribute: user_id, id,sleeve_condition, vinyl_condition, vinyl_id i package_id. Ovaj entitet je u vezi One-to-Many s entitetom vinyl_package preko user_vinyl-ovog package_id-a.
| Atribut | Tip podataka | Opis varijable |
|---|---|---|
| id (*) | BIGINT | Jedinstveni identifikator profila |
| sleeve_condition | VARCHAR(255) | Opis stanja omota |
| vinyl_condition | VARCHAR(255) | Opis stanja gramofonske ploče |
| user_id | BIGINT | Jedinstveni identifikator korisnika |
| vinyl_id | BIGINT | Jedinstveni identifikator gramofonske ploče |
| package_id | BIGINT | Jedinstveni identifikator paketa |
| opis | VARCHAR(255) | Površni opis gramofonske ploče |
| ozn_izdanja | VARCHAR(255) | Ime izdanja gramofonske ploče |
| image_id | BIGINT | Jedinstveni identifikator slike uz navedenu gramofonsku ploču |
Ovaj entitet sadržava želje ploče od navedenog korisnika. Sadrži atribute: id (*), notes, user_id i vinyl_id.
Ovaj entitet je u vezi One-to-Many s entitetom Vinyls preko vinyl_id.
| Atribut | Tip podataka | Opis varijable |
|---|---|---|
| id (*) | BIGINT | Jedinstveni identifikator svakog wishlista |
| notes | VARCHAR(255) | Zahtjevi korisnika |
| user_id | BIGINT | Jedinstveni identifikator korisnika |
| vinyl_id | BIGINT | Jedinstveni idetifikator gramofonske ploče |
Ovaj entitet sadržava sve važne informacije o gramofonskim pločama. Sadrži atribute: user_id, id,sleeve_condition, vinyl_condition, vinyl_id i package_id.
Ovaj entitet je u vezi One-to-Many s entitetom user_vinyls i user_wishlist preko vinyls-ovog vinyl_id-a.
| Atribut | Tip podataka | Opis varijable |
|---|---|---|
| vinyl_id (*) | BIGINT | Jedinstveni identifikator gramofonske ploče |
| artist | VARCHAR(255) | Ime izvođača gramofonske ploče |
| genre | VARCHAR(255) | Opis žanra gramofonske ploče |
| release_year | INTEGER | Datum izdavanja gramofonske ploče |
| vinyl_image | VARCHAR(255) | Slika korisnikove gramofonske ploče |
| vinyl_title | VARCHAR(255) | Naslov gramofonske ploče |
Ovaj entitet sadržava detaljne informacije o navedenoj slici. Sadrži atribute: image_id (*), content_type, image_data i upload_date.
Ovaj entitet je u povratnoj vezi preko image_data.
| Atribut | Tip podataka | Opis varijable |
|---|---|---|
| image_id (*) | BIGINT | Jedinstveni identifikator slike navedene ploče |
| content_type | VARCHAR(255) | Vrsta navedene slike |
| image_data | VARCHAR(255) | Podatci slike |
| upload_date | TIMESTAMP | Datum objave slike gramofonske ploče |
Ovaj entitet sadržava informacije skupa ploča tokom transakcije. Sadržava atribute: package_id (*), description i pakage_name.
| Atribut | Tip podataka | Opis varijable |
|---|---|---|
| package_id (*) | BIGINT | Jedinstveni identifikator paketa |
| description | VARCHAR(255) | Detaljni opis paketa |
| pakage_name | VARCHAR(255) | Naziv individualnog paketa |
Ovaj entitet detaljno sadržava povijest migracija baze podataka. Sadržava atribute: installed_rank (*), version , description, type, script, checksum, installed_by, installed_on, execution_time i success.
| Atribut | Tip podataka | Opis varijable |
|---|---|---|
| installed_rank (*) | INTEGER | Redni broj migracije |
| version | VARCHAR(50) | Verzija migracije |
| description | VARCHAR(200) | Kratak opis migracije |
| type | VARCHAR(20) | Tip migracije |
| script | VARCHAR(1000) | Naziv SQL skripte |
| checksum | INTEGER | Kontrolna suma skripte |
| installed_by | VARCHAR(100) | Korisnik ili servis koji je izvršio migraciju |
| installed_on | TIMESTAMP | Vrijeme i datum primjene migracije |
| execution_time | TIMESTAMP | Vrijeme potrebno za izvođenje |
| success | BOOLEAN | Status migracije |


SwitchPoint








