diff --git a/application-test/app-test/pom.xml b/application-test/app-test/pom.xml
index e3ad73ad..814f1e44 100644
--- a/application-test/app-test/pom.xml
+++ b/application-test/app-test/pom.xml
@@ -73,6 +73,14 @@
test
+
+ com.tngtech.archunit
+ archunit-junit5-engine
+ 0.12.0
+ test
+
+
+
org.junit.vintage
junit-vintage-engine
diff --git a/application-test/app-test/src/main/java/com/example/apptest/member/DefaultMemberService.java b/application-test/app-test/src/main/java/com/example/apptest/member/DefaultMemberService.java
new file mode 100644
index 00000000..a61637aa
--- /dev/null
+++ b/application-test/app-test/src/main/java/com/example/apptest/member/DefaultMemberService.java
@@ -0,0 +1,32 @@
+package com.example.apptest.member;
+
+import com.example.apptest.domain.Member;
+import com.example.apptest.domain.Study;
+import com.example.apptest.study.StudyService;
+
+import java.util.Optional;
+
+public class DefaultMemberService implements MemberService{
+
+ StudyService studyService;
+
+ @Override
+ public Optional findById(Long memberId) {
+ return Optional.empty();
+ }
+
+ @Override
+ public void validate(Long memberId) {
+ studyService.openStudy(new Study());
+ }
+
+ @Override
+ public void notify(Study newStudy) {
+
+ }
+
+ @Override
+ public void notify(Member member) {
+
+ }
+}
diff --git a/application-test/app-test/src/test/java/com/example/apptest/study/ArchTests.java b/application-test/app-test/src/test/java/com/example/apptest/study/ArchTests.java
new file mode 100644
index 00000000..8113a0f5
--- /dev/null
+++ b/application-test/app-test/src/test/java/com/example/apptest/study/ArchTests.java
@@ -0,0 +1,53 @@
+package com.example.apptest.study;
+
+import com.tngtech.archunit.core.domain.JavaClasses;
+import com.tngtech.archunit.core.importer.ClassFileImporter;
+import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
+import com.tngtech.archunit.lang.syntax.elements.ClassesShouldConjunction;
+import com.tngtech.archunit.library.dependencies.SliceRule;
+import com.tngtech.archunit.library.dependencies.SlicesRuleDefinition;
+import org.junit.jupiter.api.Test;
+
+public class ArchTests {
+
+ @Test
+ void packageDependencyTests_4() {
+ JavaClasses classes = new ClassFileImporter().importPackages("com.example.apptest");
+
+ SliceRule freeOfCycles = SlicesRuleDefinition.slices().matching("..apptest.(*)..")
+ .should().beFreeOfCycles();
+
+ freeOfCycles.check(classes);
+ }
+
+ @Test
+ void packageDependencyTests_3() {
+ JavaClasses classes = new ClassFileImporter().importPackages("com.example.apptest");
+
+ ClassesShouldConjunction studyPackageRule =
+ ArchRuleDefinition.noClasses().that().resideOutsideOfPackage("..study..")
+ .should().accessClassesThat().resideInAPackage("..study..");
+
+ studyPackageRule.check(classes);
+ }
+
+ @Test
+ void packageDependencyTests_2() {
+ JavaClasses classes = new ClassFileImporter().importPackages("com.example.apptest");
+
+ ClassesShouldConjunction memberPackageRule = ArchRuleDefinition.noClasses().that().resideInAPackage("..domain..")
+ .should().accessClassesThat().resideInAnyPackage("..member..");
+
+ memberPackageRule.check(classes);
+ }
+
+ @Test
+ void packageDependencyTests() {
+ JavaClasses classes = new ClassFileImporter().importPackages("com.example.apptest");
+
+ ClassesShouldConjunction domainPackageRule = ArchRuleDefinition.classes().that().resideInAPackage("..domain..")
+ .should().onlyBeAccessed().byClassesThat().resideInAnyPackage("..study..", "..member..", "..domain..");
+
+ domainPackageRule.check(classes);
+ }
+}