고객 사례
AppExchange 제품 아키텍처: 아이디어에서 출시까지
AppExchange에 출시된 네이티브 HR 애플리케이션, 시장 진입 속도 3배.
문제
Salesforce ISV 파트너인 CrossTalent는 AppExchange를 위한 네이티브 HR 애플리케이션을 만들고 있었습니다. 제품은 각자의 설정, 보안 모델, 데이터 볼륨, 커스터마이징을 가진 수천 개의 서로 다른 고객 조직 안에서 돌아가야 했습니다. 플랫폼 제약은 단일 고객 구현보다 엄격했고, 보안 심사는 타협 불가였으며, namespace 격리가 모든 아키텍처 결정을 좌우했습니다.
진행한 작업
아키텍처는 개발이 시작되기 전에 정의되었습니다. namespace 구조, 오브젝트 모델, 공유 아키텍처, governor limit 리스크 프로필, 업그레이드 전략. 고객 디스커버리는 하드코딩이 아니라 설정으로 처리할 프로세스 변형을 검증했습니다. 보안 심사 준비는 첫날부터 코드 리뷰와 테스트 커버리지에 녹아 들어갔습니다. 표준화된 애자일 리듬이 예측 가능한 진척과 최소한의 재작업을 만들어 냈습니다.
한눈에 보기
- 고객사
- CrossTalent
- 산업
- HR 테크 · SaaS
- 프로젝트
- 14개월
- 담당 역할
- Lead Solution Architect, 제품 아키텍처 및 AppExchange 컴플라이언스
- Salesforce 클라우드
- Sales Cloud (AppExchange Platform)
- 성과
- 14 아이디어에서 AppExchange까지 걸린 개월
Before / After
- managed package 아키텍처도, namespace 결정도, 플랫폼을 의식한 데이터 모델도 없었습니다.
- HR 프로세스 가정이 제품 비전에는 담겼지만, 실제 고객 변형에 비추어 검증되지는 않았습니다.
- 보안 심사를 설계의 입력이 아니라 하류의 관문으로 취급했습니다.
- 비구조적 개발 리듬을 기준선으로 삼아, 재작업 위험이 높았습니다.
- 향후 고객 조직 설정에 걸친 업그레이드 경로나 호환성 전략이 정의되지 않았습니다.
- AppExchange에 라이브로 올라간 네이티브 managed package. namespace로 격리되고 처음부터 끝까지 대량 처리(bulkify) 적용.
- 고객 디스커버리로 검증한 HR 프로세스 변형을 설정으로 수용.
- 큰 보완 없이 통과한 Salesforce 보안 심사.
- 코드 리뷰, 테스트 커버리지 관문, 보안 체크리스트 통합을 갖춘 표준화된 애자일 납품.
- 나중에 덧붙인 게 아니라 첫 릴리스에 설계해 넣은 문서화된 업그레이드 경로.
상황
Salesforce ISV 파트너인 CrossTalent는 AppExchange를 위한 네이티브 HR 애플리케이션을 만들고 있었습니다. 고객의 Salesforce 조직 안에서 돌아가며 직원 라이프사이클, 성과 관리, HR 프로세스 자동화를 처리하는 종합 HR 관리 제품이었습니다. 이 프로젝트는 초기 콘셉트와 시장 검증에서 아키텍처, 개발, Salesforce 보안 심사, AppExchange 출시까지 제품 라이프사이클 전체를 아울렀습니다.
ISV 제품 개발과 표준 Salesforce 구현 작업의 차이는 근본적입니다. 제품은 한 고객의 조직을 위해 만들어지지 않았습니다. 각자의 설정, 보안 모델, 데이터 볼륨, 커스터마이징 계층을 가진 수천 개의 서로 다른 조직 안에서 돌아갈 것이었습니다. 모든 아키텍처 결정이 그 운영 현실을 염두에 두고 내려져야 했습니다. 데이터 모델은 고객 조직의 형태를 가정할 수 없었습니다. 연동 지점은 모든 고객의 기존 연결에 걸쳐 유연해야 했습니다. 업그레이드 경로는 첫 릴리스부터 계획되어야 했습니다. 고객은 버전이 올라갈 때마다 처음부터 다시 배포하지 않을 것이기 때문입니다.
과제
AppExchange 위에서 만드는 일은 모든 층위에서 구현과 다른 아키텍처 사고방식을 요구합니다.
플랫폼 제약은 더 까다롭고 더 무겁습니다. 단일 테넌트 구현에서 우회할 수 있는 governor limit은 managed package 안에서 넘을 수 없는 경계가 됩니다. 한 고객 조직에서 heap 한계에 근접하는 트리거가 다른 조직에서는 그것을 넘길 수 있습니다. 한 고객의 데이터 볼륨에서 받아들일 만한 성능을 내는 쿼리가 다른 고객의 볼륨에서는 실패할 수 있습니다. 아키텍처는 평균이 아니라 가장 까다로운 현실적 배포의 제약에 맞춰 설계되어야 했습니다.
보안 심사는 다른 종류의 검증을 부과했습니다. Salesforce는 출시 전에 종합 보안 체크리스트를 기준으로 AppExchange 패키지를 평가합니다. SOQL 인젝션, XSS, CRUD/FLS 적용, 공유 모델 준수, namespace 격리, 그리고 플랫폼 특화 보안 패턴 일체. 심사를 통과하는 패키지는 그저 검토된 게 아닙니다. 심사가 수월하도록 설계된 것입니다. 보안은 개발 이후에 덧붙일 수 없습니다. 첫 설계 결정에서부터 아키텍처로 잡아야 합니다.
namespace 격리 요건은 데이터 모델의 모든 측면을 좌우했습니다. managed package의 오브젝트, 필드, 코드는 고객 조직과 별개의 namespace에 자리합니다. 모든 참조는 namespace를 의식해야 했고, 모든 연동 지점은 managed 코드와 unmanaged 코드 사이의 경계를 위해 설계되어야 했으며, 모든 업그레이드 경로는 초기 릴리스부터 계획되어야 했습니다. namespace 규율을 사후에 추가하는 일은 리팩터링이 아닙니다. 재구축입니다.
아키텍처 킥오프에서 제품 팀에 한 말이 제품은 다른 누군가의 조직 안에서 돌아갑니다. 그 제약은 우리가 협상할 대상이 아닙니다. 규율이란 모든 governor limit, 모든 공유 규칙, 모든 namespace 경계가 프로덕션에서 시험받으리라 여기고 설계하는 것입니다. 실제로 시험받을 것이기 때문입니다.
실행
제품 아키텍처와 플랫폼 설계
아키텍처는 개발이 시작되기 전에 정의되었습니다. namespace 구조, 오브젝트 모델, 공유 아키텍처, governor limit 리스크 프로필, 업그레이드 전략. HR 데이터 모델은 플랫폼 제약에 맞서는 게 아니라 그에 맞춰 설계되었습니다. 대량 처리 패턴이 모든 데이터 연산에 내장되었고, 공유 모델은 멀티 테넌트 배포를 위해 설계되었으며, 연동 지점은 고객 조직 설정에 걸친 유연성을 위해 설계되었습니다.
고객 디스커버리와 설정 가능성
여러 산업 버티컬에 걸친 HR 팀과의 고객 디스커버리 워크숍은, 제품 아키텍처가 가정된 요구가 아니라 실제 HR 프로세스 요구를 반영하는지 검증했습니다. 디스커버리는 개발 우선순위를 끌어간 user story와, 패키지에 하드코딩하지 않고 설정으로 수용해야 할 프로세스 변형을 만들어 냈습니다. 지금 설정 가능하게 출시되는 것이, 나중에 맞춤 버전을 요구하지 않을 것입니다.
보안을 의식한 개발 리듬
코드 리뷰가 보안 체크리스트 항목을 표준 기준으로 포함했고, 테스트 커버리지가 기능 시나리오와 나란히 보안 특화 시나리오를 포함했습니다. 표준화된 애자일 프로세스(정의된 스프린트 리듬, 완료 정의, 코드 리뷰 관문, 테스트 커버리지 요건)가 비구조적 개발 대비 시장 진입 속도 3배 가속을 만들어 냈습니다. 팀이 더 빨리 움직여서가 아니라, 진척이 예측 가능하고 재작업이 최소화되도록 작업을 조직했기 때문입니다.
개발자 세 명으로 이뤄진 팀이 아키텍처 명세에 맞춰 개념 증명을 수행한 뒤 패키지 전체 개발을 진행했습니다. 패키지가 Salesforce 보안 심사에 도달했을 때 지적 사항은 사소했습니다. 아키텍처는 보완 이후가 아니라 처음부터 통과하도록 설계되어 있었습니다. managed package는 문서, 구현 가이드, 지원 자료를 포함한 등록 정보와 함께 AppExchange에 출시되었습니다. 가능한 한 고객 셀프서비스를 가능하게 하고 판매 후 구현 부담을 줄이도록 설계된 자료였습니다.
성과
네이티브 HR 애플리케이션은 Salesforce AppExchange에 출시되었습니다. 아이디어에서 시장까지 이르는 제품 라이프사이클 전체에 14개월이 걸렸습니다. Salesforce 보안 심사는 큰 보완 없이 통과했습니다. 표준화된 애자일 개발 프로세스는 비구조적 개발의 기준선 추정 대비 시장 진입 속도 3배 가속을 이뤄 냈습니다.
아키텍처는 개발 팀의 누구도 본 적 없는 고객 조직 안에서 버텼습니다. governor limit은 가장 무거운 현실적 데이터 볼륨에서도 걸리지 않았습니다. 공유 모델은 모든 고객의 기존 보안 설정에서 살아남았습니다. namespace 격리는 초기 출시 이후 뒤따른 업그레이드 릴리스에 걸쳐 버텼습니다.
AppExchange 제품 아키텍처는 구현 작업이 좀처럼 요구하지 않는 수준의 플랫폼 지식을 강제합니다. governor limit, 보안 모델, namespace 격리, 멀티 테넌트 배포 제약. 이것들은 구현 아키텍트가 이론으로 알고 ISV 아키텍트가 실전으로 아는 플랫폼의 기초입니다.
돌아보며
이 패턴은 제품 팀이 아키텍처가 개발과 병렬이 아니라 그 상류에 있다는 것을 받아들일 때 작동합니다. 개념 증명이 2주 앞으로 다가왔을 때, 코드 한 줄이 출시되기 전에 namespace, 공유, governor 전략을 정의하는 비용은 과해 보입니다. 그것은 제품이 사들일 가장 값싼 설계 규율입니다. 보안 심사 피드백 이후에 그것을 덧붙이는 비용은 단지 더 느린 데서 그치지 않습니다. 이미 출시된 코드를 둘러싸고 재설계해야 하는 경우가 잦습니다.
ISV가 AppExchange를 표준 배포 채널처럼 굴기를 기대할 때는 덜 작동합니다. AppExchange는 마켓플레이스가 아닙니다. 플랫폼 계약입니다. 등록을 따내는 규율이, 제품이 규모에서 살아남을지를 결정하는 규율입니다.
더 일찍 했어야 할 것은 프로세스 변형에 대한 고객 디스커버리입니다. ISV 제품의 출시 후 재작업을 일으키는 가장 큰 원천은, 팀이 하드코딩할 수 있다고 가정했지만 고객 기반이 실제로는 설정 가능하기를 원했던 프로세스 변형입니다. 아키텍처 단계의 디스커버리는 2년 차의 메이저 릴리스 한 사이클을 아낍니다.
이 플랫폼 수준의 지식은 Agentforce 아키텍처로 그대로 이어집니다. 에이전트는 동일한 플랫폼 제약 안에서 작동합니다. governor limit은 에이전트가 호출하는 Apex에 적용되고, 보안 모델은 에이전트가 누구를 대신해 어떤 데이터에 접근하는지를 다스리며, 플랫폼의 신뢰 아키텍처는 에이전트가 어떤 맥락에서 어떤 행동을 할 수 있는지를 정합니다. 샌드박스에서 작동하는 에이전트가 데이터 볼륨이 governor limit에 닿으면 프로덕션에서 실패할 수 있습니다. 보안 모델 밖의 데이터에 접근하는 prompt 템플릿은 감사 전까지 드러나지 않을 수 있는 컴플라이언스 위반을 만듭니다. AppExchange 위에서 만드는 일은, 플랫폼 제약이 적용되지 않으리라 가정하는 게 아니라 그 제약 안에서 설계하는 법을 가르칩니다. 그것이 프로덕션에서 안정적으로 작동하는 Agentforce 에이전트와 데모에서만 작동하는 에이전트의 차이입니다.
용어 정리
- Managed package
- 고객 조직 안에서 별도의 namespace 아래 돌아가는 배포 가능한 Salesforce 메타데이터 묶음입니다(오브젝트, 필드, 코드, 레이아웃). ISV는 고객의 커스터마이징을 덮어쓰지 않고 업데이트를 밀어 넣을 수 있습니다. AppExchange를 가능하게 하는 패키징 모델입니다.
- Namespace 격리
- 모든 managed package는 고객 조직과 별개의 namespace에 자리합니다. 오브젝트, 필드, 코드는 namespace 접두사를 답니다. 모든 참조, 모든 연동 지점, 모든 업그레이드가 그 경계를 중심으로 설계되어야 합니다. 사후에 끼워 넣을 수 없고, 첫 설계 결정에서부터 아키텍처로 잡아야 합니다.
- Governor limits
- Apex 실행에 플랫폼이 강제하는 런타임 한계입니다(CPU 시간, heap 크기, SOQL 행 수, DML 문장 수). 단일 테넌트 구현에서는 우회 가능하지만 managed package 안에서는 넘을 수 없는 경계가 됩니다. 한 고객 조직에서 한계에 근접하는 트리거가 다른 고객 조직에서는 그것을 넘길 수 있습니다. 아키텍처는 평균이 아니라 가장 까다로운 현실적 배포를 기준으로 설계됩니다.
- AppExchange 보안 심사
- Salesforce가 모든 패키지를 출시 전에 수행하는 종합 보안 평가입니다. SOQL 인젝션, XSS, CRUD/FLS 적용, 공유 모델 준수, namespace 격리, 그리고 플랫폼 특화 패턴 일체. 통과하는 패키지는 보완 이후에 통과하도록 손본 게 아니라 통과하도록 설계된 패키지입니다.
자주 묻는 질문
- 단일 고객 구현에서는 아키텍트가 데이터 볼륨, 보안 모델, 연동 환경, 사용자 기반을 압니다. ISV 제품에서는 그중 어느 것도 알 수 없습니다. 패키지는 각자 다른 설정, 커스터마이징, 제약을 가진 수천 개의 고객 조직 안에서 돌아갑니다. 모든 아키텍처 결정이 그 운영 현실을 염두에 두고 내려져야 합니다. 가장 까다로운 현실적 배포를 기준으로 한 governor limit, 모든 고객의 공유 설정에서 살아남는 보안 모델, 모든 업그레이드 경로에 걸쳐 버티는 namespace 격리. 이 규율을 건너뛰는 구현 아키텍트는 데모는 통과하지만 프로덕션에서 실패하는 패키지를 출시합니다.
- 코드 리뷰가 보안 체크리스트 항목을 별도 단계가 아니라 표준 기준으로 포함했습니다. 테스트 커버리지가 기능 시나리오와 나란히 보안 특화 시나리오를 포함했습니다. 아키텍처는 심사가 자연스럽게 통과되도록 설계되었습니다. 대량 처리된 데이터 연산, 멀티 테넌트 배포를 위해 설계된 공유 모델, 모든 컨트롤러에 내장된 CRUD/FLS 적용. 패키지가 Salesforce 보안 심사에 도달했을 때 지적 사항은 사소했습니다. 아키텍처는 보완 이후가 아니라 처음부터 통과하도록 설계되어 있었습니다.
- 더 빠른 타이핑이 아닙니다. 표준화된 프로세스입니다. 정의된 스프린트 리듬, 명시적인 완료 정의, 코드 리뷰 관문, 테스트 커버리지 요건, 통합된 보안 체크리스트. 진척이 예측 가능하고 재작업이 최소화되도록 작업을 조직했습니다. 더 느리게 가는 대부분의 ISV 개발은 재작업에 발목이 잡혀 있습니다. 아키텍처가 결정되기 전에 만든 기능, 버그가 출시된 뒤에 작성한 테스트, 심사 피드백 이후에 덧붙인 보안. 3배는 그 모든 것을 상류로 옮긴 데서 나왔습니다.
- 모든 오브젝트, 필드, 코드 요소를 미래를 염두에 두고 명명했습니다. 하위 호환성 제약을 설계 문서에 담고 코드 리뷰로 강제했습니다. 가능성 높은 스키마 진화(필드 추가, 오브젝트 분리, 요소 폐기)를 위한 마이그레이션 패턴을 패키지의 샌드박스 버전에서 프로토타이핑했습니다. 첫 릴리스는 완성된 제품이 아니었습니다. 고객 조직을 깨뜨리지 않고 3년치 업그레이드를 흡수해야 할 제품의 첫 릴리스였습니다.
- Agentforce 에이전트는 동일한 플랫폼 제약 안에서 작동합니다. governor limit은 에이전트가 호출하는 Apex에 적용되고, 보안 모델은 에이전트가 누구를 대신해 어떤 데이터에 접근하는지를 다스리며, 플랫폼의 신뢰 아키텍처는 에이전트가 어떤 맥락에서 어떤 행동을 할 수 있는지를 정합니다. 샌드박스에서 작동하는 에이전트가 데이터 볼륨이 governor limit에 닿으면 프로덕션에서 실패할 수 있습니다. 보안 모델 밖의 데이터에 접근하는 prompt 템플릿은 감사 전까지 드러나지 않을 수 있는 컴플라이언스 위반을 만듭니다. AppExchange 위에서 만드는 일은, 플랫폼 제약이 적용되지 않으리라 가정하는 게 아니라 그 제약 안에서 설계하는 법을 가르칩니다.
다음으로 읽어 보십시오
상담 예약
30분이면 알 수 있습니다.
제가 도움이 될지 아닐지.
슬라이드도, 영업 자료도 없습니다. 아키텍처 다이어그램을 가져오시거나, 문제를 편한 말로 설명해 주십시오. 제가 맞는 사람인지, 다음 단계의 비용이 얼마인지, 커피를 다 마시기 전에 말씀드립니다.
- 24시간 이내 회신, 예외 없이
- 제가 맞는 사람이 아니라면, 맞는 분을 소개해 드립니다
- 요청하지 않으시면 후속 메일은 보내지 않습니다