운영 우수성 - 자동화 패턴
잘 설계된 운영 우수성 → 자동화 및 효율성에 대해 자세히 알아보기
패턴
| 찾을 위치 | 유사성 |
|---|---|
| 플랫폼 | 대시보드 | ✅ KPI와 관련된 모든 메트릭이 하나 이상의 대시보드에 포함됩니다. |
| 플랫폼 | 문서 | ✅ 모든 자동화에 대한 출력이 측정 가능하고 시간 바운드 |
| 플랫폼 | 문서 | ✅ 각 KPI에 대해 책임이 있는 이해당사자가 나열됩니다. |
안티 패턴
| 찾을 위치 | 불만 사항 |
|---|---|
| 플랫폼 | 대시보드 | ⚡️ KPI 보고서가 없거나 일부 KPI와 관련된 메트릭이 대시보드에 누락되었습니다. |
| 플랫폼 | 문서 | ⚡️ 책임 있는 이해당사자가 없는 KPI 존재 |
| 플랫폼 | 문서 | ⚡️ 자동화에 대한 KPI가 없거나 측정 시간 범위가 명확하지 않음 |
패턴
| 찾을 위치 | 유사성 |
|---|---|
| 플랫폼 | 플로 | ✅ Flow Builder는 레코드 트리거 자동화에 사용됩니다(프로세스 빌더 및 워크플로 규칙 대체). |
| 플랫폼 | 플로 | ✅ 저장 전 실행이 있는 레코드 트리거 플로는 레코드 생성 전에 필드 모집단에 사용됩니다. |
| 플랫폼 | 플로 | ✅ 플로는 결정 논리, 루프, API 콜아웃, DML 작업, 복잡한 다단계 오케스트레이션을 처리합니다. |
| 플랫폼 | 플로 | ✅ 필요한 경우 중간 변경 사항 커밋에 플로 트랜잭션 제어가 사용됩니다. |
| 플랫폼 | 플로 | ✅ 플로에서 정상적인 오류 복구를 위해 오류 처리가 구현됨 |
| 플랫폼 | 플로 | ✅ 반응형 화면 플로는 동적 사용자 환경을 제공합니다. |
| 플랫폼 | 플로 | ✅ 비즈니스 사용자 또는 관리자가 개발자 참여 없이 논리를 수정해야 하는 경우 선언적 자동화가 선택됩니다. |
| 플랫폼 | 플로 | ✅ 변수는 하드 코딩된 값을 참조하지 않습니다(레코드 유형, 사용자 등). |
| 플랫폼 | 플로 | ✅ 대용량 데이터 컨텍스트에서 Apex 로직 핸드 오프 플로 |
| 플랫폼 | 플로 | ✅ 하위 플로는 비즈니스 전체에서 재사용해야 하는 프로세스 섹션에 사용됩니다. |
| 플랫폼 | 플로 | ✅ 모든 자동 실행 플로는 결정 및/또는 일시 중지 요소를 사용하여 항목 기준을 평가하고 대용량 데이터에 대한 무한 루프 또는 실행을 방지합니다. |
| 플랫폼 | 플로 | ✅ 기존 시스템 데이터를 사용할 수 없는 경우에만 사용자에게 데이터 제공을 요청합니다. |
| 플랫폼 | 플로 | ✅ 플로는 기본 플로 및 지원 하위 플로로 구성된 계층 구조로 구성됩니다. |
| 플랫폼 | 플로 | ✅ 모든 사용자 입력에 플로 내 명확한 목적이 있습니다. |
| 플랫폼 | 플로 | ✅ 각 플로는 단일 특정 목적을 제공합니다. |
| 플랫폼 | 플로 | ✅ 각 단계는 특정한 세분화된 과업을 수행합니다. |
| 플랫폼 | 플로 | ✅ 사용자 컨텍스트 추상 시스템 컨텍스트 트랜잭션에서 시작된 모든 플로에서 하위 플로, 새 트랜잭션을 생성하기 위해 일관되게 일시 중지 요소 뒤에 배치 |
| 플랫폼 | 플로 | ✅ 모든 레코드 트리거 플로에 트리거 순서 값이 채워집니다. |
| 플랫폼 | 플로 | ✅ 외부 시스템 콜아웃 또는 장기 실행 프로세스와 관련된 플로는 비동기 경로를 사용합니다. |
| 플랫폼 | 플로 | ✅ 오케스트레이터를 사용하여 관련 데이터 작업의 복잡한 시퀀스를 만듭니다(모노리틱 플로 내에서 여러 하위 플로를 호출하는 대신). |
| 플랫폼 | 유효성 검사 | ✅ 확인 규칙, 중복 규칙 및 필수 필드를 사용하여 플랫폼 수준에서 데이터 무결성이 적용됩니다. |
| 플랫폼 | 유효성 검사 | ✅ 저장 전에 잘못된 데이터 입력을 방지하는 확인 규칙(트리거 확인보다 효율적임) |
| 플랫폼 | 승인 프로세스 | ✅ 위임된 승인자가 있는 병렬 및 순차 승인 경로를 처리하는 다단계 승인 라우팅 |
| 플랫폼 | 승인 프로세스 | ✅ 승인 아키텍처는 예외 시나리오를 고려합니다(모든 승인자가 휴가 중, 긴급한 비즈니스 요구 사항이 일반 승인을 우회함). |
안티 패턴
| 찾을 위치 | 불만 사항 |
|---|---|
| 플랫폼 | 플로 | ⚡️ 새 자동화에 사용되는 프로세스 빌더 및 워크플로 규칙(전략적 방향인 Flow Builder) |
| 플랫폼 | 플로 | ⚡️ 개발자 참여 없이 비즈니스 사용자 또는 관리자가 논리를 수정해야 하는 경우 사용되는 프로그래밍 자동화 |
| 플랫폼 | 플로 | ⚡️ 플로에 오류가 처리되지 않으므로 오류 복구가 불량 |
| 플랫폼 | 플로 | ⚡️ 변수의 값이 하드 코딩됨 |
| 플랫폼 | 플로 | ⚡️ 대량 데이터 로드 전에 플로를 수동으로 비활성화해야 합니다. |
| 플랫폼 | 플로 | ⚡️ 하위 플로를 사용하는 대신 플로 전체에서 플로의 일부가 반복됩니다. |
| 플랫폼 | 플로 | ⚡️ 플로에서 “처리되지 않은 예외” 알림 트리거 |
| 플랫폼 | 플로 | ⚡️ 간단한 플로에서도 정기적으로 총괄자 제한과 관련된 오류가 발생합니다. |
| 플랫폼 | 플로 | ⚡️ 플로에 추가 입력이 있어야만 컨텍스트를 제공할 수 있습니다. |
| 플랫폼 | 플로 | ⚡️ 플로는 여러 목적으로 사용됩니다. |
| 플랫폼 | 플로 | ⚡️ 관련 단계 그룹에는 다른 플로의 단계 그룹과 겹치는 기능이 포함되어 있습니다. |
| 플랫폼 | 플로 | ⚡️ 플로에서 대신 저장된 데이터를 사용할 수 있는 경우 사용자 입력을 요청합니다. |
| 플랫폼 | 플로 | ⚡️ 플로에는 데이터가 사용되지 않는 입력이 필요합니다. |
| 플랫폼 | 플로 | ⚡️ 화면 구성 요소에서 출력되는 컬렉션을 사용하여 DML 수행(스크린 구성 요소에서 컬렉션을 출력할 때 요소 만들기, 업데이트 또는 삭제에 대한 “레코드 또는 레코드 컬렉션의 ID 및 모든 필드 값 사용” 설정 활용) |
| 플랫폼 | 플로 | ⚡️ 레코드 트리거 플로는 트리거 순서 특성을 전혀 사용하지 않거나 트리거 순서 값을 일관적으로 사용하지 않습니다. |
| 플랫폼 | 플로 | ⚡️ 비동기 경로가 일관되게 사용되지 않거나 전혀 사용되지 않음 |
| 플랫폼 | 플로 | ⚡️ 대형 모노리틱 플로는 관련 데이터 작업의 복잡한 시퀀스를 조정하도록 시도합니다(하위 플로 포함 또는 제외). |
| 플랫폼 | 승인 프로세스 | ⚡️ 승인 아키텍처는 예외 시나리오(휴가 중인 모든 승인자, 긴급한 비즈니스 요구 사항)를 고려하지 않습니다. |
| 플랫폼 | 유효성 검사 | ⚡️ 유효성 검사 규칙 대신 트리거에만 데이터 무결성이 적용됩니다(트리거 유효성 검사가 효율적이지 않고 복잡함). |
패턴
| 찾을 위치 | 유사성 |
|---|---|
| 플랫폼 | Apex | ✅ 트리거 처리기 프레임워크는 개체당 단일 트리거, 대량 처리, 우려 사항 분리, 반복 실행 방지를 적용합니다. |
| 플랫폼 | Apex | ✅ 트리거 처리자는 비즈니스 논리에 대한 서비스 클래스에 위임하여 우려 사항을 명확하게 구분합니다. |
| 플랫폼 | Apex | ✅ 트리거는 정적 플래그 또는 전용 반복 제어 클래스를 사용하여 반복 방어를 사용합니다. |
| 플랫폼 | Apex | ✅ 향후 Apex 콜아웃 또는 시스템 개체 DML에 거의 사용되지 않음 |
| 플랫폼 | Apex | ✅ 비동기 Apex 호출은 트랜잭션 전반에 걸쳐 Queueable to ‘chain’ 복잡한 DML을 사용합니다. |
| 플랫폼 | Apex | ✅ 배치 Apex 대용량 데이터에 사용됩니다( 청크당 전용 총괄자 제한이 있는 대량 데이터 처리) |
| 플랫폼 | Apex | ✅ 배치 작업은 전체 배치 실행을 중지하지 않고 실패한 레코드를 기록하는 오류 처리가 있습니다. |
| 플랫폼 | Apex | ✅ 대량 데이터를 처리해야 하는 경우에만 대량 API가 사용됩니다(더 작은 양의 데이터에 대해 활용되는 기본 SOAP 및 REST API). |
| 플랫폼 | Apex | ✅ 대기 가능한 Apex 복잡한 워크플로 오케스트레이션, 재시도 논리를 사용하는 외부 콜아웃, 비동기 제한을 활용하는 처리에 사용됩니다. |
| 플랫폼 | Apex | ✅ 예약된 Apex 야간 서비스 점검, 일일 보고, 정기 통합 동기화, 시간 기반 비즈니스 규칙을 위한 고정 일정에 따른 처리를 실행합니다. |
| 플랫폼 | 설계 표준 | ✅ 자동화 내에서 동기식 및 비동기식 작업에 대한 사용 사례가 설계 표준의 일부로 명확하게 간략하게 설명되어 있습니다. |
| 플랫폼 | 문서 | ✅ 자동화에 대해 계획된 실행 경로 및 잠재적인 실행 경로가 명확하게 요약되어 있습니다. |
안티 패턴
| 찾을 위치 | 불만 사항 |
|---|---|
| 플랫폼 | Apex | ⚡️ 예측할 수 없는 실행 순서 및 겹치는 논리가 있는 한 개체의 여러 트리거 |
| 플랫폼 | Apex | 트리거 파일에 직접 내장된 비즈니스 논리로 테스트가 어려워짐 |
| 플랫폼 | Apex | ⚡️ 개체 전체에서 트리거 처리기 프레임워크 또는 일관되지 않는 트리거 패턴 없음 |
| 플랫폼 | Apex | ⚡️ 배치 Apex 작업의 범위 크기는 매우 작습니다(예: 범위 크기 = 1) |
| 플랫폼 | Apex | ⚡️ 외부 콜아웃에 사용되는 배치 Apex(배치 Apex 사용하여 외부 시스템에 푸시되는 대량 Salesforce 데이터) |
| 플랫폼 | Apex | ⚡️ 임의로 사용되는 비동기 Apex 기능(과거 메서드 및 대기 가능한 Apex 일관되지 않게 또는 상호 교환적으로 사용됨) |
| 플랫폼 | Apex | ⚡️ Async Apex 거의 사용되지 않음 |
| 플랫폼 | Apex | ⚡️ 데이터베이스 작업에 필요한 경우 배치 Apex 실행을 전달하기 위한 명확하고 일관된 논리가 없습니다. |
| 플랫폼 | 설계 표준 | ⚡️ 동기 및 비동기 작업에 대한 사용 사례가 해결되지 않음 |
| 플랫폼 | 문서 | ⚡️ 자동화 호출이 문서화되지 않음 |
패턴
| 찾을 위치 | 유사성 |
|---|---|
| 플랫폼 | 플랫폼 이벤트 | ✅ 플랫폼 이벤트는 구독자와 게시자를 분리하는 이벤트 중심 자동화에 사용됩니다. |
| 플랫폼 | 플랫폼 이벤트 | ✅ 게시자가 구독자를 알지 못하고 Fire-and-Forget 게시 |
| 플랫폼 | 플랫폼 이벤트 | ✅ 여러 가입자가 플랫폼 이벤트 트리거 플로, Apex 트리거 또는 외부 통합을 통해 이벤트에 독립적으로 반응 |
| 플랫폼 | 플랫폼 이벤트 | ✅ 재생 ID는 72시간 보존 기간의 임의의 지점에서 누락된 이벤트를 재생하는 데 사용됩니다. |
| 플랫폼 | 플랫폼 이벤트 | ✅ 플랫폼 이벤트 - 교차 조직 통신, 외부 시스템 알림, 내부 워크플로 오케스트레이션 지원 |
안티 패턴
| 찾을 위치 | 불만 사항 |
|---|---|
| 플랫폼 | 플랫폼 이벤트 | ⚡️ 게시자와 구독자 간 직접 연결으로 구성 가능한 자동화를 방지합니다. |
| 플랫폼 | 플랫폼 이벤트 | ⚡️ 계정 계층 업그레이드는 단일 트랜잭션에서 기회 업데이트, 계정 팀 알림, 데이터 웨어하우스 동기화를 직접 호출합니다(고밀 연결 시 새 다운스트림 처리가 필요할 때마다 계정 논리를 변경해야 함) |
| 플랫폼 | Apex | ⚡️ 즉시 게시 플랫폼 이벤트는 특별 사용(게시 주문 요구 사항 또는 레코드 잠금 위험에 관계없이 커밋 후 게시 대신 사용되는 실시간 이벤트) |
패턴
| 찾을 위치 | 유사성 |
|---|---|
| 플랫폼 | Apex | ✅ SOQL 문은 양의 논리 비교 연산자(INCLUDES, IN)를 기본 또는 유일한 논리로 사용합니다. |
| 플랫폼 | Apex | ✅ SOQL은 = NULL, != NULL을 피하거나 긍정 비교 연산자 후에 그들을 희소하게 사용합니다. |
| 플랫폼 | Apex | ✅ SOQL은 LIMIT 1 문을 사용하지 않습니다. |
| 플랫폼 | Apex | ✅ SOQL은 ALL ROWS 키워드를 사용하지 않습니다. |
| 플랫폼 | Apex | ✅ SOQL이 루프 내에 표시되지 않음 |
| 플랫폼 | Apex | ✅ SOSL에 와일드카드 기준 표시(SOQL이 아님) |
| 플랫폼 | Apex | ✅ SOQL 문은 LIKE 비교 또는 부분 텍스트 비교를 피합니다. |
| 플랫폼 | Apex | ✅ SOQL은 try-catch 블록으로 래핑됩니다. |
| 플랫폼 | Apex | ✅ 변수는 하드 코딩된 값을 참조하지 않습니다(레코드 유형, 사용자 등). |
| 플랫폼 | Apex | ✅ 각 클래스는 단일 특정 목적을 제공합니다. |
| 플랫폼 | Apex | ✅ 각 방법은 특정한 세분화된 과업을 수행합니다. |
| 플랫폼 | Apex | ✅ 모든 입력 변수는 클래스 내에서 명확한 목적이 있습니다. |
| 플랫폼 | Apex | ✅ 코드를 실행하려면 최소한의 자원이 필요합니다. |
안티 패턴
| 찾을 위치 | 불만 사항 |
|---|---|
| 플랫폼 | Apex | ⚡️ SOQL 문은 NOT, NOT IN 기준을 기본 또는 유일한 비교 연산자로 사용합니다(선택적이지 않음) |
| 플랫폼 | Apex | ⚡️ SOQL 문은 ALL ROWS 키워드를 사용합니다(선택적이지 않음) |
| 플랫폼 | Apex | ⚡️ SOQL 문은 = NULL, != NULL 기준을 기본 또는 유일한 비교 연산자로 사용합니다(선택적이지 않음) |
| 플랫폼 | Apex | ⚡️ 변수의 값이 하드 코딩됨 |
| 플랫폼 | Apex | ⚡️ SOQL이 루프 내에 나타남 |
| 플랫폼 | Apex | ⚡️ SOQL 문은 LIKE 및 와일드카드 필터 기준을 자주 사용합니다(선택적이지 않음) |
| 플랫폼 | Apex | ⚡️ SOQL은 try-catch 블록으로 래핑되지 않음 |
| 플랫폼 | Apex | ⚡️ SOQL 문은 LIMIT 1(선택적이지 않음)를 사용합니다. |
| 플랫폼 | Apex | ⚡️ 와일드카드 선택 기준에 SOSL이 거의 사용되거나 일관되지 않음 |
| 플랫폼 | Apex | ⚡️ 클래스는 여러 목적으로 제공됩니다. |
| 플랫폼 | Apex | ⚡️ 메서드가 여러 과업을 수행하거나 메서드가 속한 클래스의 명시된 목적에 부합하지 않는 과업을 수행합니다. |
| 플랫폼 | Apex | ⚡️ 입력 변수가 실제로 메서드에서 사용되지 않음 |
| 플랫폼 | Apex | ⚡️ 데이터베이스 또는 외부 시스템에서 데이터를 불필요하게 검색하는 메서드 |
패턴
| 찾을 위치 | 유사성 |
|---|---|
| 플랫폼 | Apex | ✅ 고급 오류 메시지 및 논리를 만드는 데 사용자 정의 예외가 사용됩니다. |
| 플랫폼 | Apex | ✅ 코드는 모든 DML, SOQL, 콜아웃 및 기타 중요한 프로세스 단계를 try-catch 블록으로 래핑합니다. |
| 플랫폼 | Apex | ✅ 데이터베이스 클래스 메서드는 DML 대신 모든 데이터 작업에만 사용할 수 있습니다. |
| 플랫폼 | Apex | ✅ 비동기 및 대량 컨텍스트에서는 DML 대신 데이터베이스 클래스 메서드가 사용됩니다. |
| 플랫폼 | Aura | ✅ JavaScript는 모든 데이터 작업 및 중요한 프로세스 단계를 try-catch 블록으로 래핑합니다. |
| 플랫폼 | Aura | ✅ try-catch 블록 내에서, 네이티브 JavaScript Error가 throw 문에 사용됩니다($A.error()의 사용 없음) |
| 플랫폼 | Aura | ✅ 모든 복구 가능한 오류 논리가 catch 문 안에 나타나고 명확한 사용자 메시지를 제공합니다. |
| 플랫폼 | 플로 | ✅ 데이터 작업, 콜아웃 및 기타 중요 처리 논리가 있는 플로는 모든 주요 작업에 대한 오류 경로가 있습니다. |
| 플랫폼 | 플로 | ✅ 화면 플로에서 오류 커넥터를 사용하여 사용자에게 오류를 표시합니다. |
| 플랫폼 | 플로 | ✅ 화면에 표시되는 오류에 대해 사용자 정의 오류 메시지가 구성됩니다. |
| 플랫폼 | Lightning 웹 구성 요소(LWC) | ✅ JavaScript는 모든 데이터 작업 및 중요한 프로세스 단계를 if ()/else if () 블록으로 래핑합니다. |
| 플랫폼 | Lightning 웹 구성 요소(LWC) | ✅ 모든 @wire 함수는 API에서 제공하는 data 및 error 속성을 사용합니다. |
| 플랫폼 | Lightning 웹 구성 요소(LWC) | ✅ 모든 if (error)/else if (error) 문에 오류를 처리하고 정보 메시지를 제공하는 논리가 포함되어 있습니다. |
안티 패턴
| 찾을 위치 | 불만 사항 |
|---|---|
| 플랫폼 | Apex | ⚡️ DML, SOQL, 콜아웃 또는 기타 중요 프로세스 단계가 시험 캐치 블록으로 일관되게 래핑되지 않음 |
| 플랫폼 | Apex | ⚡️ 데이터베이스 클래스 메서드가 사용되지 않음 |
| 플랫폼 | Apex | ⚡️ DML에서만 수행되는 데이터 작업 |
| 플랫폼 | Apex | ⚡️ System.debug 문은 프로덕션 코드에 표시되며 코멘트가 표시되지 않습니다. |
| 플랫폼 | Aura | ⚡️ JavaScript는 데이터 작업 및 중요한 프로세스 단계를 try-catch 블록으로 일관되게 래핑하지 않습니다. |
| 플랫폼 | Aura | ⚡️ 구성 요소 사용 $A.error() |
| 플랫폼 | Aura | ⚡️ 복구 가능한 오류 논리가 catch 문 내에 일관되게 표시되지 않으며 사용자에게 보내는 오류 메시지는 명확하지 않습니다. |
| 플랫폼 | 플로 | ⚡️ 플로는 일관되게 또는 전혀 오류 경로를 사용하지 않습니다. |
| 플랫폼 | 플로 | ⚡️ 사용자 정의 오류 메시지가 사용되지 않으므로 사용자에게 기본 “이 플로에서 처리되지 않은 오류가 발생했습니다” 메시지가 표시됩니다. |
| 플랫폼 | Lightning 웹 구성 요소(LWC) | ⚡️ @wire 함수는 API에서 제공하는 data 및 error 속성을 사용하지 않습니다(또는 일관되게 사용하지 않습니다). |
| 플랫폼 | Lightning 웹 구성 요소(LWC) | ⚡️ 사용하는 경우, if (error)/else if (error) 문은 실제로 오류를 처리하는 논리를 포함하지 않으며 유용한 오류 메시지를 제공합니다. |
| 플랫폼 | Lightning 웹 구성 요소(LWC) | ⚡️ JavaScript는 데이터 작업이나 중요한 프로세스 단계에서 일관되게 if ()/else if () 블록을 사용하지 않습니다. |