Architektura aplikacji

0

Cześć.
Piszę pierwszą większą aplikację w Spring Boocie z wykorzystaniem relacyjnej bazy danych (obsługa JOOQ). Niestety utknąłem na części architektury projektu. Wytłumaczę może na przykładzie:

Mając 3 tabele: User, Role, Credentials mój user wyglądałby tak:

private int id;
..
..
private Credential credential;
private Collection<Role> roles;

Teraz:
W jaki sposób pobrać użytkownika z rolami ? Osobny serwis i repozytorium dla obsługi każdego wewnętrznego obiektu klasy User ?? (np RoleService, RoleRepository)

Kod do pobrania użytkownika wyglądałby tak (w pseudokodzie - klasa UserService):

// wstrzyknięte: credentialSevice, roleService, userRepository
public UserWithRolesDTO getUserWithRoles(CredentialDTO credentialDTO) {
  Credential credential = credentialSevice.findByLoginAndPassword(credentialDTO.getLogin(), credentialDTO.getPassword());
  User user = userRepository.findByCredentialId(credential.getId());
  Collection<Role> roles = roleService.findByUserId(user.getId());
  return JakisMapper.mapToUserWithRoles(user, roles);
}

Czy podejście w inny sposób, że 'zapytanie per funkcjonalność' czyli w klasie UserService - wywołuje 1 metodę np findByLoginAndPassword i w repozytorium joinuje potrzebne mi rzeczy :

// jestesmy w klasie UserService - ta sama metoda co wyżej napisana w inny sposób
public UserWithRolesDTO getUserWithRoles(CredentialDTO credentialDTO) {
  //wstrzyknięte: userRepository 
  UserWithRoles userWithRoles = userRepository.findByLoginAndPassword(credentialDTO.getLogin(), credentialDTO.getPassword());
  return JakisMapper.mapToUserWithRolesDTO(userWithRoles);
}

Przy czym w tym podejściu userRepository joinuje sobie odpowiednio Roles oraz Credentials (w 1 zapytaniu a nie w 3 tak jak u góry, gdzie osobno trzeba pobrać Credentials, osobno User i osobno Roles). Wydaje mi się, że to podejście jest bardziej 'zoptymalizowane' ale niestety niekiedy zapytania mogą się powtarzać (np tutaj wyszukuje Roles poprzez join, natomiast mógłby istnieć RoleService, który również by wyszukiwał role po idUżytkownika - i co wtedy ? podwojenie kodu..

Byłbym również otwarty na propozycje jakichś książek, artykułów, poradników dla nowoczesnych aplikacji w spring boocie (dobrze jak byłoby coś z jooqu bo wiadomo, że hibernate generuje wszystko)

0

JOOQ pozwala Ci wyciągać z bazy bezpośrednio do jakiś niemutowalnych POJO. https://www.jooq.org/doc/3.9/manual/sql-execution/fetching/pojos/
Dlatego nie ma zasadniczo sensu bawienie się w DTO i mappery - to są twoje DTOsy.
Czyli wyciągaj z bazy od razu to co potrzebujesz i wypuszczaj na zewnątrz. To nie JPA tu nie ma z tego niebezpiecznych konsekwencji.

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