가이드라인: 등록 연관
주제
일부 경우에서 한 객체는 다른 객체에서 발생하는 특정 이벤트에 따라 달라집니다. 이벤트가 경계 또는
제어 객체 내에서 발생하면 이 객체는 발생한 내용을 다른 객체에 단순히 알려줍니다. 그러나 이벤트가 엔티티 객체 안에서
발생하면 상황은 다소 다릅니다. 엔티티 객체에게 다른 객체로 해당 내용을 통보하도록 명확하게 요청하지
않으면 엔티티 객체는 다른 객체에게 아무 것도 알리지 못할 수 있습니다.
예
은행 계정에서 이체를 통한 현금 인출 확률을 사용하여 시스템을 모델링했다고
가정하십시오. 시도된 인출이 계정에 잔고 부족을 발생시키면 통지서를 즉시 작성하여 고객에게 보내야
합니다. 엔티티 객체로 모델링된 계정은 고객이 통지서를 받았는지 여부와 관련되지 않아야 합니다.
대신 경계 객체에서 고객에게 통지해야 합니다.
위의 예에서 경계 객체는 엔티티 객체에 반복적으로 "대기 중인 이벤트가 발생했는가?"라는
질문을 보내야 합니다. 상황을 명확하게 하고 구현 세부사항을 설계 단계까지 연장하기 위해
이 요구사항을 나타내는 데 사용되는 특수한 연관인 등록 연관이 있습니다.
임의 유형의 객체를 엔티티 객체와 연관시키는 등록 연관은 엔티티 객체에서 특정 이벤트가 발생할 때
연관 중인 객체에 알려주도록 명시하고 있습니다. 연관에 대한 요구를 발생시키는 엔티티 객체의 수동적 특성
때문에 이 연관만을 사용하여 엔티티 객체를 연관시키는 것이 좋습니다. 한편, 인터페이스 객체와 제어 객체는
모두 의사소통을 시작할 수 있습니다.
따라서 해당 객체는 "등록될" 필요는 없지만 다른 방식으로 해당 책임을 수행할 수 있습니다.

등록 연관은 임의 유형의 객체를 엔티티 객체와 연관시킵니다. 연관된 엔티티
객체에서 특정 이벤트가 발생하면 연관 중인 객체에 알려줍니다.
연관 방향을 통해 등록 중인 객체가 두 개 객체 사이의 관계를 인식하고 있음을
알 수 있습니다. 등록 설명은 등록 중인 객체 안에만 있습니다. 다음으로 연관된 엔티티 객체도
다른 객체가 해당 활동에 관심을 가질 수도 있다는 것을 고려하지 않고 일반적인 방법으로 정의됩니다. 또한
이러한 방식은 등록 대상 객체를 변경시키지 않으면서 등록 중인 객체를 모델에 추가하거나 이 모델에서 제거할
수 있다는 것도 암시합니다.
등록 연관에는 연관 중인 객체에서 동시에 연관이 가능한 대상 지정된 객체의 인스턴스 수를 표시하는
다양성이 지정됩니다. 그런 다음 연관 중인 객체에 알려줄 수 있도록 발생해야 하는 내용을 표시하는
하나 이상의 조건을 해당 연관에서 설명합니다. 이벤트는 연관이나 속성의 값 또는 조작 평가(또는 일부분)에서의
변경일 수도 있습니다. 이벤트가 발생하면 특정 상황이 발생했음을 등록 중인 객체에 알려주게 됩니다. 이벤트의
결과와 관련된 정보를 전송하는 것이 아니라 이벤트가 발생했다는 사실만 전송합니다. 연관 중인 객체가 이벤트 발생 후
결과로 나타나는 엔티티 객체 상태에 관심이 있더라도 일반적인 방법으로 엔티티 객체와 상호 작용할 필요는 없습니다. 이는
마찬가지로 링크가 필요하다는 것을 의미합니다.
예
창고 자동화 시스템에서 팔레트의 예상 수명을 측정하려면 임의 추출 검사를
수행해야 합니다. 따라서 창고의 한 장소에서 다른 장소로 100번째 팔레트 이동 시마다 특별 테스트 장소에서
팔레트를 검사합니다. 이 경우는 팔레트 임의 추출 검사기 제어 클래스에서 팔레트 엔티티 클래스까지 등록 연관으로
모델링합니다. 팔레트의 각 인스턴스에서는 카운터 속성을 사용하여 이동 횟수를 산정합니다. 팔레트가
100회 이동하면 등록 연관의 조건에 따라 팔레트 임의 추출 검사기에 알려줍니다. 그러면 팔레트 임의 추출 검사기에서
특별한 타스크를 작성하여 해당 팔레트를 테스트 장소로 이동시킵니다. 팔레트 임의 추출 검사기에는
팔레트에 대한 링크가 전혀 필요하지 않지만 타스크를 시작하도록 해당 타스크에 대한 하나의 링크는 있어야 합니다.

팔레트가 100회 이동한 후 팔레트 임의 추출 검사기에서 새 타스크를 작성합니다.
등록 연관의 조건은 특정 속성 또는 조작이 아니라 추상적 특성으로 명시되어야 합니다. 이 방식에서
연관 중인 객체가 쉽게 변경될 수 있는 연관된 엔티티 객체 컨텐츠와는 별개로 유지됩니다.
등록 연관이 항상 두 개의 객체 인스턴스를 연관시키는 것은 아닙니다. 또한 클래스에서 인스턴스로 연관인
메타 관계도 유효합니다. 이러한 메타 관계는 다음 서브 섹션에서 설명합니다. 여기에서는 예를 들어, 특정 이벤트가
클래스의 인스턴스로 되는 것처럼 객체의 클래스가 등록 연관을 통해 연관되는 경우도 있습니다.
때때로 엔티티 객체에서 이벤트가 발생하는 경우 경계 객체에 알려야 합니다. 이 경우 등록 연관을 호출합니다.
예
이체를 통한 은행 계정에서 현금 인출을 고려하십시오. 여기에서는 계정 엔티티 객체에
대한 조작을 수행하는 이체 핸들러 제어 객체가 있습니다. 계정에 잔고가 부족하면 통지서 작성기 경계 객체에서
작성하는 통지서를 고객에게 보내게 됩니다. 따라서 이 객체는 계정에 대해 등록 연관을 가지고
있습니다. 확인된 조건은 잔고가 0 이하로 내려간다는 것입니다. 이 이벤트가 발생하는 즉시 통지서 작성기에
통보됩니다. 통지서 작성기 인스턴스가 지속적으로 계정 인스턴스에서 초과 인출을 감시하고 있기 때문에
이러한 특정 등록 연관은 인스턴스 연관이 됩니다.
고객이 자신의 잔고가 부족하다는 정보만 받는 경우라면 이 방법으로도 충분합니다. 그러나
얼마나 부족한지도 통보 받아야 하는 경우 통지서 작성기에서 계정에 대한 조작을 수행하여
정확한 금액을 인식해야 합니다. 이렇게 하려면 통지서 작성기가 계정에 링크되어야 합니다.

통지서 작성기 경계 클래스는 계정 엔티티 객체에서 특정 레벨 이하로 잔고가 떨어지는
이벤트를 등록합니다. 또한 통지서 작성기에서 정확한 부족 금액을 알고 있어야 하는 경우 계정과 링크되어야 합니다.
경계 클래스로부터 메타 연관의 예는 한 엔티티 객체의 이벤트가 발생할 때 새로운 창이 사용자에게 나타나는
경우입니다. 그러면 인터페이스 객체 클래스가 엔티티 객체의 인스턴스에 등록됩니다.
예
네트워크를 처리하는 시스템에는 네트워크의 노드로서 기능을 수행하는 스테이션과
이를 연결하는 회선이 있습니다. 각 스테이션은 다수의 회선을 통해 다른 스테이션에 연결됩니다. 스테이션의
용량은 기능을 수행하는 회선의 수로 결정됩니다. 전체 회선 중 80%를 초과하여 기능을 수행하는 경우 스테이션의
용량이 크고, 20% 미만이면 용량이 작은 것이며, 이 두 개 값을 포함하는 범위 안에 있으면 용량은 중간입니다. 이
시스템 모델에서 두 개의 엔티티 객체(스테이션 및 회선)가 있으며, 여기서 스테이션은 회선에 대한 등록 연관을 가지고
있습니다. 이 연관의 조건은 사용 가능하거나 사용 불가능할 수 있는 회선의 상태가 변경되면 스테이션에 알려주어야
한다는 것입니다.
더욱이 스테이션의 용량이 적으면 스테이션에 등록하는 제어 객체에게도 알려주게
됩니다. 이 경우는 다음과 같이 설명되며, 여기서의 이 예가 계속 진행됩니다.

회선의 인스턴스 중 하나가 상태 변경되는 대로 즉시 스테이션 인스턴스에 알립니다.
관계되는 것이 일반적으로 이미 존재하는 인스턴스이므로 엔티티 클래스 간 등록 연관은 거의 항상
인스턴스 연관이 됩니다. 그러나 연관된 엔티티 객체에서 지정된 이벤트가 발생하면 등록 중인 엔티티 객체의
인스턴스가 작성되는 경우가 존재할 수 있습니다. 이 경우에서 연관은 클래스에서 인스턴스로 진행합니다.
즉, 메타 연관인 것입니다. 또한 특정 엔티티 객체의 인스턴스에서 다른 엔티티 객체의 새로운 인스턴스가
작성되는 경우를 알려고 한다고 상상할 수도 있습니다.
예
위의 예에서 스테이션 엔티티 객체는 회선 엔티티 객체에 대한 등록 연관을
가지고 있습니다. 따라서 회선 인스턴스의 상태가 변경될 때마다 스테이션에 알립니다. 이러한
상태 변경은 스테이션의 용량을 변경하게 됩니다. 용량이 적어 회선의 20% 미만으로 기능을 수행하면
시스템에서 이 스테이션을 피해 네트워크를 통과하는 적합한 새 방법을 찾아야 합니다. 물론 이 작업은
스테이션에 해당하는 타스크가 아니지만, 스테이션의 각 인스턴스에 대한 등록 연관을 가지고 있는 스테이션
감시자 제어 객체를 통해 수행해야 합니다.

스테이션 감시자 제어 객체가 스테이션 엔티티 객체에 등록되며, 그 다음에
스테이션 엔티티 객체가 회선 엔티티 객체에 등록됩니다.
제어 객체로부터 등록 연관은 매우 빈번하게 클래스에서 인스턴스로의 연관 또는 그 반대 경우의 연관인 메타 연관이 됩니다.
보통 이벤트가 실제로 발생한 후에야 엔티티 객체에서 해당 이벤트를 처리할 제어 객체의 인스턴스가
작성됩니다. 예를 들어, 한 제어 객체의 인스턴스가 특정 엔티티 객체의 새 인스턴스가 작성되는 경우를
알려고 한다고 상상할 수 도 있습니다. 따라서 극히 일부의 경우에 등록 연관은 인스턴스 연관이 될 수 있습니다.
예
위의 예에서 스테이션 감시자로부터 스테이션으로의 등록 연관에는 메타 연관의 특성이 있습니다.
즉, 스테이션의 용량이 줄어들면 스테이션 감시자 클래스에게 알려줍니다. 스테이션 감시자가 이러한
메시지를 수신하면 해당 이벤트를 처리하는 인스턴스를 작성합니다.
|