본문 바로가기
기술도서/자바스프링 개발자를 위한 실용주의 프로그래밍

자바스프링 개발자를 위한 실용주의 5. 순환참조

by jasNote 2024. 11. 9.


순환참조는 두개 이상의 객체나 컴포넌트가 서로를 참조하면서 의존관계에 싸이클이 생기는 것을 의미한다. S/W 설계에서 자주 볼 수 있는 안티패턴이다. 우리는 순환 참조가 안티 패턴인 것을 알고 있음에도 다음과 같은 코드를 짠다.

  • JPA 양방향 매핑
    • ex) Team ↔︎ Member
  • Service Layer 간의 참조
    • ex) TeamService ↔︎ MemberService

Spring과 JPA를 사용하다 보면 흔히하는 실수이다.

 

순환참조의 문제점

무한루프

순환참조된 객체를 직렬화 하게 되면 무한루프에 빠진다.

Member객체 안 Team 직렬화 -> 
    Team안 Member직렬화 -> 
        Member객체 안 Team 직렬화 ->
            ... 반복

Json이 지원하는 어노테이션으로 해결 가능하지만 결과가 지저분해진다. 애초에 순환참조를 만들어 내지 않는 것이 중요하다.

 

시스템 복잡도

순환참조를 하게 되면 접근 진입 경로가 많아진다. 서로 참조하는 객체는 서로를 품고 있기 때문에 서로의 기능을 대신할 수 있다. 좋다고 이것이 좋다고 할 수 있을까?

@Entity Member -> 팀 전체 멤버의 월급 합계 조회
@Entity Team -> 팀 전체 멤버의 월급 합계 조회

위 예제를 보자. Member Entity와 Team Entity가 있고 서로를 참조하고 있다. 때문에 “팀 전체 멤버의 월급 합계 조회“를 둘 다 만들어낼 수 있다. 현실세계로 생각해보면 Member보다는 Team에서 해당 기능을 수행하는 것이 역할적으로 맞아 보인다. 하지만 진입점이 여러개면 Team이 아닌 Member에서 작성될 여지도 있다.

 

시스템은 방향을 가졌을 때 복잡도가 떨어진다.

 

 

 

참조

- https://recordsoflife.tistory.com/805

- https://www.youtube.com/watch?v=dJ5C4qRqAgA