# OutSystems Platform 모범 사례
이 문서는 OutSystems 애플리케이션을 개발할 때 적용할 수 있는 모범 사례와 규칙들을 모아놓은 것입니다. 이것들은 권장사항일 뿐이며, 각 환경과 개발 스타일에 맞게 조정해야 합니다.
## 네이밍 및 코딩 규칙
### 표준 언어
코드와 주석에는 영어를 사용하세요.
### 네이밍 규칙
- 의미 있는 이름 사용 (예: "Cstr" 대신 "Customer")
- PascalCase 사용
- Foreign Key에는 "Id" 접미사 사용 (예: "CustomerId")
- Record 이름에 Entity 이름 포함 (예: "record" 대신 "Customer")
- Screen을 접두사로 그룹화 (예: "Customer_Edit", "Customer_Show")
- Timer에 의해 호출되는 Action에는 "Timer_" 접두사 사용
- ShowRecords, EditRecords, TableRecords의 Name 속성 설정
### 코딩 규칙
- 빈 라벨과 설명 피하기
- 불분명하거나 복잡한 로직에 주석 달기
- Expression의 예시 문자열 설정
- Action Flow를 수직적이고 깔끔하게 유지
- 하드코딩된 값 대신 Static Entity 사용
## 재사용성
- Server Action으로 로직 재사용
- Block으로 화면 부분 재사용
- User Function으로 데이터 포맷팅 캡슐화
- RefreshQuery를 사용하여 Query 재실행
## JavaScript, CSS, HTML
- JavaScript에 주석 달기
- 크로스 브라우저 JavaScript 사용
- 중복된 CSS 스타일 피하기
- 가능할 때마다 JavaScript와 CSS 압축하기
## 데이터베이스
- 하나의 Entity에 수백 개의 속성을 갖지 않기
- 큰 속성 피하기 (예: 길이가 2000을 초과하는 텍스트 속성)
- Entity에 대한 Foreign Key의 Delete Rule 확인
- Is Mandatory 속성 설정 기억하기
- 최소한 Entity에는 설명 추가하기
## Aggregate와 Advanced Query
### Query
- Aggregate 사용: 최적화되어 있고 데이터베이스 독립적입니다!
- Query 출력을 반복할 때 인덱스([i]) 사용 피하기
- 실행해야 하는 Query 수 최소화
- Aggregate에서 타입 캐스트 피하기
### Advanced Query
- 절대적으로 필요한 경우에만 Advanced Query 사용
- SQL에서 하드코딩된 값 대신 Parameter 사용
- SQL 코드를 일관되게 들여쓰기
- SQL에 주석과 인라인 주석 사용
- 대량 작업에는 Advanced Query 사용
- SQL에 비즈니스 로직 넣지 않기
- Inline Parameter에는 EncodeSQL 내장 함수 사용
- Advanced Query는 데이터베이스별로 다르다는 점 유의
## 변화에 대비한 구축
- SQL Query보다 Aggregate 선호
- SQL Query는 유지보수가 더 어렵다는 점 유의
- 사용자 정의 HTML/JavaScript 생성 피하기
- 기능을 다른 Web Screen으로 분할
- 비즈니스 로직 구현에 Extension 사용하지 않기
## 사용자 인터페이스
- 사용자를 관찰하여 개선이 필요한 부분 찾아내기
- 모듈 내 이미지 크기 줄이기
## 아키텍처
3계층 접근 방식 사용:
- **Business Process**: 사용자나 비즈니스 프로세스가 사용할 수 있는 서비스
- **Core Entity**: 책임별 운영의 논리적 그룹화
- **Connector**: 다른 시스템과의 Extension이나 통합
또한:
- Extension을 모듈로 래핑
- 모듈 간 순환 참조 피하기
- 각 모듈의 책임을 명확히 정의
- 사용하지 않는 참조 제거
- Server Action에서 비즈니스 로직 캡슐화
- 사용자 스토리 기반 인터페이스 생성
- 데이터 모델을 한 모듈에 격리하지 않기. 모듈은 아키텍처 단위가 아닌 기능 단위여야 합니다.
- 가능할 때 비동기 로직 사용
## 팀워크
- 프로젝트에 권장되는 프로젝트 팀 파악 (The Talent Playbook 참조)
- 각 팀원마다 단일 사용자 사용
- 팀의 모든 구성원이 동일한 Service Studio 버전 사용
- 애플리케이션 버전 관리에 LifeTime 사용
- 단일 모듈 게시 피하기: LifeTime 사용
- 테스트 없이 핫픽스 적용 피하기 (Apply a Hotfix 참조)
- 동시에 같은 요소에서 작업하는 것 피하기
- 업무 시간 중 Production 배포 피하기
- 활성 로그 모니터링을 위한 팀 프로세스 생성
- 데이터 업데이트 스크립트 같은 수동 배포 절차를 위한 팀 프로세스 생성
- "완료"의 의미 정의하고 테스트 포함
## 로직 및 개발
- 사용하지 않거나 중복된 코드 제거
- 4MB보다 큰 모듈은 잘못된 아키텍처를 나타낼 수 있음 (How to reduce the size of my modules 참조)
- Web Screen에서 최소한 하나의 기본 버튼 설정
- 로직에서 Site Property 값 변경 피하기
- 무한 재귀 주의하기
- 정당한 이유가 있을 때만 경고 숨기기
- 한 모듈에 20개 이상의 Site Property는 보통 잘못된 설계를 의미
- Web Service 소비만을 위한 Extension 사용 피하기
- Production에서 Extension의 감사 비활성화
## 보안
- Screen의 Role 설정
- 민감한 데이터 교환 인식
- Screen Parameter에 민감한 정보 보내지 않기
- 기억하기: Traditional Web에서는 Screen의 변수나 Preparation 출력이 URL이나 Viewstate에 노출될 수 있습니다.
- 해당되는 경우 민감한 정보에 SSL 사용
- 권한 제어를 Screen Widget 인터페이스에만 의존하지 않기
- Screen Action 실행 전 사용자의 Role 검증
- 데이터베이스에서 암호화된 패스워드 사용
- UI Flow와 Web Service에 Internal Access Only 사용
- Reactive Web 특정 보안 모범 사례 확인
## 성능
### 데이터 모델
- Entity에 인덱스 생성
- 큰 Text와 Binary Data를 다른 Entity에 격리
- 큰 Excel 파일 성능 주의
- Entity의 Delete Rule 잘 활용하기
- 오래된 데이터를 별도 Entity에 보관
### 인프라스트럭처
- 데이터베이스 유지보수 계획 설정
- 웹 서버 메모리 설정 구성
- 데이터베이스 트랜잭션 로그 자주 백업
- 데이터베이스 파일 증가 조정
- 가상 메모리 및 시스템 설정 적용
- Timer 전용 서버 사용
- 64비트 아키텍처 선호
- Timer 스케줄 계획 및 모니터링하여 충돌하는 스케줄이 없도록 하기
### 로직
- Service Center 리포트 확인
- 장시간 실행되는 Timer와 배치 작업 피하기
- Traditional Web에서 Screen Preparation 단순화
- Session Variable에 가능한 한 적은 정보 배치
- Server Action에서 격리된 Aggregate 사용 피하기
- Traditional Web에서 Preparation의 If 분기 내부에서 Query 사용 피하기
- 연쇄된 Web Service 호출 피하기. 단일 호출로 가능한 한 많이 반환하기
### Query
- 연결된 서버를 통한 조인 수행하지 않기
- 데이터베이스에서 가져오는 필드 수 최소화
- 필요에 맞게 Max Records 일관성 유지
- Query를 한 번 반복하고 인덱스([i]) 사용 피하기
- 실행되는 Query 수 최소화
### 참조
- 모듈 간 순환 참조 생성하지 않기
- Local Web Service 또는 Public Action 중 현명하게 선택
- Connection Pooling 사용
### 사용자 인터페이스
- Traditional Web에서 Screen Action에서 Preparation 데이터 사용 피하기
- 복잡한 Screen을 만드는 대신 여러 Screen 사용
- 캐시, 캐시를 활용하세요!
- Screen Parameter 최소화
- JavaScript 파일을 리소스로 가져오기
- 로딩 시점에 필요하지 않은 JavaScript Block을 하단으로 이동
- CSS Sprite Image 사용
## 일반적인 패턴과 예시
다음은 예시로 사용하거나 참조할 수 있는 여러 오픈 앱의 간단한 목록입니다:
- 계층적 트리 예시: Directory
- 태그 구현 예시: Documents
- 파일 저장 (바이너리 데이터) 예시: Documents
- 연간 달력: Time Sheets
- 차트: Sales
- Email POP 사용: Cases
개발 시간을 단축할 구성 요소를 다운로드하려면 Forge를 확인하세요.
더 많은 학습 리소스는 OutSystems Training 영역을 확인하세요.