Skip to content

4. Arhitektura i dizajn sustava

Haris Plančić edited this page Jan 24, 2025 · 18 revisions

Arhitektura sustava (globalni upravljački tok, sklopovski zahtjevi)

Opis arhitekture

Stil arhitekure

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.

Podsustavi

  • 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.

Spremišta podataka

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.

Mrežni protokoli

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.

Globalni upravljački tok

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.

Sklopovskoprogramski zahtjevi

Š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.

Obrazloženje odabira arhitekture

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.

Organizacija sustava na visokoj razini

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

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.

Opis tablica

Primarni ključevi biti će označeni zvjezdicom pored imena atributa, a strani ključevi s FK. Primjerice id (*) ili id(FK).


Korisnici

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
email 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

Transaction

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

Transaction_receiver_uservinyls

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

Transaction_sender_uservinyls

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

User_vinyls

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

User_wishlist

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

Vinyls

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

Vinyl_image

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

Vinyl_package

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

Flyway_schema_history

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

Dijagram baze podataka

Dijagram baze podataka

Dijagram razreda

Dijagram svih razreda

Dijagram razreda Sve_ukupno

Dijagram razreda Users

Dijagram razreda Users

Dijagram razreda UserVinyls

Dijagram razreda UserVinyl

Dijagram razreda UserWishlist

Dijagram razreda UserWishlist

Dijagram razreda Vinyl

Dijagram razreda Vinyl

Dijagram razreda Package

Dijagram razreda VinylPackage

Dijagram razreda config

Dijagram razreda config

Dijagram razreda Email

Dijagram razreda config

Dijagram razreda Transaction

Dijagram razreda config

Dijagram razreda VinylImages

Dijagram razreda config

Dinamičko ponašanje aplikacije

UML dijagrami stanja

dijagram stanja

UML dijagrami aktivnosti

dijagram aktivnosti

Clone this wiki locally