AppDev 서비스 시작하기¶
AppDev 서비스는 사용자가 웹 기반의 서비스를 손쉽게 개발할 수 있도록 REST API 및 웹 UI 기능을 개발하고 테스틑할 수 있는 환경을 제공합니다.

개발된 결과는 세렝게티 환경에서 동작될 수 있을 뿐만 아니라, 개발 환경에서 지원하는 기능을 통해 별도의 Docker 이미지로 재작해서 별도의 운영 환경에서 실행할 수 있습니다.
1. 용어설명¶
- 프로젝트 : 프로젝트는 AppDev 서비스에서 작성하는 API 또는 웹 서비스를 제공하기 위한 기본 단위입니다. 프로젝트에는 src, assets, modules 라는 3개의 하위 디렉토리로 구성되고 대부분의 코드 작업은 src 경로를 통해서 생성하게 됩니다.
- 소스정보 : 소스 정보는 프로젝트를 구성하는 스크립트, 워크플로우 및 일반 파일 등을 관리합니다.
- 스크립트 : 프로젝트에서 필요한 백엔드 실행 기능을 제공하며 세렝게티의 어플리케이션 기능을 활용합니다.
- 워크플로우 : 다양한 어플리케이션 스크립트를 조합하여 필요한 로직을 실행하며 세렝게티의 워크플로우 기능을 활용합니다.
- 폴더 : 소스 정보를 폴더 단위로 분류할 때 사용합니다.
- 파일 : src나 assets 시스템 폴더에 첨부 파일로 등록해서 활용합니다.
2. 화면 구성¶
AppDev 서비스를 이용하기 위한 주요 화면 구성은 다음과 같습니다.

메뉴 바(메뉴 목록)

- 메뉴별 설명은 아래와 같습니다.
- 새로운 프로젝트 등록
- 프로젝트 정보 저장
- 프로젝트 탐색기 창 보이기/감추기
- 터미널 창 보이기/감추기
- 소스(요소) 실행
- 소스를 개발 환경에서 실행
- 세렝게티 어플리케이션 보기
- 세렝게티 워크플로우 보기
- 실행 이력 보기
- 데이터 스토어 보기
- 기타 기능
- 사용자 정보 보기
- 테마 설정
- 로그 아웃
- 메뉴별 설명은 아래와 같습니다.
프로젝트 탐색기

기능별 설명은 아래와 같습니다.

- 프로젝트 이름을 클릭해서 프로젝트를 선택
- 구름 아이콘을 선택해서 현재 프로젝트 정보를 개발 환경으로 배포
- 설정 아이콘을 선택해서 현재 프로젝트의 정보 관리
- 프로젝트 펼침/닫음

- 프로젝트 정보 저장
- 프로젝트 탐색기 창 보이기/감추기
- 터미널 창 보이기/감추기

- 요소 이름을 선택하면 해당하는 요소에 대한 보기 또는 편집 화면으로 편집창 변경
- 설정 아이콘을 선택해서 현재 요소에 대한 관리
- 삭제 아이콘을 선택해서 현재 요소에 대한 삭제
편집창

프로젝트 관리 화면을 제공합니다.
- 프로젝트에 대한 상세 정보를 확인 및 제어 기능을 제공

프로젝트 구성 요소 정보 관리 화면을 제공합니다.
- 프로젝트 구성 요소에 대한 상세 정보 확인 및 관리 기능을 제공

프로젝트 구성 요소에 따른 소스 코드 편집 기능을 제공합니다.
- 구성 요소에 연결된 소스 코드를 에디터로 제공하고 제공
- 제공되는 에디터를 통해 필요한 코드에 대한 편집 및 저장 기능 제공
- 설정 아이콘을 통해 소스 코드와 연결된 구성 요소 관리 화면 이동 기능 제공
- 탐색 아이콘을 통해 세렝게티 원본 정보 조회 화면으로 이동 기능 제공
터미널

사용자별로 제공되는 개발 환경의 터미널 화면
- 터미널을 통해서 개발 환경에 대한 성능 모니터링 및 로그 정보를 확인할 수 있음.

소스 코드에 대한 실행 결과 확인
- 소스 코드 실행을 통한 로그 정보 확인

구성 요소에 대한 정보 확인 및 소스 코드 실행 결과에 따른 미리 보기 화면 제공
- 구성 요소가 이미지, 동영상 등의 콘텐츠인 경우, 해당하는 콘텐츠 정보 보기 기능 제공
- 구성 요소가 HTML인 경우, 해당하는 HTML의 미리 보기 화면 제공
3. 프로젝트 관리¶
로그인¶
AppDev 서비스의 로그인은 세렝게티 서비스의 로그인 기능을 통해서 이루어지게 됩니다.
세렝게티에서 제공하는 로그인은 아래 화면과 같은 UI를 통해서 이루어지게 되며 동일한 Id와 암호 정보를 통해서 API 호출이 이루어지게 됩니다.

화면 하단의 터미널 연결이 완료되면 개발 환경에 대한 로딩이 완료된 상태가 됩니다.
로그아웃¶
AppDev 서비스의 로그 아웃은 세렝게티 서비스에 로그인된 세션 정보를 삭제하고 초기화 시키게 됩니다.
로그아웃을 하게 되면, 로그인 과정에서 생성된 세션 키에 해당하는 AccessKey, SecretKey를 더 이상 사용할 수 없게 됩니다.

프로젝트 관리¶
소스 코드 정보를 관리하기 위한 최상위 정보 관리 기능을 제공하며 용도에 따라서 활용할 수 있도록 src, assets, modules라는 3개의 기본 디렉토리로 구성됩니다.
기본 정보¶
주요 정보
- 프로젝트 이름 : 프로젝트 목록에 나타나는 이름으로 프로젝트 관리를 위해서 사용합니다. 프로젝트 이름은 중복될 수 없습니다.
- 프로젝트 실행 경로 : 프로젝트에 등록된 소스 코드를 다른 프로젝트의 소스 코드와 구분해서 사용할 수 있도록 프로젝트를 다른 프로젝트와 구분합니다. API 호출 시, 프로젝트별로 구분되는 실행 경로를 지정해야 합니다. 프로젝트 실행 경로는 중복될 수 없습니다.
- 프로젝트 실행 경로는 URI 등록 규칙에 따라서 설정되어야 합니다.
- 일반적으로 단일 단어로 구성되지만 서브 경로를 포함해도 됩니다.
- 기본 실행 코드 : 프로젝트 실행 경로 정보만 입력해도 기본적으로 실행되는 실행 코드를 지정합니다. 실행 코드는 소스 코드에 할당된 소스의 호출 경로명을 지정합니다.
주요 기능
프로젝트 이름 중복 확인 : 사용자 계정에서 사용하는 다른 프로젝트와 이름이 중복되는지 확인합니다. 프로젝트 이름이 변경되는 경우, 중복 여부를 확인해야 저장이 될 수 있습니다.
프로젝트 경로 중복 확인 : 프로젝트의 실행 경로는 사용자 내부에서 중복될 수 없습니다. 실행 경로 정보가 변경되는 경우, 중복 여부를 확인해야 저장이 될 수 있습니다.
기본 실행 코드 확인 : 사용자가 기본 실행 코드를 설정한 경우, 해당하는 코드가 실제 존재하는지 확인합니다. 해당하는 정보가 변경된 경우, 해당하는 기본 코드가 존재하는지 반드시 확인해야 합니다.
프로젝트 이미지 생성 : 프로젝트 정보를 Container 이미지로 변환해서 저장합니다.

- 프로젝트 이미지 저장소 이름 : 프로젝트를 Conatainer 이미지로 변환할 때 사용할 저장소 이름
- 프로젝트 이미지 태그 : 프로젝트를 Container 이미지로 변환할 때, 이미지별 버전 구분을 위해서 사용한 버전 정보
- 프로젝트 이미지 생성 : 개발 환경에 배포된 프로젝트 정보를 이용해서 컨테이너 이미지를 생성합니다. 생성된 이미지는 내부 이미지 저장소에 저장되고 자원 관리를 통해서 사용자 이미지로 확인할 수 있습니다.
정보 저장 : 설정된 프로젝트 정보를 저장합니다.
설정 초기화 : 마지막으로 저장된 상태로 변경된 정보를 복구합니다.
폴더 정보¶
폴더 정보는 src, assets, modules의 3가지로 구성이 되며, 사용되는 목적이 각각 구별이 됩니다.
- 소스 폴더(src)
- 실행을 위한 소스 코드를 등록하며, 사용자가 등록하는 HTML/Javascript 또는 세렝게티에서 제공하는 어플리케이션 스크립트와 워크플로우를 지정할 수 있습니다.
- 그 외에 자산 폴더에 등록하는 파일들도 소스 폴더에 등록이 가능합니다.
- 추가 파일 폴더(assets)
- 소스 파일에 참조하는 이미지 및 스타일 파일과 같은 정적 콘텐츠를 등록합니다.
- 라이브러리 폴더(modules)
- 프로젝트에서 참조하는 정적 모듈을 등록하기 위해서 사용되며 주로 소스 코드에서 참조하는 라이브러리(*.jar)를 등록합니다.
요소 정보¶
요소 정보는 프로젝트에 등록된 요소를 관리합니다. 프로젝트 트리에서 선택된 요소 타입에 따라서 적절한 편집 및 조회 기능을 제공합니다.
- 주요 정보

- 소스 이름 : 요소 정보를 관리하기 위한 관리 이름으로 파일 또는 폴더를 업로드하는 경우에는 해당하는 파일 이름이나 폴더 이름이 기본값으로 지정됩니다.
- 프로젝트 구성 타입
- 소스 코드 : src 폴더 타입의 구성 요소
- 추가 파일 : assets 폴더 타입의 구성 요소
- 라이브러리 : modules 폴더 타입의 구성 요소
- 호출 경로 : 소스 코드에 접근하기 위한 경로 정보를 설정합니다. 해당하는 경로는 프로젝트에서 중복될 수 없습니다. 모든 호출 경로는 부모 경로에 대한 상태 경로로 사용이 됩니다.
- 프로젝트 요소 유형 : 요소 정보로 등록된 요소의 유형에 대한 정보를 지정합니다.
- 직접 등록 : 사용자가 업로드하거나 직접 작성하는 콘텐츠로 이미지, CSS와 같은 정적 파일이나 HTML/Javascript와 같은 UI 파일들을 의미합니다.
- 어플리케이션 스크립트 : 세렝게티에서 생성되고 관리되는 어플리케이션 스크립트를 지정합니다.
- 비지니스 워크플로우 : 세렝게티에서 생성되고 관리되는 워크플로우를 지정합니다.
- 어플리케이션 첨부 파일 : 세렝게티에서 생성되고 관리되는 어플리케이션 첨부 파일을 지정합니다.
- 폴더 : 하위 폴더를 생성하기 위해서 지정합니다.
- 소스 설명 : 요소에 대한 설명을 지정합니다.
- 주요 기능
- 소스 실행 경로 검증 : 소스 실행 경로의 중복 여부를 검사하여 중복 여부를 확인합니다. 중복되는 경로 정보는 사용될 수 없습니다.
- 원복 소스 상세 정보 조회 : 세렝게티에서 관리되는 정보에 대한 상세 내역을 확인하기 위해서 세렝게티 관리 화면으로 이동합니다.
- 원본 소스 선택 : 요소 정보를 지정할 세렝게티의 어플리케이션 스크립트, 첨부 파일 또는 워크플로우를 지정합니다.

4. 프로젝트 활용¶
프로젝트를 활용하는 방법은 프로젝트 생성에서 실행하고자 하는 소스 코드 생성 및 개발 환경 배포, 마지막으로 실행 이미지 생성 및 컨테이너 실행의 과정을 거치게 됩니다.
- 프로젝트 생성
- 소스 코드 생성
- 구성 요소 생성
- 소스 코드 편집
- 소스 코드 실행 및 테스트
- 개발 환경 배포
- 실행 이미지 생성
- 컨테이너 실행
위의 단계를 통해서 AppDev에서 개발된 코드가 실제 운영 환경에서 동작되게 됩니다.
본 가이드에서는 실행 이미지 생성까지를 설명하고 실제 컨테이너 실행은 가이드의 자원 관리 부분을 참조해 주시기 바랍니다.
4.1. 프로젝트 생성¶
프로젝트 생성은 메뉴 목록의 새로운 프로젝트 등록(
) 메뉴를 선택해서 새로운 프로젝트를 등록합니다.
해당하는 버튼을 선택하면 아래와 같이 새로운 프로젝트를 등록할 수 있도록 편집 창이 나오게 되며, 가이드에 따라서 프로젝트 생성에 필요한 정보를 입력하고 중복 확인을 수행한 후 프로젝트를 등록합니다.

프로젝트가 정상적으로 등록되면 프로젝트 탐색기에 등록한 프로젝트가 출력이 됩니다.
4.2. 소스 코드 생성¶
소스 코드 생성을 위해서는 먼저 어플리케이션을 생성해야 합니다. 필요한 어플리케이션을 생성하기 위해서는 메뉴 목록의 어플리케이션 관리(
) 메뉴를 선택해서 어플리케이션 관리 화면으로 이동합니다.
어플리케이션 관리 기능은 세렝게티에서 제공하는 어플리케이션 기능과 동일하기 때문에 상세한 설명은 소프트웨어 관리하기를 통해서 확인하시기 바랍니다.
어플리케이션 등록을 위해서는 아래 화면에서 소프트웨어 등록 버튼을 통해서 새로운 어플리케이션을 등록할 수 있습니다.

어플리케이션이 등록되면 해당하는 어플리케이션의 스크립트를 소스 코드로 활용할 수 있습니다 다음은 어플리케이션 등록을 위한 주요 화면 입니다.
- 어플리케이션 기본 정보

- 실행 스크립트(들)

- 실행 스크립트 등록 화면

어플리케이션 등록에 필요한 정보를 입력하고 저장해서 새로운 어플리케이션을 만들 수 있습니다.
어플리케이션에 포함되는 스크립트들은 “스크립트(들)” 관리 탭을 통해서 등록하고 편집할 수 있습니다.
4.3. 구성 요소 생성¶
구성 요소의 생성을 위해서 생성된 프로젝트를 프로젝트 탐색기에서 선택합니다.
프로젝트가 선택되면 선택된 프로젝트는 자동으로 제목이 하이라이트가 되며, 구성 요소 등록을 위해서는 src 폴더 우측의 추가 버튼(
)을 선택해서 추가할 수 있습니다.
출력된 구성 요소 추가 화면에서 소스 코드를 추가하기 위해서는 프로젝트 요소 유형을 “어플리케이션 스크립트”로 선택하고 원본 소스 선택 버튼을 눌러서 새로 생성한 어플리케이션의 스크립트를 검색해서 선택하면 됩니다.
구성 요소를 API 로 호출하기 위해서 API호출에 필요한 경로명을 지정해야 합니다.
해당하는 경로명은 중복되지 않도록 설정해야 합니다.
정보 지정 및 검증을 통해서 필요한 정보를 설정하고 저장하면 구성 요소 생성이 완료가 됩니다.
4.4. 소스 코드 편집¶
소스 코드 편집은 프로젝트에 등록된 구성 요소를 프로젝트 탐색기에서 선택해서 편집할 수 있습니다.
src 폴더에 등록된 구성 요소를 클릭하여 선택하면 해당하는 구성 요소에 연결된 스크립트가 편집창에 출력이 됩니다.

편집창에서 필요한 코드 작성 후 Ctrl+S 단축키를 통해서 저장하거나 메뉴 목록의 저장 버튼을 선택해서 편집 내역을 저장할 수 있습니다.
4.5. 소스 코드 실행 및 테스트¶
소스 코드 실행은 현재 편집창에 열려 있는 코드를 실행하고 실행된 결과를 디버깅 창을 통해서 확인하는 기능입니다.
작성된 코드가 의도한 대로 실행이 되어 원하는 결과를 제공하는지 확인할 수 있습니다.
시스템 코드에서 print 문장을 통해서 생성된 결과가 디버깅 창을 통해서 출력이 됩니다.

실행 단계에서는 사용자가 원하는 입력 조건을 생성할 수 없기 때문에 입력 조건에 대한 부분은 가상의 입력 값으로 처리해며 해당하는 기능은 추후 업그레이드 될 예정입니다.
4.6. 개발 환경 배포¶
개발 환경 배포는 프로젝트 탐색기의 기능을 통해서 이루어지게 됩니다. 프로젝트 탐색기의 구름 아이콘을 선택해서 선택된 프로젝트에 저장된 내용을 개발 환경에 배포할 수 있습니다.
사용자에게 배포 완료 후, 알림 메시지를 출력하여 배포 상태를 알려줍니다.

4.7. 실행 이미지 생성¶
사용자가 생성한 프로젝트 단위로 이미지를 생성할 수 있습니다.
프로젝트 탐색기를 통해서 선택한 프로젝트 설정 화면에서 “프로젝트 이미지 생성” 버튼을 선택해서 이미지를 생성할 수 있습니다.
이미지 생성에 필요한 저장소 이름 및 버전에 해당하는 테크 정보를 등록하고 이미지를 생성합니다.
생성된 이미지는 사용자별 이미지로 저장되고 자원 관리에서 조회하여 필요한 컨테이너를 생성할 때 선택하여 생성할 수 있습니다.
4.8. 컨테이너 실행¶
컨테이너 실행을 위한 자원 관리 기능은 “클라우드 자원 관리”에서 자세하게 설명하기 때문에 본 절에서는 생성된 프로젝트 이미지를 실행하기 위한 기능에 대해서만 간략하게 설명합니다.
컨테이너 실행을 위해서는 세렝게티의 “클라우드 자원” 메뉴의 “인스턴스 관리” 메뉴로 이동해야 합니다.
인스턴스를 생성하기 위해서는 화면 상단의 “인스턴스 생성” 버튼을 통해서 컨테이너 실행을 위한 마법사 화면으로 이동합니다.
마법사 화면은 총 5단계로 구성이 되며, 컨테이너 이미지가 등록된 클라우드 선택 후 이미지를 선택하여 자원을 생성하는 순서로 실행이 됩니다.
각각의 단계에 대한 설명은 다음과 같습니다.
클라우드 선택
이미지가 등록된 클라우드 정보를 선택합니다.
사용자 이미지는 쿠버네티스 기반의 클라우드 이미지로 등록되기 때문에 쿠버네티스 클라우드를 선택하면 됩니다.인스턴스 이미지 선택
프로젝트 이미지를 이미 컨테이너로 생성한 경우에는 붉은 박스처럼 이미지가 세렝게티에 이미 등록되어져 있고, 그렇지 않은 경우에는 사용자가 직접 이미지 저장소에서 이미지를 선택할 수 있다. 사용자가 이미지 저장소에서 이미지를 직접 선택하는 경우에는 파란 박스와 같은 형태로 지정할 수 있다.인스턴스 자원 스펙 선택
지정된 이미지로 실행될 컨테이너의 자원 스펙을 지정합니다.인스턴스 상세 설정
컨테이너 생성에 필요한 추가 정보를 지정합니다. 컨테이너 생성을 위해서 필수적으로 컨테이너 이름을 지정해야 합니다.
이미지 선택 단계에 이미지가 별도로 지정되지 않은 경우, 상세 설정에서 프로젝트 이미지를 지정할 수 있습니다.상세 설정 화면의 이미지 선택에서 사용자 이미지를 선택합니다.

사용자 이미지 중에서 컨테이너를 생성하고자 하는 프로젝트 이미지를 선택하세요.

설정 내용 검토
컨테이너 생성을 위해서 설정한 정보를 확인하고 수정할 내용이 있는지 검토합니다.별도로 검토할 내용이 없으면 화면 하단의 인스턴스 생성 버튼을 통해서 컨테이너를 생성합니다.
5. 데이터 스토어 연동¶
데이터 스토어는 세렝게티에서 관리하는 데이터 관리 기능을 제공하는 마이크로 서비스 입니다.
데이터 스토어는 내부적으로 JDBC 접속을 사용하기 때문에 기본적으로 Java 기반의 데이터 타입을 사용합니다.
데이터 스토어는 데이터베이스에 대한 연결과 데이터 베이스에 존재하는 테이블/컬럼 정보를 코드에서 보다 쉽게 이용할 수 있도록 해주는 라이브러리를 포함하고 있습니다.
데이터 스토어에 대한 사용법은 본문의 “6장 데이터 스토어 관리”를 통해서 확인할 수 있습니다.
AppDev에서 데이터 스토어 기능은 메뉴 목록에서 데이터 스토어 아이콘(
)을 선택해서 이동할 수 있습니다.
본 절에서는 간단하게 데이터 스토어를 활용해서 데이터를 조회하고 저장하는 방법에 대해서 간단히 설명하도록 하겠습니다.
5.1 데이터 스토어 활용 오브젝트¶
데이터 스토어를 이용하는데 있어서 자주 사용되는 용어에 대한 설명입니다.
- Environment : 세렝게티 코드 작성의 핵심으로 데이터 스토어에 대한 연결 정보를 포함하고 있으며 각종 변수에 대한 생성 및 유통 등의 라이프사이클 관리를 수행합니다. 코드를 작성할 때는 env 라는 값으로 활용이 됩니다.
- DataStore : 데이터 스토어를 의미하며 개념적으로 데이터베이스와 1:1의 관계를 갖고 있습니다.
- Source : 데이터 스토어에 저장된 데이터 저장 단위로 데이터베이스의 테이블에 해당합니다.
- SQL : 데이터 스토어에 SQL을 직접 실행하기 위해서 사용됩니다.
- Field : 데이터 소스에 저장된 필드 명을 의하며 테이블의 컬럼에 해당합니다.
- Value : 데이터 필드에 부여되는 값으로 조회, 데이터 변경 등에 데이터 필드와 함께 사용이 됩니다.
- Record : 조회 명령어를 통해서 조회된 결과 값
기본적인 Syntax는 with 구문을 통해서 각각의 오브젝트에 대해서 접근할 수 있습니다.
withDataStore(...)
.withSource(...)
.beginFields()
.withNewField(...)
.endFields()
.list()
5.1 데이터 스토어 연결¶
먼저 데이터 스토어에 등록된 데이터베이스 정보를 확인합니다.
원하는 데이터 베이스가 설정된 데이터 스토어 정보의 Alias를 통해서 이용할 수 있습니다.
env.withDataStore("execution")
“execution” 으로 등록된 데이터베이스의 데이터스토어를 사용한다는 뜻입니다.
5.2 데이터 조회¶
데이터 조회를 위해서는 조회 대상이 되는 데이터 소스 또는 SQL을 지정하고 list() 명령어를 통해서 조회할 수 있습니다. 실행된 결과는 Record 목록으로 반환이 됩니다.
예제 5.2.1. 데이터 소스를 활용한 데이터 목록 조회
def fields = env.withDataStore("shin-db") .withSource("test1") .beginFields() .withNewField("test1") .endFields(); def records = fields.list(); for (def record : records) { println(record.get(0)); }
예제 5.2.2. SQL을 활용한 데이터 목록 조회
import java.lang.*; def conn = "shin-db"; def records = env.withDataStore(conn) .withSql("select test1 col1, test1 col2 from test1") .list(); for (def record : records) { for (def index = 0; index < record.getFieldCount(); index ++) { println(record.getFieldName(index) + " => " + record.get(index)); } }
5.3 데이터 처리 (저장, 변경 및 삭제)¶
데이터 처리를 위해서는 데이터 소스에 변경/추가하고자 하는 컬럼에 해당하는 필드에 값을 설정한 후, insert(), update(), delete() 함수 호출을 통해서 데이터 조작을 할 수 있습니다.
예제 5.3.1. 데이터 저장
env.withDataStore("shin-db") .withSource("test1") .beginFields() .withNewField("test1", "33") .endFields() .insert();
예제 5.3.2. 데이터 변경
env.withDataStore("shin-db") .withSource("test1") .beginFields() .withNewField("test1", "44") .endFields() .beginWhere() .withNewField("test1", "33") .endWhere() .update();
예제 5.3.3. 데이터 삭제
env.withDataStore("shin-db") .withSource("test1") .beginWhere() .withNewField("test1", "44") .endWhere() .delete();
5.4 변수 처리 및 데이터 바인딩¶
데이터 스토어에 저장되는 모든 변수는 JDBC 기준의 데이터 타입을 활용합니다.
각각의 코드를 작성하는 경우, 사용하는 언어(주로 Groovy)의 타입을 JDBC 호환 기준으로 사용해야 합니다.
데이터 처리를 위해서 API 호출을 통해서 아래와 같은 호출이 됩니다.
호출 예시

curl --location 'https://serengeti-stage.aifrica.co.kr:30080/api.dev/dev/v1/service/administrator/test/api2' \
--header 'LoginId: administrator' \
--header 'SecretKey: AifricaSerengetiDevSecretkey' \
--header 'AccessKey: AifricaSerengetiDevAccesskey' \
--form 'files=@"/Users/chidae2000/Downloads/2755481-200.png"' \
--form 'files=@"/Users/chidae2000/Downloads/230530164017-01-donald-trump-230313-file.jpg"' \
--form 'payload="{
\"production\": true,
\"version\": \"1.0.0\",
\"profile\": \"aifrica\",
...
\"serviceTheme\": \"dark\"
"};type=application/json' \
--form 'test="testParameter"'
호출 시, 전달되는 파라미터들은 다음과 같이 처리됩니다.
- 첨부 파일 : 첨부 파일은 멀티 파일로 업로드할 수 있으며, 업로드 파일은 “files”라는 고정된 FormData 이름을 사용해야 합니다.
- 기타 파라미터 : 기타 파라미터는 사용자 요청에 따라서 파라미터를 추가로 지정해서 전달할 수 있습니다. 데이터 전달 시, 기본 형태(plain/text) 타입이 아닌 경우에는 type을 명시해야 합니다.
처리 코드 예시
import java.util.*;
for (def requestFile : env.getRequestFilePathList()) {
println("requestFilePath(" + requestFile + ")");
}
println(env.getVariable("payload"));
println(env.getVariable("test"));
실행 결과
requestFilePath(/tmp/2755481-200.png)
requestFilePath(/tmp/230530164017-01-donald-trump-230313-file.jpg)
{
"production": true,
"version": "2.5.21.0927",
"profile": "incheon.staging",
...
"serviceTheme": "vs-dark"
}
testParameter
6. API 연동¶
API 호출을 위해서는 프로젝트의 소스 코드로 만들어져야 합니다. 생성된 API는 프로젝트를 저장한 후, 배포하여 실행할 수 있습니다.
6.1. 로그인 API 호출¶
로그인을 위한 API 호출은 아래 규격을 통해서 호출이 가능합니다.
호출 규격
- Request Header
- Content-Type: application/json을 기본 타입으로 합니다.
- Request Body
- userId : 사용자 Id
- 사용자 생성 시 신청한 사용자 Id 정보입니다.
- password : 사용자 암호
- 사용자 생성 시 신청한 사용자 암호 입니다.
- userId : 사용자 Id
- Response Header
- 로그인 요청에 따른 사용자 인증 정보를 제공하며 해당하는 Header 속성은 다음과 같습니다.
- LoginId : 사용자 로그인 요청 시, 전달된 사용자 Id
- AccessKey : 사용자 인증을 위해서 로그인 마다 발급되는 인증 키
- SecretKey : 사용자 인증을 위해서 로그인 마다 발급되는 비밀 키
- 모든 API 요청에 대해서 위의 3가지 키 정보를 REST API의 Request Header에 추가해서 전송해야 합니다.
- 모든 API 요청은 Content-Type을 application/json 타입으로 전송해야 합니다.
- Multipart FormData의 경우, JSON 형태로 데이터를 전송하는 경우에는 해당 FormData의 Content-Type을 application/json으로 지정해야 합니다.
- 로그인 요청에 따른 사용자 인증 정보를 제공하며 해당하는 Header 속성은 다음과 같습니다.
- Response Body
- 출력 결과는 사용자 정보에 대한 상세 정보를 제공합니다. 상세 정보는 사용자의 기본 정보 및 권한 정보로 구성되며 서비스에서 사용하는 이용 환경에 정보를 포함합니다.
- Request Header
호출 예시
curl --location --request POST 'https://serengeti-stage.aifrica.co.kr:30080/api.login/auth/v1/handle/session/login' \ --header 'Content-Type: application/json' \ --data-raw '{ "userId": "administrator", "password": "dPtj!2Wkd" }'
호출 응답 예시
{ "hostGroupId": "20", "userId": "administrator", "username": "Administrator", "accessKey": null, "secretKey": null, "password": "", "status": "Enabled", "locale": "ko-kr", "setting": { ... }, "roles": [ { "role": "UserGeneral", "authority": "UserGeneral" }, ... { "role": "UserAdmin", "authority": "UserAdmin" } ], "accesses": null, "associatedGroups": [], "session": null, "endPoints": [] }
6.2. 로그아웃 API 호출¶
세렝게티에서 제공하는 로그 아웃 API는 로그인을 통해서 할당 받은 AccessKey와 SecretKey를 Request Header를 통해서 전송하여 실행이 됩니다.
호출 규격
- 로그인을 통해서 얻은 AccessKey, SecretKey 정보를 활용해서 API 호출이 이루어져야 합니다.
- Request Header
- Content-Type : multipart/form-data 를 사용하며 boundary 값은 실행 시 설정되어야 합니다.
- LoginId : 사용자 로그인 요청 시, 전달된 사용자 Id
- AccessKey : 사용자 인증을 위해서 로그인 마다 발급되는 인증 키
- SecretKey : 사용자 인증을 위해서 로그인 마다 발급되는 비밀 키
호출 예시
curl --location --request PUT 'https://serengeti-stage.aifrica.co.kr:30080/api.login/auth/v1/handle/session/logout' \ --header 'Loginid: administrator' \ --header 'AccessKey: 88bc8ca3-433d-40b1-9edb-1c6b998df46a' \ --header 'SecretKey: 12f65e93-b850-4d55-9511-cfb855f62ee4'
6.3. API 호출¶
세렝게티에서 제공하는 로그인은 아래 화면과 같은 UI를 통해서 이루어지게 되며 동일한 Id와 암호 정보를 통해서 API 호출이 이루어지게 됩니다.
호출 규격
- 로그인을 통해서 얻은 AccessKey, SecretKey 정보를 활용해서 API 호출이 이루어져야 합니다.
- API 호출 URL
- 호출 URL은 아래의 규격에 맞추어서 실행할 수 있습니다.
- 실행 규격 : https://{{AppDev 호출 도메인 및 포트}}/api.dev/dev/v1/service/{사용자 계정}/{프로젝트 호출 경로}/{소스 파일 실행 경로} (예시 : https://serengeti-stage.aifrica.co.kr:30080/api.dev/dev/v1/service/administrator/test/api2)
- AppDev 호출 도메인 및 포트 : API 호출 기능을 제공하는 도메인 정보(예시 : serengeti-stage.aifrica.co.kr:30080)
- 사용자 계정 : AppDev 서비스에 로그인하 사용자 Id(예시 : administrator)
- 프로젝트 실행 경로 : 프로젝트에 지정된 실행 경로 정보(예시 : test)
- 소스 파일 실행 경로 : 소스 파일에 설정된 실행 경로(예시 : api2)
- Request Header
- Content-Type : multipart/form-data 를 사용하며 boundary 값은 실행 시 설정되어야 합니다.
- LoginId : 사용자 로그인 요청 시, 전달된 사용자 Id
- AccessKey : 사용자 인증을 위해서 로그인 마다 발급되는 인증 키
- SecretKey : 사용자 인증을 위해서 로그인 마다 발급되는 비밀 키
- Request Body
- files : 전송하고자 하는 파일을 위해 사용합니다. 복수개의 파일을 전송하는 경우, 동일한 form-data 명을 사용해서 전송해야 합니다.
- payload : 파일 이외의 데이터를 전송하는 경우, 전송하고자 하는 정보를 payload form-data로 전송합니다. payload는 경우는 API 활용 목적에 따라서 데이터를 전송할 수 있으며 문자열 데이터로 전송이 되어야 합니다.
- 전송되는 데이터 유형에 따라서 Content-Type을 form-data에 설정해 주어야 합니다. 일반적으로 JSON 형태의 문자열 데이터를 전송하는 경우에는 application/json 형태로 전송하며 일반 텍스트로 전송하는 경우에는 plain/text 형태로 전송합니다.
- 전달하는 데이터와 Content-Type이 일치하지 않는 경우, 데이터 전송에 오류가 발생할 수 있습니다.
호출 예시
curl --location 'https://serengeti-stage.aifrica.co.kr:30080/api.dev/dev/v1/service/administrator/test/api2' \ --header 'LoginId: administrator' \ --header 'SecretKey: AifricaSerengetiDevSecretkey' \ --header 'AccessKey: AifricaSerengetiDevAccesskey' \ --form 'files=@"/Users/chidae2000/Downloads/Container-Engine.png"' \ --form 'files=@"/Users/chidae2000/Downloads/apache_logo_icon_168630.png"' \ --form 'payload="{ \"production\": true, \"version\": \"2.5.21.0927\", \"profile\": \"incheon.staging\", \"serviceTheme\": \"vs-dark\", \"serviceAppRuntimeEndPoint\": \"/be.runtime/dev/v1/service/\", \"serviceWebsocketProtocol\": \"ws://\", \"serviceHttpProtocol\": \"http://\", \"serviceLoginCoreEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.login/auth/v1/handle/\", \"serviceAppDevEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.dev/dev/v1/handle\", \"serviceAppDevWsEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.dev/ws\", \"serviceEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/\", \"serviceDomainEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/\", \"serviceAppEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.app/app/v1/handle/\", \"serviceAppServiceEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.dev/dev/v1/service/\", \"serviceConsoleEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.console/console/v1/handle/\", \"serviceDatastoreEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.datastore/datastore/v1/handle/\", \"serviceCodeEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.config/config/v1/handle/\", \"serviceResourceEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.resource/resource/v1/handle/\", \"serviceTemplateEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.template/\", \"serviceTaskEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/be.rstask/backend/v1/resource-task/handle/\", \"serviceExecutionEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/be.execute/backend/v1/execute/handle\", \"serviceNotificationEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.notification/\", \"serviceVariableEndPoint\": \"https://serengeti-stage.aifrica.co.kr:30080/api.scheduler/scheduler/v1/handle/task/variable\", \"serviceMonacoEndPoint\": \"wss://serengeti-stage.aifrica.co.kr:30080/monaco-editor\" }";type=application/json'
응답 예시
- 응답 결과는 호출되는 API에 따라서 다를 수 있으며, 응답 결과의 Content-Type은 application/octet-stream으로 전송이 됩니다.
API2 { "production": true, "version": "2.5.21.0927", "profile": "incheon.staging", "serviceTheme": "vs-dark", "serviceAppRuntimeEndPoint": "/be.runtime/dev/v1/service/", "serviceWebsocketProtocol": "ws://", "serviceHttpProtocol": "http://", "serviceLoginCoreEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.login/auth/v1/handle/", "serviceAppDevEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.dev/dev/v1/handle", "serviceAppDevWsEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.dev/ws", "serviceEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/", "serviceDomainEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/", "serviceAppEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.app/app/v1/handle/", "serviceAppServiceEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.dev/dev/v1/service/", "serviceConsoleEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.console/console/v1/handle/", "serviceDatastoreEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.datastore/datastore/v1/handle/", "serviceCodeEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.config/config/v1/handle/", "serviceResourceEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.resource/resource/v1/handle/", "serviceTemplateEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.template/", "serviceTaskEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/be.rstask/backend/v1/resource-task/handle/", "serviceExecutionEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/be.execute/backend/v1/execute/handle", "serviceNotificationEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.notification/", "serviceVariableEndPoint": "https://serengeti-stage.aifrica.co.kr:30080/api.scheduler/scheduler/v1/handle/task/variable", "serviceMonacoEndPoint": "wss://serengeti-stage.aifrica.co.kr:30080/monaco-editor" } API@ API!!