Développement piloté par domaine avec Java et Spring Boot-Layer et division de modules

À propos du développement piloté par domaine

Comme son nom l'indique, le développement axé sur le domaine n'est pas seulement un modèle de mise en œuvre, mais une méthode de développement qui implique des membres autres que le personnel de développement.

Pourquoi diviser en 3 couches

Dans la conception du développement piloté par domaine, le logiciel est conçu dans les trois couches suivantes.

--Couche d'application --Couche de domaine

Pourquoi faites-vous une telle division? Soudainement, le développement de la version de l'application mobile peut démarrer, et soudainement la base de données peut ne plus être un RDB. Dans un tel cas, ce qui peut être réutilisé entre des logiciels du même domaine est la connaissance du domaine, et ce qui inclut cela, c'est la couche de domaine.

** Couche d'application **

--Fonction principale

** Couche de domaine **

--Service de domaine --Entité

** Couche infrastructure **

--Dépôt

Vous pouvez voir que la classe d'implémentation du référentiel est la couche d'infrastructure. Mais pourquoi l'interface est-elle une couche de domaine? En effet, si une interface est une couche d'infrastructure, l'implémentation de la couche de domaine qui l'appelle dépendra inévitablement de la couche d'infrastructure. En d'autres termes, vous ne pourrez pas sélectionner la bibliothèque d'infrastructure à utiliser.

Points forts de Spring DI

Il a expliqué que l'interface du référentiel est placée dans la couche domaine afin que la couche domaine ne dépende pas de la couche infrastructure. Alors, où initialisez-vous une instance du référentiel contenant des connaissances d'implémentation? En pensant simplement, il semble qu'il n'y ait pas d'autre choix que de l'initialiser au niveau de la couche application et de le propager au service de domaine. Cependant, si vous utilisez Spring DI et déclarez une classe d'implémentation en tant que composant qui hérite de la classe et de l'interface du service de domaine, Spring DI résoudra ce problème. Il n'est pas nécessaire de préparer un modèle Factory ou ʻApplicationContextAware`.

@Repository
public class Repository extends IRepository {
  ...
}

Utilisez le constructeur @ Autowired au lieu du champ @ Autowired pour résoudre la dépendance. Cela facilite la rédaction de tests unitaires. Il peut être écrit plus facilement avec @ RequiredArgsConstructor de Lombok.

@Service
@RequiredArgsConstructor
public class Service {
  private final IRepository repository;
}
IRepository mockRespository = new MockRepository();
var service = new Service(mockRespotory);

Division du module

J'ai écrit que le logiciel a été conçu en trois couches, mais le module Maven doit-il également être divisé en trois couches? Si le logiciel est unique, il suffit de le diviser en packages.

Au contraire, lors de la division du module, préparez un module parent

/pom.xml


<modules>
  <module>./web</module>
  <module>./mobile</module>
  <module>./domain</module>
  <module>./infrastructure</module>
</modules>

Comme

/application/pom.xml


<parent>
  <groupId>me.yong_ju.application</groupId>
  <artifactId>parent</artifactId>
  <version>...</version>
  <relativePath>../</relativePath>
</parent>
...
<dependencies>
  <dependency>
    <groupId>me.yong_ju.application</groupId>
    <artifactId>domain</artifactId>
    <version>...</version>
  </dependency>
  <dependency>
    <groupId>me.yong_ju.application</groupId>
    <artifactId>infrastructure</artifactId>
    <version>...</version>
  </dependency>
</dependencies>

Tu peux le faire. En définissant d'abord le module enfant dans le module parent, lorsque ce module est ajouté à la dépendance, il sera récupéré localement au lieu de dans le référentiel Maven. (Cependant, les versions doivent correspondre)

Définition de la configuration du ressort

Si vous divisez le package en trois couches, vous rencontrerez immédiatement un problème. C'est parce que nous mettons @ SpringBootApplication dans le package d'application, de sorte que l'analyse des composants de Spring n'injecte que les composants de la couche application.

Que faire. Vous pouvez utiliser scanBasePackages pour modifier les paquets que vous souhaitez numériser vers la couche supérieure, mais nous ne le recommandons pas.

Ici, nous avons décidé de préparer une classe de configuration avec l'analyse des composants activée dans la couche de domaine et la couche d'infrastructure, et explicitement @ Importer la configuration utilisée par l'application.

@Configuration
@ComponentScan
public class DomainConfiguration {
  ...
}
@Configuration
@ComponentScan
public class InfrastructureConfiguration {
  ...
}
@SpringBootApplication
@Import({ DomainConfiguration.class, InfrastructureConfiguration.class })
public class Application {
  ...
}

Anti-motif

Le service est une unité de ressources

Un modèle dans lequel un service que vous voyez souvent est devenu simplement un wrapper pour le référentiel. Il doit être entretenu dans des unités opérationnelles significatives, et s'il n'est pas encore connu, il est encore plus rapide de le transformer en service. (En relation avec cela, je vois souvent des modèles qui ont été «@ transactionnels» dans une unité d'opération complètement dénuée de sens.)

Trop particulier sur les modèles de montage

Je pense personnellement que les modèles de mise en œuvre sont généralement un outil pour arrêter la réflexion tout en évitant les erreurs de conception fatales dans le développement de logiciels avec de mauvaises perspectives de planification. Par conséquent, perdre du temps à errer à la recherche des meilleures pratiques pour quoi que ce soit est un gâchis. Et Java et ses frameworks périphériques sont en constante évolution. Dans certains cas, ils peuvent être utilisés pour une mise en œuvre moins redondante et plus sûre.

Si j'ai du temps libre, je me concentrerai sur ce que j'ai mis du temps à comprendre.

Recommended Posts

Développement piloté par domaine avec Java et Spring Boot-Layer et division de modules
Déploiement à chaud avec le développement Spring Boot
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
[Java] Intégration LINE avec Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Comparez Hello, world! Avec Spring Boot avec Java, Kotlin et Groovy
HTTPS avec Spring Boot et Let's Encrypt
Démarrez le développement d'applications Web avec Spring Boot
Construction de l'environnement de développement Java Spring Boot + Docker
Distributeur automatique fabriqué avec Java (piloté par domaine)
[Java] Hello World avec Java 14 x Spring Boot 2.3 x JUnit 5 ~
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Créer un environnement de développement Spring Boot avec docker
Télécharger avec Spring Boot
Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot
Changer d'environnement avec Spring Boot application.properties et l'annotation @Profile
[Java] [Spring Boot] Spécifier le profil d'exécution --Spring Boot à partir de NetBeans
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
Spring Boot avec les paramètres du filtre de sécurité Spring et les points addictifs
Jusqu'à ce que vous commenciez à développer avec Spring Boot dans eclipse 1
Jusqu'à ce que vous commenciez à développer avec Spring Boot dans eclipse 2
Tentative de SSR Vue.js avec Spring Boot et GraalJS
Connectez Spring Boot et Angular en toute sécurité avec OpenAPI Generator
[Java] Développement avec plusieurs fichiers en utilisant package et import
Créer un environnement de développement Java + Spring avec VirtualBox + Ubuntu (Xfce4)
Utiliser des couches Lambda avec Java
[Java / Kotlin] Traitement d'échappement (désinfection) pour HTML5 avec unbescape [Spring Boot]
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Configuration Java avec Spring MVC
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Bonjour tout le monde avec Spring Boot!
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
[Java] Thymeleaf Basic (Spring Boot)
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Jusqu'à INSERT et SELECT sur Postgres avec botte de printemps et feuille de thym
Comment appeler et utiliser l'API en Java (Spring Boot)
Application Java CICS-Run - (4) Application Spring Boot
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
[Java] [Spring] Spring Boot 1.4-> 1.2 Note de rétrogradation
Créer un micro service avec Spring Boot
Présentation de Spring Boot2, un framework Java pour le développement Web (pour les débutants)
Envoyer du courrier avec Spring Boot
Créer un environnement de développement Web APP avec Java + Spring avec Visual Studio Code
[Java] Exemple de projet de développement d'applications Web avec Spring Boot
Développement facile d'applications Web avec STS et Spring Boot. Dans 10 minutes.
Comparaison du développement d'applications WEB avec Rails et Java Servlet + JSP
Image de l'application Spring Boot à l'aide de jib-maven-plugin et lancez-la avec Docker