Association
연관은 한 객체가 다른 객체를 참조하거나 알고 있는 관계입니다. 객체지향 모델링은 객체 하나의 내부만 정의해서 끝나지 않고, 객체들이 서로 어떤 연결을 맺는지도 함께 설명해야 도메인을 제대로 담아낼 수 있습니다.
▶아키텍처 다이어그램
🔗 관계 다이어그램점선 애니메이션은 데이터 또는 요청의 흐름 방향을 나타냅니다
현실 문제는 거의 항상 객체 사이의 관계를 포함합니다. 주문은 고객과 연결되고, 댓글은 게시글에 속하고, 서비스는 다른 서비스의 도움을 받습니다. 이런 연결을 모델에 반영하지 않으면 코드는 실제 도메인에서 중요한 책임과 탐색 경로를 표현하지 못합니다.
객체지향 분석과 UML이 발전한 배경에도 시스템을 타입 목록이 아니라 관계의 네트워크로 보려는 요구가 있었습니다. 어떤 객체가 누구를 알고 있는지, 연결이 단방향인지 양방향인지, 얼마나 강한 결합인지가 설계 품질에 큰 영향을 주기 때문입니다.
연관은 보통 한 객체가 다른 객체의 참조를 필드로 들고 있는 형태로 구현됩니다. 단방향인지 양방향인지, 하나를 가리키는지 여러 개를 컬렉션으로 가지는지에 따라 구조가 달라집니다. 결국 연관은 데이터 하나를 더 들고 있느냐의 문제가 아니라 책임과 탐색 경로를 어디에 둘 것인가의 선택입니다.
연관은 가장 넓은 의미의 연결이고, 합성은 그중에서도 소유와 생명주기 결합이 훨씬 강한 특수한 관계입니다. 서로를 알고 메시지를 주고받는 정도라면 연관이고, 부분 객체가 전체 객체 없이 의미를 갖기 어려우며 함께 생성·소멸된다면 합성에 가깝습니다.
주문이 고객을 참조하고, 팀이 사용자를 보유하고, 컨트롤러가 서비스를 협력자로 갖는 구조는 모두 연관의 예입니다. 다만 양방향 참조를 무심코 늘리면 탐색은 쉬워질지 몰라도 의존 방향이 꼬이고 순환 참조가 생겨 변경과 테스트가 훨씬 어려워질 수 있습니다.