Spring Boot i clean code

0

Mam pytanie jak podejść z punktu widzenia czystego kodu do następującego zadania:

Mamy tabele załóżmy User z polami: id, name, username, password, registerDate. Mam również dla niej typowe repository:

public interface UserRepository extends CrudRepository<User, Long> {
}

Teraz zadanie polega na tym, że nowa usługa RESTowa musi mieć na wejściu name użytkownika, a zwrócić obiekt z: username i registerDate. Jak to zrobić "najpoprawniej"? Zaimplementowałem następujące rozwiązanie:

  1. Tworzę osobną klasę UserResponse (pewnie nazwa do doprecyzowania, ale na tą chwilę przyjmijmy taką) z polami username i registerDate.
  2. W UserRepository dopisuję metodę:
public interface UserRepository extends CrudRepository<User, Long> {
    @Query("tutaj odpowiednie zapytanie")
    UserResponse findByName(String name);
}
  1. Tworzę nową klasę UserResponseController (jw, nazwa pewnie też do doprecyzowania).
  2. Wstrzykuję w niej UserRepository i wywołuję metodę userRepository.findByName("name").

Jest okej czy robię jakąś zakazaną rzecz dodając metodę o typie zwracanym UserResponse do UserRepository albo wstrzykując UserRepository do UserResponseController ?

1

Technicznie da się to osiągnąć, ale (1) nie ma takiej potrzeby i (2) są lepsze sposoby.

To co chcesz zrobić, to napisać zapytanie w JPA, które zamiast encji User zwrócić jakiegoś dtosa. Jednak:

Ad. 1. Możesz pobrać Usera po namie i na wyższym poziomie zmapować sobie tylko te pola, które potrzebujesz. Jeśli okaże się, że dochodzą jakieś pola, to może być wskazanie na rozbicie tego obiektu na 2 osobne obiekty domenowe.
Ad. 2. Czyściej byłoby robić szukajki korzystając z sqla (np. JOOQ, plain JDBC) zamiast rąbać to w JPA.

Jeśli chodzi o kwestie wstrzykiwania repo do kontrolera, to odsyłam do Clean Architecture i materiałów o Portach i Adapterach.

2

Generalnie ok, niech repozytorium zwraca ci obiekt domenowy a te klasy z JPA omijaj szerokiem łukiem. Poza CRUDami zwykle obiekt domenowy mapuje się do jakiegoś DTO przed wyrzuceniem na świat. Jakbyś zaorał tam to JPA, to pozbyłbyś sie przy okazji tych wszystkich zbędnych klas @Entity.

1 użytkowników online, w tym zalogowanych: 0, gości: 1