[Salesforce] Relationship in Salesforce

IamMilo·2024년 4월 29일


RDMBS에서 관계를 통해 연관성이 있는 엔터티의 연관성을 정의하듯이, Salesforce에서도 Custom Relationship Fields를 생성함으로써 Object 사이의 관계를 정의할 수 있습니다.

스탠다드 오브젝트 중 대표적인 관계의 예시는 Account와 Contacts의 관계를 예시로 들 수 있습니다.

Account의 레코드를 하나 조회해서 Related 탭을 살펴보면 Contacts 레코드도 함께 조회할 수 있는 걸 볼 수 있습니다.


Schema Builder를 통해서도 두 Object 사이에 'Lookup Relationship'이 존재하고 Contact가 Account Name을 FK로 갖고 있는걸 볼 수 있습니다.

Relationship Fields의 종류

Lookup Relationship (조회 관계)

  • 특징: 가장 기본적인 관계 유형으로, 두 객체 간의 관계를 정의할 때 사용됩니다. 이 관계를 통해 한 객체의 레코드가 다른 객체의 단일 레코드를 참조할 수 있습니다.
  • 용도: 일대일 또는 일대다 관계를 설정할 때 사용됩니다. 예를 들어, 한 고객이 여러 주문을 할 수 있지만, 각 주문은 하나의 고객에게만 속할 수 있습니다.
  • 제한사항:
    • 조회 관계는 필수로 설정할 필요가 없으며, 참조하는 레코드가 삭제되면 참조 필드는 비워집니다.
    • Lookup Relationship은 Object간에 느슨하게 결합된 관계입니다. Lookup Relationship에서는 부모 레코드가 삭제되더라도 자식 레코드는 그대로 남아있게 됩니다. 또, 부모와 자식 Object는 각각 자신의 sharing setting과 security control을 갖게 됩니다.

Master-Detail Relationship (마스터-디테일 관계)

  • 특징: 이 관계는 두 객체 간의 긴밀한 연결을 나타냅니다. 마스터(부모) 레코드가 삭제되면, 관련 디테일(자식) 레코드도 함께 삭제됩니다.
  • 용도: 강력한 데이터 종속성이 필요한 경우 사용됩니다. 예를 들어, 특정 영업 기회(Opportunity)와 관련된 모든 영업 활동을 관리할 때 활용됩니다.
  • 제한사항:
    • 디테일 측에서는 마스터 레코드가 반드시 필요하며, sharing setting과 security control은 마스터의 설정을 따르게 됩니다.
    • 마스터 레코드가 삭제되면, 디테일 레코드도 삭제되므로, Standard Object는 디테일쪽 Object로 설정할 수 없습니다.

관계차수에 따른 Types of Relationship


세일즈포스에서 관계차수의 종류에는 위 3가지 종류가 있습니다. 각 관계에 대해 살펴보고 직접 만든 Custom App에 적용해보겠습니다.

One to Many 관계


학적등록 관리 어플리케이션이 존재한다고 가정해보겠습니다. 하나의 학교는 여러 명의 학생을 등록받을 수 있고, 한명의 학생의 한번에 하나의 학교에 등록할수 있기 때문에 One to Many 관계를 맺게 됩니다. 이때 One 쪽의 Object를 부모 Object로 부르고 Many 쪽의 Object를 자식 Object로 부릅니다.

유사하게 채용관리 어플리케이션에서 Position과 Job Application이라는 Object 사이의 관계가 있다고 가정하면, 하나의 포지션에 여러 입사지원이 있을 수 있고 하나의 입사지원은 하나의 포지션만 가질 수 있으므로 동일하게 One to Many 관계를 갖게 됩니다.

One to Many 적용

기존에 생성한 Position Object와 Standard Object인 User Object와 관계를 맵핑해서 각 포지션마다 채용 담당자를 지정할 수 있게끔 해보겠습니다. 채용담당자는 여러개의 포지션을 담당하고, 하나의 포지션은 하나의 담당자에 의해 관리되는 One to Many 관계입니다.


One to Many 관계에서 FK는 Many쪽이 가져야 하므로 Position Object로 가서 Lookup Relationship 타입의 필드를 새로 생성해줍니다.


관계를 맺을 Obejct를 선택해줍니다.

Field Label과 Field Name을 설정해줍니다. Field Name은 공백이 올 수 없으므로 언더바로 대체했습니다. 이후 필드를 노출할 Profile과 Page Layout을 설정했습니다.

이제 레코드를 조회해보면 Hiring Manager 필드를 통해 User를 조회하고 수정할 수 있습니다.


Schema Builder를 통해서도 Hiring Manager 필드를 통해 1대다 관계가 맺어진 것을 볼 수 있고, 자동으로 생성되는 Standard Field들도 Lookup 관계로 생성된 것을 알 수 있습니다.

Junction Obejct(Lookup Relationship)

Master-Detail Relationship 적용


리뷰는 특정 입사지원건에 대해서만 이루어지기 때문에 Job Applicationd에 종속적입니다. Job Application없이는 Review가 생성되지 않도록 하고 Job Application이 삭제되면 Review도 삭제되어서 데이터 무결성을 지키기 위해 Master-Detail 관계를 적용해보겠습니다.

Review 오브젝트를 생성하고 Master-Detail Relationship 타입의 새로운 필드를 생성해줍니다.

연관 오브젝트로 Job Application을 선택하고 이후 양식에 맞게 입력후 생성해줬습니다.

Schema Builder를 통해 One to Many 관계차수로 Master-Detail Relationship이 적용된 것을 볼 수 있습니다.

Job Application의 레코드를 조회하고 Related 탭을 살펴보면 Review의 레코드를 조회하고 생성할 수 있습니다.

Roll-up Summary Field란


Roll-up Summary 필드는 Salesforce에서 Master-Detail 관계에 있는 두 객체 간의 데이터를 요약하여 표시하는 데 사용되는 특수한 필드(읽기 전용)입니다. 이 필드는 자동으로 계산되며 Master 객체의 레코드에 대한 Detail 객체의 레코드들의 합계, 평균, 최소값, 최대값 및 갯수와 같은 통계 정보를 표시합니다.

예를 들어, 주문(Order) 객체에 있는 모든 주문 항목(Order Items)의 총 가격을 계산하거나, 주문 항목들의 평균 가격을 계산하고, 주문에 포함된 주문 항목의 총 수를 계산하는 등의 기능을 가질 수 있습니다.

⚠️주의사항

  • Roll-up Summary 필드는 오직 Master-Detail 관계에서 Master Object만 사용할 수 있습니다. Lookup 관계에서는 사용할 수 없습니다.
    Detail 객체의 레코드들이 추가, 업데이트 또는 삭제될 때, Roll-up Summary 필드 값은 자동으로 업데이트 됩니다.
  • Master Object에 이미 Roll-up Summary 필드를 생성했다면 해당 관계는 Lookup Relationship으로 변경할 수 없습니다.

Roll-up Summary Field 생성

Master인 Job Application 에서 Detail인 Review의 레코드들에 대한 Roll-up Summary Field를 생성해보겠습니다.

각 리뷰는 여러 Interviewer에 의해 진행되고 Rating이라는 숫자 필드에 평가점수를 입력하게 되는데, 해당 숫자들을 모두 합한 값인 Total Rating이라는 필드를 생성하겠습니다.


Job Application에서 새로운 필드를 생성하려고하면 Roll-up Summary 옵션이 활성화 되어 있습니다. 해당 옵션은 Master side로 관계가 맺어져 있는 오브젝트가 아니면 비활성화 되어 있어 선택할 수 없습니다.

이후 Field Label과 Field Name을 설정해주고 Next를 누르면 위와 같이 Summarize할 오브젝트와 Roll-up Type을 선택할 수 있습니다. Detail로 설정된 오브젝트가 Review밖에 없으므로 유일한 선택지인 Review Object를 선택했습니다.

Roll-up Type에서는 SUM을 선택했습니다. Field to Aggregate에서 집계할 필드를 선택할 수 있습니다. 현재 Review 오브젝트에서 집계가 가능한 필드는 숫자타입 필드이므로 유일한 선택지인 Rating를 선택했습니다.


지난번 Formula 필드와 마찬가지로 레코드 조회시 Total Rating 필드 집계가 정상적으로 되지 않고 불필요한 스켈레톤 UI를 렌더링하고 있습니다. 원인은 모르겠으나, Classic Salesforce UI에서는 정상적으로 필드가 표기되고 Platform App Builder 미리보기 화면에서도 정상적으로 표기되어 Lightning Experience에서 렌더링 할 때 문제가 발생하는 것으로 예상됩니다. 파악되면 수정하도록 하겠습니다.

Many to Many Relationship

일반적인 RDBMS에서 그러하듯이, 세일즈포스에서도 다대다 관계는 연결 오브젝트(Junction Object)를 생성하여 일대다, 다대일 관계로 풀어냅니다.

그렇게 함으로써 데이터의 중복을 최소화하고 테이블의 재사용성을 높이는 RDBMS의 장점을 살릴 수 습니다. 또, 일반적으로 객체사이에 다대다 관계가 있는 경우 그 관계에서 필요한 필드들이 많이 생기기 때문에 연결 테이블로써 풀어내는 것이 필요합니다.

위 이미지와 같이 채용하고자 하는 Position이 있고, 그 포지션을 채용하기위해 원티드, 사람인 등 과 같이 다양한 채용 플랫폼에 등록한다고 할 때, 하나의 포지션을 여러 플랫폼에 등록할 수도 있고 하나의 플랫폼은 여러 포지션을 등록받을 수도 있기 때문에 다대다 관계가 성립합니다.

이를 Job Posting이라는 연결 오브젝트를 생성하고 각각 Position과 Employment Website 사이에서 일대다, 다대일를 맺음으로써 다대다 관계를 풀어낼 수 있습니다.

Many to Many Relationship 적용


우선 Employment Website 커스텀 오브젝트를 생성하고 URL 타입의 Web Address 필드를 생성해줬습니다.

그리고 위와 같이 3가지 예시 레코드를 생성했습니다.

Junction Object 및 Master-Detail Relationship Field 생성

세일즈포스에서 Junction Obejct를 통해 일대다, 다대일 관계를 맺을 때는 주로 2개의 Master-Detail Relationship 필드를 각각 생성하는 방법을 사용합니다.

먼저 Job Posting이라는 Junction Object를 생성하고 해당 Object에 각각 Position과 Employment Website 오브젝트를 참조하는 2개의 Master-Detail 타입 필드를 생성했습니다.



이제 Recruiting App으로 가서 Position과 Employment Website의 각각의 레코드를 조회하고 Related 탭을 보면 연결 레코드인 Job Posting을 조회할 수 있고 해당 레코드를 조회함으로써 어떤 포지션이 어떤 채용 플랫폼에 포스팅되었는지, 어떤 채용플랫폼에 어떤 포지션이 포스팅 되었는지 각각의 탭에서 조회할 수 있습니다.

profile
100번 고민보다 1번 실행

0개의 댓글