작성
·
11
0
마지막 강의에서 진행한 헥사고날 아키텍처 테스트에서 저는 아래와 같이 에러가 발생하고 있는데 어떻게 수정을 해야 할까요? 소스 코드는 동일한 것 같은데... 무엇이 차이인지 모르겠어요 13:09:39.840 [Test worker] INFO com.tngtech.archunit.core.PluginLoader -- Detected Java version 17.0.12
Architecture Violation [Priority: MEDIUM] - Rule 'Layered architecture considering all dependencies, consisting of
layer 'domain' ('com.inflearn.splearn.domain..')
layer 'application' ('com.inflearn.splearn.application..')
layer 'adapter' ('com.inflearn.splearn.adapter..')
where layer 'domain' may only be accessed by layers ['application', 'adapter']
where layer 'application' may only be accessed by layers ['adapter']
where layer 'adapter' may not be accessed by any layer' was violated (1 times):
Method <com.inflearn.splearn.SplearnTestConfiguration.passwordEncoder()> calls method <com.inflearn.splearn.domain.member.MemberFixture.createPasswordEncoder()> in (SplearnTestConfiguration.java:19)
java.lang.AssertionError: Architecture Violation [Priority: MEDIUM] - Rule 'Layered architecture considering all dependencies, consisting of
layer 'domain' ('com.inflearn.splearn.domain..')
layer 'application' ('com.inflearn.splearn.application..')
layer 'adapter' ('com.inflearn.splearn.adapter..')
where layer 'domain' may only be accessed by layers ['application', 'adapter']
where layer 'application' may only be accessed by layers ['adapter']
where layer 'adapter' may not be accessed by any layer' was violated (1 times):
Method <com.inflearn.splearn.SplearnTestConfiguration.passwordEncoder()> calls method <com.inflearn.splearn.domain.member.MemberFixture.createPasswordEncoder()> in (SplearnTestConfiguration.java:19)
at com.tngtech.archunit.lang.ArchRule$Assertions.assertNoViolation(ArchRule.java:94)
at com.tngtech.archunit.lang.ArchRule$Assertions.check(ArchRule.java:86)
at com.tngtech.archunit.library.Architectures$LayeredArchitecture.check(Architectures.java:347)
at com.inflearn.splearn.HexagonalArchitectureTest.hexagonalArchitecture(HexagonalArchitectureTest.java:22)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at com.tngtech.archunit.junit.internal.ReflectionUtils.invoke(ReflectionUtils.java:111)
at com.tngtech.archunit.junit.internal.ReflectionUtils.invokeMethod(ReflectionUtils.java:103)
at com.tngtech.archunit.junit.internal.ArchUnitTestDescriptor$ArchUnitMethodDescriptor.execute(ArchUnitTestDescriptor.java:203)
at com.tngtech.archunit.junit.internal.ArchUnitTestDescriptor$ArchUnitMethodDescriptor.execute(ArchUnitTestDescriptor.java:173)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
inf025님께서 겪고 계신 문제는 헥사고날 아키텍처에 관한 테스트 시, 아키텍처 간 의존성 위반으로 인해 발생한 것으로 보입니다. 이 오류는 특정 레이어가 허용되지 않은 다른 레이어와 상호작용을 했기 때문입니다. 주어진 메시지에서, SplearnTestConfiguration.passwordEncoder()
메서드가 com.inflearn.splearn.domain.member.MemberFixture.createPasswordEncoder()
메서드를 호출하면서 위반이 발생하고 있습니다.
헥사고날 아키텍처는 각 레이어가 명확하게 분리되어 있어야 하며, 레이어 간의 의존성 규칙이 지켜져야 합니다. 특히, 도메인 레이어는 상위 레이어들(application, adapter 등)에서만 접근할 수 있어야 합니다. 이런 규칙을 위반하면 아키텍처 검증에서 실패합니다.
해결 방법:
레이어 의존성 확인: SplearnTestConfiguration.passwordEncoder()
가 createPasswordEncoder()
를 호출하지 않도록 변경해야 합니다. 비즈니스 로직과 테스트 구성은 명확히 분리되어야 합니다. 이로 인해 dependency injection 방식 또는 다른 방법을 사용할 수 있습니다.
Mock 객체 사용: 테스트 시에는 실제 객체 대신 모킹(Mocking)된 객체를 사용하는 것이 좋습니다. 이를 위해 Mockito
등을 활용하여 createPasswordEncoder()
에 대한 모킹 객체를 만들어 사용해보세요.
구성 설정 분리: SplearnTestConfiguration
이 실제 비즈니스 로직에 접근하지 않도록, 테스트 전용 설정을 분리되게 구성하는 것이 필요합니다.
또한 다른 수강생들이 유사한 상황을 겪은 사례가 있으니 아래 게시물을 참고하세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.