Slate 오류와 성능 FAQ
문제를 화면, 질의, 함수와 실행 시점으로 나누어 조사합니다. 브라우저의 네트워크 요청, 렌더링과 JavaScript 자원, HTML/CSS 및 연결 데이터베이스의 실행 계획을 함께 보면 Slate 설정 문제와 외부 처리 문제를 구분하기 쉽습니다.
기본 조사 도구는 Health check와 Debugger, 실행 구조는 의존 관계, 사용자 상태는 상호작용 패턴에 설명합니다.
질의가 실패하거나 느립니다
반환 데이터가 큽니다
브라우저에 한 번에 반환하는 행은 대략 10,000개 미만을 검토하고, 원시 행을 표시한다면 LIMIT/OFFSET과 서버 페이징으로 나눕니다. 질의가 성공해도 많은 데이터의 렌더링과 메모리 사용 때문에 앱이 느려질 수 있습니다.
이는 설계 참고값입니다. SQL/Foundry 질의의 기본 5,000,000바이트 결과 한도와 초과 시 실패하는 계약은 질의 설정을 따릅니다.
왕복 시간이 5초 미만이 되도록 요청 크기와 작업량을 줄이는 것을 목표로 삼습니다. 큰 요청 본문이나 매번 반복하는 가공은 상류 transform으로 옮길 수 있는지 검토합니다.
SQL 자체의 문제입니다
잘못된 구문, 불필요하게 큰 입력과 인덱스 구조를 구분합니다. Postgres 계획에서 실제 시간과 읽은 행 수를 확인합니다.
- 필요한 기간만 동기화합니다. 1년만 사용한다면 전체 이력을 매번 가져와 거르는 대신 해당 기간을 준비할 수 있습니다.
- 필요한 열만 동기화하고 질의에서도 필요한 열만 고릅니다.
- 원시 행을 보여 주는 화면은 수백 행 정도의 페이지부터 검토합니다.
- COALESCE, DISTINCT, null을 포함한 조인 열, 앞쪽 wildcard와 복잡한 조건은 실제 계획과 입력 크기를 살핍니다. 연산 이름만으로 항상 느리다고 판단하지 않습니다.
- 정리, 표시값 매핑과 반복 지표는 상류에서 계산하고 필요한 필터 차원만 앱에서 처리합니다.
EXPLAIN ANALYZE는 실제 질의를 실행합니다. 데이터 변경 효과와 실행 범위를 확인하고 사용합니다.
로드 때만 불규칙하게 실패합니다
독립된 root 질의가 한꺼번에 실행되는지 확인합니다. Postgate의 사용자별 연결 풀과 대기 조건, 수동/조건부 실행은 질의 실행 관리를 따릅니다.
20초 부근에 요청이 끝납니다
Slate 질의 요청에는 Slate 측의 20초 대기 조건이 있습니다. View 모드에서 브라우저 Network를 열고 새로고침하여 요청 시간과 응답을 확인합니다. 해당 시간 부근의 실패는 이 대기 조건을 조사할 단서입니다.
브라우저 요청의 시간 초과가 서버 작업의 취소나 미실행을 뜻하지는 않습니다. 질의 성능과 동시 실행을 줄이고, 실제 오류는 원시 응답과 함께 확인합니다. 변경 요청을 다시 제출하기 전에는 해당 작업의 처리 상태와 재시도 계약을 확인합니다.
특정 입력에서만 실패하거나 실행되지 않습니다
Handlebars 참조의 null이나 준비되지 않은 입력을 조건부 질의 또는 함수로 구분합니다. 반대로 실행되지 않는 경우에는 수동 설정과 의존값이 실제로 달라졌는지 확인합니다. 이벤트를 과도하게 연결한 앱은 짧은 데이터 의존 관계로 나누는 방법을 검토합니다.
열 이름을 참조하지 못합니다
PostgreSQL은 인용하지 않은 식별자를 소문자로 해석합니다. 대문자나 공백이 있는 열과 테이블 이름은 큰따옴표로 참조합니다.
ERROR: column mixedcasecolumn does not exist HINT: Perhaps you meant to reference the column "Mixed Case Column"
가능하면 소문자와 밑줄을 쓰는 이름으로 데이터를 준비합니다. 기존 이름을 유지한다면 SQL에 정확히 큰따옴표를 씁니다.
기존 Phonograph 쓰기를 조사합니다
Phonograph는 기존 OSv1 쓰기 경로입니다. 플랫폼 인스턴스의 Phonograph Reference Application과 해당 계약을 사용하고, 제공되지 않는 예나 내부 설정은 Palantir Support에 확인합니다. 새 업무에는 온톨로지 액션을 사용합니다.
빠르게 제출하면 텍스트 끝이 빠집니다
Textarea를 사용하는 특정 구성에서는 This is a test message for writeback을 입력하고 바로 제출했을 때 This is a te 같은 앞부분만 전달될 수 있습니다. Textarea의 0.5초 debounce로 값 반영이 늦어지는 상황이며 다음 두 조건이 함께 있을 때 발생합니다.
- Textarea가 사용자가 마지막으로 작성한 입력입니다.
- 마지막 글자 입력 후 0.5초가 지나기 전에 Submit을 누릅니다.
제출 전에 값 반영 시간이 확보되도록 흐름을 구성합니다. 확인 대화상자를 두거나 Textarea 뒤에 다른 입력을 배치하는 방식을 검토할 수 있습니다. 이 경우에도 실제로 필요한 시간이 확보되는지 확인합니다.
이 debounce가 없는 단일 Text Input(Input Box)으로 바꾸는 방법도 있습니다. Toast를 지연 단계로 사용한다면 필요한 timeout 뒤 didClose에서 수동 제출 질의를 실행하도록 연결할 수 있습니다.
함수가 예상대로 동작하지 않습니다
코드 오류
입력과 계산을 단순하게 나누고, 동작하는 부분부터 차례로 복원하여 문제가 생기는 위치를 찾습니다. 브라우저 DevTools가 열린 상태에서 함수에 debugger;를 넣고 Test하면 그 위치에서 변수와 실행을 조사할 수 있습니다.
실행 시점과 캐시
Slate 함수는 일반적으로 직접 호출하기보다 의존 그래프가 입력 변화에 따라 실행하고 결과를 후속 노드에 제공합니다. 이벤트에서 FUNCTION_NAME.run을 연쇄 호출하는 패턴보다 상류 질의나 변수값을 갱신하는 구성을 우선 검토합니다.
입력이 없는 함수는 Recalculate만으로 다시 실행되지 않을 수 있습니다. 같은 매개변수의 결과가 캐시되어 있으면 계산 대신 그 값을 사용합니다. 정기적으로 다시 계산해야 한다면 주기마다 달라지는 타이머 변수나 timestamp 등 실제로 변하는 입력을 제공합니다.
GeoJSON이 표시되지 않습니다
Map의 GeoJSON 형식과 Shape Source를 확인합니다. Raw이면 shapeGeoJson에 객체를, Server Resource이면 접근 가능한 shapeUrl을 연결합니다.
기하 정보를 직접 만들었다면 유효한 GeoJSON인지 확인합니다. 플랫폼 인스턴스의 GeoJSON in the Map Widget 예제를 참고할 수 있으며 예제가 없으면 지원 이슈로 요청합니다.
스타일이 적용되지 않습니다
브라우저 Inspect에서 해당 DOM 요소의 class와 계층 및 실제 적용 CSS를 확인합니다. 스타일의 범위, 선택기의 구체성과 위젯 스타일 및 앱 스타일의 충돌을 구분합니다.
처음에 작은 상자로 표시됩니다
resize를 실행하면 크기가 맞아지는 경우에는 부모 Flex 설정과 자식의 CSS width/height 퍼센트 규칙이 충돌하는지 확인합니다. 렌더 시 부모의 크기를 결정하지 못해 작은 크기가 적용될 수 있습니다.
반응형 배치는 부모와 자식의 Flex 설정을 사용합니다. 자식부터 부모까지 올라가며 별도로 둔 위치와 크기 CSS를 정리합니다. 내부 간격에는 margin과 padding을 사용할 수 있으며 필요한 세부 Flexbox 규칙은 Inspector로 실제 요소를 확인하여 적용합니다.
인쇄하거나 앱을 내보내고 싶습니다
Slate가 모든 사용자 레이아웃을 자동으로 인쇄용 화면으로 바꾸지는 않습니다. 단순히 선택 상태를 보관하거나 발표 중 다시 열 목적이라면 공유 뷰를 사용할 수 있습니다. 공유 뷰는 홈 페이지의 상호작용 상태와 Local 변수에 한정되며 Shared 변수는 포함하지 않습니다.
특정 위젯의 PNG/PDF는 exportWidget의 지원 범위를 확인합니다. 전체 앱 인쇄에는 별도의 인쇄용 CSS를 구성할 수 있습니다.
@media print {
@page { size: A4; }
html, body, .ws-root-container.ws-sandbox {
height: 600mm !important;
}
sl-app-view-actions {
display: none !important;
}
}
600mm 높이는 예제 설정이며 실제 인쇄 범위에 맞게 정합니다. 복잡한 반응형 앱은 필요한 입력을 URL로 받아 단순하게 표시하는 별도 Print View 앱을 만들 수도 있습니다. 이 방식에는 추가 개발과 유지보수가 필요합니다.
초기 로드나 편집 화면이 느립니다
브라우저가 처리하는 DOM, JavaScript와 질의 결과 메모리를 함께 봅니다. 하나의 함수나 질의가 원인인지 Dependencies의 Time in node로 살펴볼 수 있습니다.
한 앱에 모든 업무를 담기보다 범위가 작은 앱을 만들고 링크로 연결하는 방식을 검토합니다. 사용자의 브라우저 자원과 표시할 데이터 규모에 맞게 나눕니다.
앱이 너무 커서 저장되지 않습니다
Slate 앱 구성 JSON의 기본 한도는 UTF-8 기준 2,000,000바이트입니다. 문자 개수 한도가 아니며 넘으면 저장에 실패합니다. JSON 내보내기로 큰 구성 요소를 살펴볼 수 있습니다.
| 원인 | 대응 |
|---|---|
| Base64 이미지 | 통합 앱은 이미지를 Foundry 리소스에 올리고 Image 위젯으로 참조할 수 있습니다. 공개 앱은 앱 내장 조건을 유지하며 포함할 이미지의 크기를 줄입니다. |
| 큰 Slate 함수 | 공통 처리를 함수 라이브러리로 분리하거나 Platform editor의 Foundry 함수로 옮길지 검토합니다. |
| 큰 함수 라이브러리 | 앱의 페이지들이 라이브러리를 공유하더라도 파일 자체가 클 수 있습니다. 중복을 줄이고 외부 라이브러리의 minified 버전을 검토합니다. |
앱을 다른 환경으로 배포할 때에는 Marketplace 패키징의 의존성과 지원 범위도 함께 확인합니다.