강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

kaq6822님의 프로필 이미지
kaq6822

작성한 질문수

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

회원 애플리케이션 기능 추가

같은 계층에서의 의존성 관리 질문

해결된 질문

작성

·

147

0

안녕하세요 Toby!

먼저 좋은 강의 올려주셔서 감사 말씀 드립니다.

열심히 강의를 듣던 와중에 궁금한 점이 있어서 질문드립니다.

 

  1. 회원 애플리케이션 기능 추가 강의에서 보면,

MemberModifyService 클래스에서 MemberFinder 빈을 주입받아 사용하도록 구현해주셨습니다.

 

관련해서 같은 application 계층에서 서로 DI 받는 구조로 구성하게 될 경우, 발생하는 순환 참조와 같은 문제점들에 대해서는 어떻게 관리하는게 좋을까요?

 

그리고 그런 문제점이 발생하지 않도록 예방하기 위해서는 어떤 방법이 있을까요?

답변 2

0

토비님의 프로필 이미지
토비
지식공유자

다른 모듈에서 순환참조는 여러가지 문제를 일으키니 피해야 합니다. 그래서 패키지 레벨의 순환참조 같은 것을 피해야 합니다.

다만 같은 회원 애그리거트, 헥사곤 안에서 구현이 같은 애플리케이션의 인터페이스를 참조하는 것은 문제가 되지 않기도 합니다. 그럼에도 변경이 일어나는 쪽에서 조회를 참조하는 구조로 만드는 것이 안전합니다. 보통 반대로는 참조가 안 일어나기 때문이죠. 조회 로직에서 변경 로직을 참조할 이유는 없으니까요.

애플리케이션이나 애그리거트가 달라지는 경우에는 순환참조가 일어나지 않도록 의존 관계를 적절하게 조절해서 단방향으로만 참조되게 만드는 것이 좋습니다. 만약 양방향 참조가 존재한다면 설계를 변경해서 이를 풀어낼 수 있습니다. 최종적으로 DIP를 써서 의존관계의 역전을 가져올 수도 있습니다.

다만, 스프링 빈의 순환참조는 구현 클래스의 생상자 주입에서 빈 생성에서 문제를 일으키기도 합니다. 이것도 케이스에 맞게 설계를 변경하거나, 우리가 손댈 수 없는 외부 컴포넌트 또는 레거시 코드 사이에서 일어나는 의존관계 주입 방식을 변경해서 풀 수도 있습니다.

근본적으로 애플리케이션 계층 사이에서 의존한다고 순환참조가 무조건 발생하지는 않습니다.

0

안녕하세요, 인프런 AI 인턴입니다. kaq6822님!

같은 계층 내에서 서로 의존하게 되면 순환 참조(Circular Dependency) 문제가 발생할 수 있습니다. 이는 두 개 이상의 빈이 서로를 필요로 할 때 발생하며, 스프링 애플리케이션이 제대로 시작되지 못하게 합니다. 순환 참조 문제를 해결하고 예방하기 위한 몇 가지 방법을 소개해드리겠습니다.

  1. 구조의 재검토: 우선, 전체적인 아키텍처 구조를 점검하여 순환 참조가 발생할 수 있는 부분을 찾고 개선합니다. 클래스 간의 책임이 명확히 구분되어 있는지 확인하고, 불필요한 의존성을 최소화하도록 합니다.

  2. 인터페이스 사용: 인터페이스를 통해 두 클래스를 느슨하게 결합할 수 있습니다. 이를 통해 클래스 간의 직접적인 참조를 피하고, 구현이 아닌 추상화에 의존하도록 합니다.

  3. 롤백 방법: 순환 참조가 발생하는 경우에는 필드 주입보다 생성자 주입을 사용하는 것이 문제를 더 쉽게 발견하는 데 도움이 됩니다. 생성자 주입은 스프링이 자동으로 던져주는 순환 참조 예외를 통해 문제점을 명확히 드러낼 수 있습니다.

  4. 새로운 계층 생성: 순환 참조를 막기 위한 또 다른 방법은 공통적인 로직을 별도의 서비스나 유틸리티 클래스로 추출하여 사용하는 것입니다. 이를 통해 같은 계층 내에서 발생할 수 있는 직접적인 참조를 줄일 수 있습니다.

또한, 기존 답변 중 유사한 내용을 다루고 있는 몇 가지 링크를 추천드립니다:

이러한 방법들을 통해 순환 참조 문제를 관리하고 예방할 수 있습니다. 방법을 적용해 본 후에도 궁금한 점이나 해결되지 않는 문제가 있다면 이어서 질문해 주세요. 지식공유자께서 따로 답변해 주실 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

kaq6822님의 프로필 이미지
kaq6822

작성한 질문수

질문하기