Mam aplikację, która odczytuje dane z bazy danych. Dane przechodzą w taki sposób: DAO -> Service -> Controller.
Taki flow jest dobry tylko dla typowych aplikacji CRUDowych i na sam początek edukacji powinien wystarczyć. Dobrą praktyką jest oddzielanie obiektów domenowe od obiektów pojo wyciąganych z bazy danych. Model nie powinien być kalką bazy danych.
Service jest tylko do przerzucania danych z DAO do Controllera, aby nie było bezpośredniego połączenia DAO -> Controller, tak ?
Patrzysz na problem od złej strony. Takie połączenie Controller -> DAO jest wykorzystywane we wzorcu CQRS i jest ono jak najbardziej ok. W całej tej zabawie z Controllerami, DAO chodzi o to by odseparować od siebie pewne części aplikacji, by można było łatwiej przeglądać i rozwijać kod.
Jeśli chcę odczytać dane z dwóch tabeli to robię to w Controllerze używając dwóch Services, czy gdzieś indziej ?
Serwis nie powinien być zależny od ilości tabelek w bazie danych, co znaczy, że może korzystać z wielu DAO. Staraj się, żeby Serwisy były dobrze zdefiniowane i nie robiły za dużo.