projektJJD - Mateusz Łukaszczyk

Projekt Display_Offers

Projekt grupowy

Tak się złożyło, że pierwszy większy projekt piszę w parze z Korwinem

Jak to się stało?

Jestem w grupie Junior Java Ready której należę dzięki Bartkowi. Na grupie dla początkujących programistów napisał, że będzie uczył, jak stworzyć swój pierwszy komercyjny projekt. Napisałem, zrobiłem wyznaczone przez niego zadanie, dostałem Code Review i pomyślałem – wchodzę w to!

No a co to za projekt?

Jego zadaniem jest wyświetlanie ofert pracy z danego klienta HTTP po określonymi API. W odpowiedzi będzie podawany określony JSON, który później będzie mapowany na nasze DTO.

Oferty będą zapisywane w bazie danych na MongoDB (NoSQL) oraz zabezpieczone przez Spring Security.

Baza danych zostanie wystawiona w kontenerze Dockerowym, a cache ma być zbierane przez Redisa.

Dodatkowo będzie obsługa JWT Tokena, aby były aplikacja była dodatkowo zabezpieczona.

Nastawienie

Problem polega na tym, że wydaje mi się to kompletnie odrealnione.

Ledwo co pisałem w bazach danych SQL. Wiem, jak zapisywać dane przez Hibernate, jednak to tyle. Nagle baza NoSQL, z której nigdy nie korzystałem. Docker, który jedynie kojarzy mi się z niebieskim wielorybem oraz Redis, o którym w ogóle nie słyszałem.

Ekscytacja, którą doznałem była ogromna. Jest kierunek i jest konkretny projekt do zrealizowania. Teraz wystarczy go zaimplementować.

Ważną kwestią jest, aby projekt był chociaż w 70-80% pokryty testami. 

Tu jest pies pogrzebany, bo moje umiejętności testowania są na poziomie… no wiem jak napisać test jednostkowy. Jako tako. Także na początku nie jest aż tak optymistycznie, ale trzeba być pozytywnej myśli. Jest problem to i rozwiązanie się znajdzie.

Opis drogi

Poniżej opiszę dni, w których powstała większa implementacja.

Jak do tego doszedłem, jakie były moje odczucia, co sprawiało mi największy problem i w jaki sposób znalazłem rozwiązanie.

Od pewnego czasu programowanie stało się dla mnie nie tyle co kodowaniem, a faktycznym rozwiazywaniem problemów.

Przygotowanie do projektu

Czy projekt rozpoczął się od tak? W życiu.

Najpierw skontaktowałem się z moim partnerem do programowania, po czym ustaliliśmy pierwszy termin. Poznaliśmy swoje repozytoria, umiejętności no i przede wszystkim nastawienie do samego projektu. Z racji, że bardzo często pracowałem z ludźmi i prowadzę sesję coachingowe, to chciałem poznać, jak najlepiej jego styl pracy, jak myśli i w jaki sposób możemy podzielić zadania.

Rozmowa przebiegła super. Natomiast przepaść, która nas dzieliła była z mojej perspektywy ogromna. Jak się okazuje, nie potrzebnie. Pracujemy razem i każdy wie coś, czego nie wie druga osoba. Uczymy się od siebie nawzajem.

26.03.2021 - Rozpoczęcie projektu

Na początku pełen entuzjazm. O wyznaczonej godzinie zdzwoniliśmy się do siebie i oboje stworzyliśmy konta na gitlabie. Projekt stworzył Korwin i rzucił na gitlaba. Pobieram cały projekt, sprawdzam czy wszystko u mnie działa i… problem.

Niesamowite, że już w pierwszej chwili coś poszło nie tak. Okazało się, że brakowało mi folderu. W takim razie ręcznie go dodałem i po sprawie.

Oboje daliśmy do .gitignore plik .iml.

Ostatecznie skończyliśmy na tym, że stworzyliśmy pakiety oraz prosty config. 

W momencie kiedy aplikacja odpalał się na moim i jego systemie uznaliśmy, że na tyle starczy. 

Teraz każdy może zająć się implementacją konkretnych rzeczy na swoich gałęziach.

Moim zadaniem było zaimplementowanie Controllera, a Korwina klienta HTTP.

01.04.2021 - Pierwsza wersja Controllera

Po kilku godzinach kodowania udało mi się stworzyć pierwszy wzór controllera. Działał, ale przez moje pomyłki musiałem go zmieniać.

Koniec końców zajęło mi to więcej czasu niż myślałem, ale i tak mniej niż gdybym uczył się tego od zera. 

DisplayOffersJJD - Mateusz Łukaszczyk

Trochę tych commitów było, ale wydaje mi się, że im więcej małych kroczków w danej gałęzi tym lepiej. Póki co nie mam jak tego zweryfikować.

Dobrze również, aby commitować zmiany, które mają sens.

Jest działający controller dałem cynk. Na tym etapie nie było zbyt dużo problemów.

Jedynie warto wspomnieć, że musiałem dodać trochę bibliotek, bo jakimś cudem ich w ogóle nie było podczas tworzenia projektu.

24.04.2021 - Implementacja testów Controllera

Implementacja testów wydawała mi się póki co najgorsza.

Nie wiedziałem, jak działają Mocki, jak tworzyć testy integracyjne oraz jak zrobić testy bez ruszania całego kontekstu Springa.

Przez pierwsze dni szukałem informacji, jak w ogóle działają Mocki, później starałem się zaimplementować pierwsze proby. Później znalazłem, że istnieje coś takiego, jak MockMvc. Znalazłem odpowiednie adnotacji do testowania Springa i ta wiedza wydawała mi się wystarczająca, aby w końcu je napisać.

1 próba:

Totalna klapa. Nic nie działa, nie wiem czemu i co jest nie tak. Czytam dalej i zmieniam na bieżąco kod. Dalej nie działa, nie rozumiem dlaczego. Tak to wyglądało przez najbliższe parę dni.

Zdesperowany odłożyłem testowanie na bok, aby realizować prostsze zadania na CodeWars.

Głowa mi się rozluźniła, czułem się pewniejszy, to po dwóch dniach wróciłem.

2 próba:

Z czystszą głową znowu zaczynam. Tym razem zacznę inaczej. Zacząłem zadawać sobie pytania:

  1. Czego dokładnie nie wiem?
  2. Co sprawia mi największy problem?
  3. W którym momencie nie potrafię wyjaśnić działania programu?
  4. Co może mi pomóc?

Szukałem dalej i zacząłem robić… notatki. Co robi adnotacja @SpringBootTest? Czym się różni od @WebMvcTest? czy adnotacja @ContextConfiguration musi być zawsze? Kiedy można ją opuścić?

Jeśli testuje to mogę wstrzykiwać zależności? Co tak naprawdę mogę przetestować i chcę?

Okej, teraz wiem więcej. Kolejna próba i kolejna klapa.

Poczułem się bezsilnie. Musiałem odpocząć.

3 próba:

Kolejna próba. Pisałem kilka aplikacji na CodeWars, dodatkowo próbowałem innych rozwiązań.

Wtedy coś do mnie dotarło. Przecież ja nie muszę testować każdego najmniejszego elementu. Przecież testuje, po to, aby sprawdzić czy dana funkcjonalność działa. Wystarczy przetestować jeden element. Skoro ma mi zwrócić konkretny obiekt to może warto sprawdzić czy nie jest pusty lub posiada taką samą klasę?

Może jeśli testujesz czy klient zwraca błąd to może lepiej sprawdzić czy nie zwraca kodu błędu np: 404?

Wtedy zacząłem pisać, okazało się to prostsze. 

Jeden test działa

Drugi test działa

Controller działa, Service działa, Exception działa. To przetestuje jeszcze z contextem i bez. ŚMIGA. Moje zadowolenie na twarzy kiedy, to zrozumiałem – bezcenne. 

Może być to dla wielu proste, jednak nie chodzi o trudność zadania, a o to jak sobie z nim poradzić. Na początku matematyka również jest trudna, dlatego należy dbać o fundamenty.

21.05.2021 - Mongock, Docker i MongoDB

Tyle co wiedziałem o MongoDB to, że jest nierelacyjna. Tyle co wiedziałem o Dockerze, to że tworzy obrazy, które można odtworzyć. 

Właściwie to tyle.

Dockera miałem już zainstalowanego na windowsie.

Zrobiłem następujące rzeczy:

  • Dodałem do Pom.xml biblioteki Spring Data.
  • Zmapowałem klasę Offer pod MongoDB na podstawie zamieszczonej. dokumentacji
  • Stworzyłem interfejs, który będzie przetrzymywał Oferty, dziedziczący po MongoRepository.
  • Dodałem do projektu Mongocka, aby baza danych była migrowana za każdym razem.
  • Dodałem changelog do ścieżki w properties’ach Mongocka wraz z jego konfiguracja z przykładowymi ofertami.
  • Aby migracja przebiegła potrzebny był plik docker-compose.yml – został skonfigurowany jak w dokumentacji.

Póki co jakoś to wygląda. Aż się zdziwiłem, że wszystko zadziałało tak szybko.

Przeczytaj również inne artykuły dotyczące programowania