IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Couplage entre la couche métier et DAO


Sujet :

Spring Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Couplage entre la couche métier et DAO
    Bonjour,

    J'ai pu voir des sujets ressemblant à ce qui suit mais soit datant d'avant 2007 ou bien sans vraiment de réponses claires.

    Dans le cadre de développement d'un projet spring / angular se pose la question de séparation des couches côté projet spring pour lequel il y a quelques débats dans notre équipe de dev (entre un architecte et différents développeurs plus ou moins expérimentés sur le fmk spring).

    On voit bien une séparation de couches qui est :
    Controller(API) / Service (métier) / DAO (persistance)
    mais la séparation ne satisfait pas l'architecte dès que l'on évoque le fait que l'objet manipulé dans les services métiers est la classe construite dans la couche DAO et reflétant la DB. Ce qui en effet a pour conséquence de provoquer un couplage métier <> DAO. Donc si un jour on change la structure des tables (split d'une table en 2, déplacements de données de santés vers autre DB, ...) cela induit une modification des classes persistantes et donc potentiellement impact côté couche métier.

    Pour la partie Controller on a opté pour une utilisation de DTO pour pouvoir maîtriser ce qui est transféré ou non avec la vue (exemple : afficher les données User sans le mot de passe...).

    La proposition de l'architecte serait grossomodo, si je prend un simple cas Person, d'en avoir 3 classes :
    PersonDTO : classe utilisée pour la manipulation côté Controller
    PersonModel : classe utilisée pour la manipulation côté métier
    PersonEntity : classe utilisée pour la persistance de données
    (les noms ne sont pas forcéments exhaustif mais pour un soucis de compréhension).

    De ce fait, chaque couche à sa propre modélisation d'une person et est donc indépendante, il y aura cependant nécessité de faire 2 phases de mapping :
    DTO > Model puis Model > Entity (et inversement).


    J'aurais donc voulu avoir votre opinion sur ce sujet pour "aider" à trancher.
    Qu'est-ce qui fait qu'avec le fmk Spring ou a ce (fort) couplage entre métier et DAO? Alors que durant les développements passés on s'efforçait de bien séparer les couches.
    Y a t-il une façon gérer par le fmk pour avoir un faible couplage ?
    ....

    Je ne suis pas forcément claire dans les questions, mais notre but à l'heure actuelle est de savoir si l'on part sur une solution à moitié maison pour un inclure une couche métier totalement indépendante ou bien de partir sur une solution classique avec ce risque de couplage.

    Merci d'avance pour vos réponses et votre aide.
    Si je n'ai pas été suffisamment clair n'hésitez pas à le faire savoir et je pourrais apporter précisions ou reformulation.
    Bonne soirée.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    La question est à mettre en parallèle avec le modèle en couche en réseau:
    https://fr.wikipedia.org/wiki/Couche_r%C3%A9seau

    De là, on en déduit le principe suivant: Je sais ce que tu fais, mais je ne veux pas savoir comment tu es codé.

    C'est entre autre pour ça que l'on injecte des interface (et non des classes). Entre autre, ça permet d'injecter d'autres implémentations (Design Pattern Stratégie).

    Les couches sont donc (en partant du haut):
    Contrôleur
    Service (avec objet métier DTO)
    DAO (avec objet métier Entité).

    En général, on enlève des informations de l'Entité au service.

    Enfin, la couche du dessus n'a conscience que la couche du dessous. La couche contrôleur ne sait pas que la couche DAO existe.

    Cordialement.

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Je ne suis pas un spécialiste de Spring mais de JEE, ceci dit, les 2 se ressemblent donc, je me permets de soumettre mon point de vue.

    Dans les applications web que nous construisons, le découpage ressemble un peu à ce que tu décris et la séparation est la suivante :

    - la couche IHM qui reçoit des DTOs de la couche métier qui est un EJB façade (pattern façade). Cette façade est exclusivement liée au besoins de l'application IHM, les DTOs sont donc eux aussi liés à l'application IHM.

    - la couche métier (l'EJB façade) couple les EJBs qui représentent les DAOs de base. C'est cette couche (la façade) qui transforme les DTOs en Entity et inversement via des méthodes du genre personne2DTOPersonne(Personne personne) et dtoPersonne2Personne(DTOPersonne dtoPersonne)

    - les EJB DAO manipulent les objets Entity


    Du coup, si les Entity étaient vouées à changer, seule la couche d'adaptation de la façade serait impactée, l'application IHM n'étant pas impactée.
    Il va de soi que ça fonctionne dans certaines limites de modifications, tant qu'on ajoute des colonnes optionnelles ou dont la valeur est connue pour les anciens enregistrements... il n'y a pas de solution miracle
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Personnellement j'ai appris ainsi :
    Nom : Archi.png
Affichages : 2003
Taille : 6,9 Ko

    De la droite à la gauche :
    - Ta DAO communique avec la BDD et instancie tes entités. (JpaRepository ...)
    - Ton Service connait ta DAO (via Autowired) et l'appel puis map ton métier en DTO.
    - Ton IHM connait ton Service (via Autowired) et l'appel pour récupérer les données au format DTO ( à voir si tu veux rajouter un couche en transformant ton metierDTO en metierIHM).

    Au final si tu fais un projet pour chaque partie :
    - Ton projet qui contient les entités connaît aucun autre projet.
    - Ton projet DAO connaît que ton projet Entités.
    - Ton projet Services connaît les projets DAO et Entités .
    - Ton projet IHM connaît que le projet Service.

    Voila pour mon point de vue .

  5. #5
    Membre actif
    Avatar de ryankarl65
    Homme Profil pro
    Data Engineer
    Inscrit en
    Juillet 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Data Engineer

    Informations forums :
    Inscription : Juillet 2013
    Messages : 104
    Points : 278
    Points
    278
    Par défaut
    Citation Envoyé par Badshade23 Voir le message
    Personnellement j'ai appris ainsi :
    Moi de même, chaque couche est un micro service ou parfois une application
    Shakespeare: "Je me sens toujours heureux, vous savez pourquoi...?
    Parce que je n'attends rien de personne... Les attentes font toujours mal, la vie est courte. Aimez votre vie, soyez heureux, gardez le sourire et souvenez vous: Avant de parler écoutez, Avant d'écrire réfléchissez, Avant de prier pardonnez, Avant de blesser considérez l'autre, Avant de déteste aimez... Et avant de mourir vivez"

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    Citation Envoyé par Badshade23 Voir le message
    Au final si tu fais un projet pour chaque partie :
    - Ton projet qui contient les entités connaît aucun autre projet.
    - Ton projet DAO connaît que ton projet Entités.
    - Ton projet Services connaît les projets DAO et Entités .
    - Ton projet IHM connaît que le projet Service.

    Voila pour mon point de vue .
    D'accord dans l'ensemble mais pourquoi découper en plusieurs projets ? Un simple découpage en packages et/ou modules devrait être suffisant (sauf pour l'UI évidement)

    Citation Envoyé par ryankarl65 Voir le message
    Moi de même, chaque couche est un micro service ou parfois une application

    C'est vraiment ce que tu as appris en cours ? Un peu de lecture additionnelle (par exemple https://martinfowler.com/articles/microservices.html) te ferait le plus grand bien à mon avis.

    Sinon pour de grosses applications, je conseille d'au moins jeter un coup d'oeil au DDD (Domain Driven Design). Même si ça peut être assez long à mettre en place, le découpage est très clair. Basiquement on a (je ne parle que du découpage, le DDD c'est plus que ça):
    -la couche Interfaces (HTTP, SOAP etc) qui utilise Application
    -la couche Application qui implémente les specs fonctionnelles en utilisant Domain (peut déclarer et appeler IMailer, IMessageQueue... mais n'appelle aucune api externe directement)
    -la couche Domain (entity, agregat, domain service, IRepository(~= DAO), IFactory), implémente le domaine métier du client, ne dépend de rien du tout (ne connais pas le format de bdd, ne connait aucune api externe)
    -la couche Infra (RepositoryImpl, MailerImpl...) qui implémente toutes les interfaces déclarées dans Interfaces, Application et Domain qui accèdent aux API externes. Aucun couche ne dépend explicitement d'Infra.

  7. #7
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par atha2 Voir le message
    D'accord dans l'ensemble mais pourquoi découper en plusieurs projets ? Un simple découpage en packages et/ou modules devrait être suffisant (sauf pour l'UI évidement).
    Exacte, il y a plusieurs possibilités. Actuellement justement j'en fais un avec plusieurs modules en utilisant Maven. Le principe après reste le même.

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/04/2012, 16h36
  2. Réponses: 0
    Dernier message: 20/04/2011, 15h07
  3. Réponses: 3
    Dernier message: 17/06/2009, 08h34
  4. Relation entre EJB, couche métiers, JSP et servlet
    Par infinity21 dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 05/03/2007, 23h50
  5. Couche métier = forcement EJB ?
    Par jothi35 dans le forum Java EE
    Réponses: 9
    Dernier message: 14/09/2004, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo