W tym artykule przedstawię warstwy aplikacji. Aplikacje w języku Java mają warstwy jak tort urodzinowy. Przedstawię trzy główne warstwy aplikacji oraz warstwę pomocniczą, łączącą inne warstwy oraz bazę danych. Zanim zacznę szczegółowy opis wyjaśnię dlaczego tak ważne jest, aby aplikacja była podzielona na warstwy.
Wprowadzenie do warstw
Stosownie podziału aplikacji na warstwy – klasy i pakiety – jest dobrą praktyką w programowaniu, można powiedzieć, że bez tego nie powstają żadne komercyjne aplikacje i nie chodzi tu tylko o język Java. Każda warstwa reprezentowana jest przez oddzielną klasę umieszczoną w osobnym pakiecie. Pakiety (foldery na dysku) logicznie grupują klasy (pliki na dysku), tym samym tworząc warstwy. Natomiast klasa w danym pakiecie reprezentuje implementację danej warstwy, która zawiera odpowiednią funkcjonalność, czyli rolę, zadanie do wykonania.
Poniższy rysunek pokazuje warstwy w aplikacji trójwarstwowej.

Przykłady warstw
Typowa aplikacja w języku Java składa się z następujących warstw, które szczegółowo opiszę w dalszej części:
1. Warstwa prezentacji, GUI,
2. Warstwa logiki biznesowej, service,
3. Warstwa dostępu do danych, dao, repository,
4. Warstwa pośrednia, mapper, agregat,
5. Baza danych.
Powyższe nazewnictwo może różnić się w zależności od wybranej technologii, w której została stworzona aplikacja.
Spring Framework
- Warstwa prezentacji,
- Warstwa Service,
- Warstwa Repository,
- Warstwa pośrednia Mapper,
- Baza danych.
Java/Jakarta EE
- Warstwa prezentacji,
- Warstwa logiki biznesowej,
- Warstwa DAO,
- Brak – warstwy pośredniej,
- Baza danych.
Diagram UML
Poniżej przykład aplikacji trójwarstwowej z klasami/obiektami wymienianymi między warstwami za pomocą warstwy pośredniej. Do wymiany danych między warstwami używamy np. Model/DTO, Entity/VO i mappera, agregatu – szczegółowo opisane poniżej.
Opis warstw
Poniżej znajduje się szczegółowy opis poszczególnych warst wraz z przykładami ich zastosowania. W skrócie. Warstwa prezentacji to tzw. front-end, zawiera elementy widoczne dla użytkownika w formie graficznej, np. strona www, okienka w graficznym interfejsie użytkownika. Back-end, to warstwa logiki biznesowej, dostępu do danych oraz warstwa pośrednia, warstwy te nie są widoczne w formie graficznej dla użytkownika systemu. Baza danych, to po prostu repozytorium, źródło danych, magazyn danych, który przechowuje dane.
Warstwa prezentacji
Tę warstwę opiszę na podstawie strony www, która wyświetla HTML. Sam HTML, to za mało, potrzebny jest framework aplikacji web, który dostarcza system szablonów HTML. Dodatkowo taki framework korzysta ze wzorca projektowego MVC. Dlaczego sam HTML nie wystarczy? HTML z założenia tworzy statyczne strony WWW, to Javascript dodaje interakcję z użytkownikiem w przeglądarce WWW. Statyczne strony, to takie, które są wyświetlane dokładnie tak, jak zostały napisane w HTML’u, Javascript operuje na elementach HTML’a.
Do komunikacji i udostępniania dynamicznych danych zwracanych przez serwer aplikacji, back-end, potrzebny jest dynamiczny HTML, który uzyskujemy za pomocą fremwork’ów web z systemem szablonów. Przykładem warstwy prezentacji może być formularz www umożliwiający wykonanie przelewu bankowego. Na takim formularzu podajemy dane do przelewu, kwotę oraz datę wykonania przelewu. Zebrane dane są przesyłane do back-end’u, warstwy logiki biznesowej.
Warstwa logiki biznesowej
Zwana również service, zawiera logikę aplikacji, która umożliwia przetwarzanie przychodzących danych z np. www i zwraca wynik przetwarzania. W tej warstwie zawarte są algorytmy, weryfikacja poprawności danych i obliczenia na danych. Service jest pośrednikiem pomiędzy warstwą prezentacji, a warstwą dostępu do danych w tej warstwie znajduje się również warstwa pośrednia, mapper, agregat.
Przykładem warstwy logiki biznesowej, service może być kod aplikacji weryfikujący przelew bankowy, który zlecił użytkownik przez www. Back-end przed wykonaniem przelewu sprawdzi najpierw czy klient ma dostępne środki na koncie, czy przelew jest zaplanowany na banking-day, czyli dzień pracy banku. Może też uruchomić mechanizmy przeciwdziałające praniu brudnych pieniędzy i wiele innych. Bardzo dużo rzeczy dzieje się po stronie back-end’u.
Warstwa dostępu do danych
Ta warstwa odpowiedzialna jest za utrwalanie, zapisywanie wykonanych operacji do np. bazy danych. Co to oznacza? Weźmy za przykład wyżej przedstawiony przelew bankowy. Po poprawnym wykonaniu przelewu, zapisywana jest informacja, o tym kto i kiedy zrobił przelew, na jaką kwotę i jakie było saldo po i przed operacją. Takie dane posłużą później wyświetleniu historii przelewów na naszym rachunku bankowym oraz do np. wygenerowania wykresu naszych wydatków. Bez utrwalonych, zapisanych danych nie było by, to możliwe.
Warstwa pośrednia
Może pełnić funkcję mapper’a, agregat’u jest używana pomiędzy:
– warstwą prezentacji, a warstwą logiki biznesowe, service,
– warstwą logiki biznesowej, a warstwą dostępu do danych.
Relacja pomiędzy warstwami jest dwukierunkowa.
Po co w ogóle nam warstwa pośrednia? W większości przypadków służy ona do zamiany jednego typu obiektu na drugi. Co to oznacza? Oznacza to, że różne warstwy korzystają z różnych typów obiektów:
– warstwa prezentacji z użyciem MVC, korzysta z klas będących Model/DTO – Data Transfer Object,
– warstwa dostępu do danych korzysta z klas będących Entity/VO – Value Object.
Powyżej przykład Mappera dla warstwy pośredniej. Opisana wcześniej funkcja przelewu bankowego posłuży jako przykład warstwy pośredniej, mapper, agregat.
Po co nam DTO, VO, Entity, Model?
Jak widać powyżej w różnych warstwach klasy różnią się od siebie, mają więcej lub mniej pól w klasie i to jest pierwszy powód dla którego potrzebujemy warstwy pośredniej. Drugim powodem jest nie mieszanie walidacji danych na różnych warstwach. Dodatkowo typy danych w DTO oraz VO mogą się różnić i będą wymagały konwersji, to jest kolejny powód dla którego należy użyć warstwy pośredniej.
Wyświetlając listę naszych przelewów chcemy mieć gwarancję, że dane otrzymamy w niezmienionej postaci. Od strony programistycznej, aby to osiągnąć w warstwie dostępu do danych należy użyć Entity/VO – Value Object, które gwarantują, że wartości (np. kwota przelewu) w klasie nie ulegną zmianie przechodząc przez warstwy. O niezmienności Value Object można przeczytać – Value object – Wikipedia. W tej warstwie dane mają już konkretny typ w odróżnieniu od warstwy prezentacji.
Wprowadzając dane przez stronę www podajemy niezbędne dane do realizacji przelewu, tutaj możemy użyć DTO i/lub Model. Wprowadzone przez użytkownika dane mogą być nieprawidłowe, należy zweryfikować ich poprawność i wyświetlić stosowny komunikat. Dodatkowo w większości przypadków do warstwy prezentacji dane przychodzą w postaci tekstu, bez konkretnego typu w przeciwieństwie do warstwy dostępu do danych. Warstwa prezentacji przenosi dane do warstwy logiki biznesowej, service za pomocą warstwy pośredniej, mapper, agregat.
Zdjęcie mojego autorstwa, jako tło narzędzie IntelliJ IDEA – the Leading Java and Kotlin IDE.

