순환참조 끊자.

 
많은 개발자들은 순환 참조(Dependency Circles)가 해롭다는 것은 모두 다 알고 있다.
그런데 자신도 모르게, 일정에 쫓기고, 귀찮아서 등등의 핑계로 오늘도 순환 참조를 만들고 있다.
일단 순환 참조를 생성하는 이유는 접도록 하겠다.

이 이야기는 시작하면 끝이 없기 때문이다.그럼 주제에 맞게 순환 참조를 어떻게 하면 끊을 수 있을까?
순환 참조는 어떻게 생겼나? 한마디로 두개의 클래스가 서로 참조하고 있는 것을 말한다.
쉽게 설명하면 A 클래스는 B 클래스를 호출하고 B 클래스는 A 클래스를 호출한다.

순환참조-그림-1

실무에서 이런 경우는 정말 허다하다 못해 널렸다.
해결하는 방법은 아주 쉽다. 너무 쉽다.

1. B의 메소드를 선언한 C 인터페이스는 만든다.
2. B는 C의 구현체로 한다.
3. A는 C를 의존한다.
4. B가 참조하는 A의 메소드는 유지한다.

다시 그림으로 표현하면 아래의 그림과 같이 된다.

순환참조-그림-2

이렇게 디자인하면 순환 참조가 없어지게 된다. 야호!!

그런데 우리가 코딩을 하다보면 순환 참조가 필요할 때가 있다.
A에서 실제적으로 B의 참조가 필요한 경우를 말한다.
이럴때는 또 하나의 D 클래스를 생성해서 A와 B를 참조하여 이슈를 해결할 수 있다.

순환참조-그림-3.png

완.전.해.결!
위 그림은 우리가 이미 잘 알고 있는 Dependency Injection 이다.
이런 형태는 프레임워크가 없어도 언어 레벨에서 해결이 가능하다.
좀더 넓은 영역에서 바라본다면 클래스간 참조한다고 모두 순환 참조는 아니다.
하나의 패키지안에서 클래스간 순환 참조는 허용한다.
하지만 패키지가 다른 클래스가 참조하는 것과 Jar간 참조도 마찬가지 완전 피해자.

참고 : https://dzone.com/articles/breaking-dependency-cycles