본문으로 건너뛰기

액션 (Actions)

데이터베이스 작업의 사용자 정의.

소개​

항상 어떤 데이터 조작이 이루어지며, 다음과 같은 규칙이 있는 경우가 흔합니다:

  • 고객을 삭제하면 해당 고객의 이력을 함께 삭제해야 합니다.
  • 제품을 취소하면 주문에서 해당 제품을 제거하고 총액을 조정해야 합니다.
  • 구매를 완료하면 배포를 수행하는 다른 시스템으로 데이터를 전송해야 합니다.

액션(actions)은 바로 이러한 용도로, 데이터 조작이 발생하는 특정 상황에서 실행할 코드를 주입하는 데 사용됩니다.

정보를 삽입하거나 변경하면 저장(save) 및 저장됨(saved) 액션이 실행됩니다:

  • save: 데이터베이스 명령을 실행하기 전.
  • saved: 데이터베이스 명령을 실행한 후.

반면 정보를 제거, 삭제 또는 말소하면 제거(remove) 및 제거됨(removed) 액션이 실행됩니다.

  • remove: 데이터베이스 명령을 실행하기 전.
  • removed: 데이터베이스 명령을 실행한 후.

따라서 양식에서 무언가를 변경할 때 정보 생성, 변경 또는 제거 작업에 따라 데이터베이스에서 서로 다른 작업이 실행되고, 해당 액션(actions)이 실행됩니다.

데이터베이스 _트리거_에 대해 들어본 적이 있나요? 데이터베이스 _트리거_는 데이터 수정이 있을 때마다 실행됩니다. 따라서 액션(actions)은 _트리거_와 유사하지만 코드 수준에서 동작합니다.

각 작업 유형은 데이터베이스에서 서로 다른 명령을 실행한다는 점을 기억하세요. 명령은 다음과 같습니다:

  • 생성: insert into ...
  • 변경: update ...
  • 제거: delete from ...

이러한 데이터베이스 명령 중 하나를 _db.execute(...)를 통해 실행하면 액션과 상호작용할 수 없기 때문에 어떤 액션도 실행되지 않습니다. 명령이 데이터베이스에서 직접 실행되기 때문입니다.

액션 코드에서는 로우코드 폴리글랏 프레임워크의 모든 리소스를 사용할 수 있습니다.

액션은 Netuno가 자동 생성한 백오피스 양식에서 데이터 조작이 발생하거나, 코드에서 다음을 사용하여 데이터베이스 작업을 실행할 때 실행됩니다:

  • _db.insert(...), _db.form(...).insert(), _db.insertIfNotExits(...), _db.insertMany(...) 등.
  • _db.update(...), _db.form(...).update(), _db.updateMany(...) 등.
  • _db.delete(...), _db.form(...).delete(), _db.deleteMany(...) 등.

즉, 코드에서 로우코드 폴리글랏 프레임워크의 메커니즘을 사용하여 데이터 조작 작업을 수행하면 해당 액션이 존재하는 경우 실행됩니다.

그러나 명령이 데이터베이스에서 직접 실행되면 액션을 실행할 수 없습니다.

Netuno가 제공하는 데이터 조작 메커니즘을 우회하지 않도록 데이터베이스에서 명령을 직접 실행하는 것은 피하는 것이 좋습니다.

액션 코드에서는 데이터 조작과 관련된 모든 작업을 수행할 수 있습니다.

데이터 항목 (Data Item)​

데이터 항목(_dataItem)은 생성, 변경 또는 제거 중인 모든 데이터 관계를 포함하는 로우코드 폴리글랏 프레임워크의 리소스입니다.

_dataItem 리소스를 통해 모든 정보에 접근하고 진행 중인 작업 프로세스의 세부 정보를 확인할 수 있습니다.

_dataItem 리소스가 지원하는 내용에 대한 자세한 내용은 DataItem 리소스 문서를 참고하세요.

주의: _dataItem 리소스는 액션(actions) 코드에서만 사용할 수 있습니다.

저장, 보관, 변경 또는 새로 만들기 (Save)​

새 레코드가 생성되거나 무언가 변경될 때 실행될 액션을 만들려면 이 액션의 스크립트 이름을 save로 지정합니다. 이는 데이터베이스에 무언가 저장 중임을 의미합니다. 예:

  • nae_app/server/actions/nae_form/save.js

이 액션은 데이터베이스 명령을 실행하기 전에 실행됩니다.

데이터가 데이터베이스에 저장된 후 코드를 실행하려면 saved 액션을 사용합니다. 예:

  • nae_app/server/actions/nae_form/saved.js

이 액션은 데이터베이스 명령이 실행된 후 실행됩니다.

즉, 애플리케이션의 server/actions 폴더 안에 양식(테이블) 이름으로 하위 폴더를 만들고, 그 안에 save 또는 saved라는 스크립트를 두어 데이터베이스 명령 전후에 실행할 코드를 담습니다.

데이터 생성인지 구분하려면 if로 _dataItem.isInsert() 메서드의 결과를 확인할 수 있습니다. 예:

nae_app/server/actions/nae_form/save.js
if (_dataItem.isInsert()) {
// 새 데이터가 생성되고 있습니다...
}

데이터 변경인지 구분하려면 if로 _dataItem.isUpdate() 메서드의 결과를 확인할 수 있습니다. 예:

nae_app/server/actions/nae_form/saved.js
if (_dataItem.isUpdate()) {
// 데이터가 변경되고 있습니다...
}

ID 가져오기​

변경 중인 항목의 ID(식별자)를 가져오려면:

_dataItem.getId()

수정된 내용 확인​

무엇이 수정되고 있는지 확인하려면 getOldRecord()로 데이터베이스의 이전 데이터를 가져와 새 데이터 getRecord()와 비교할 수 있습니다. 예:

if (_dataItem.getOldRecord().getString("이메일") != _dataItem.getRecord().getString("이메일")) {
// 주의: 이메일이 변경되고 있습니다!
}

오류 생성​

작업이 진행되지 않도록 오류를 생성할 수 있습니다. 오류 생성은 일반적으로 데이터베이스 명령을 실행하기 전에 수행되므로 예를 들어 save 액션에서 다음과 같이 합니다:

nae_app/server/actions/nae_form/save.js
_dataItem.setStatusWithError()
.setErrorTitle("이메일")
.setErrorMessage("이메일을 변경할 수 없습니다.")

오류 발생 여부 확인​

데이터베이스 명령 실행 중 오류가 발생했는지 확인할 수 있습니다. 다음과 같은 다양한 오류가 발생할 수 있습니다:

  • 이메일이 중복되는 것은 허용되지 않습니다.
  • 필수 필드가 올바르게 채워지지 않았습니다.
  • 그 외에도 매우 많습니다.

오류 확인은 일반적으로 데이터베이스 명령 실행 후 수행되므로 예를 들어 saved 액션에서 다음과 같이 합니다:

nae_app/server/actions/nae_form/saved.js
if (_dataItem.isError()) {
// 오류가 발생하여 데이터를 저장하지 못했습니다...
}

설정(Setup)​

데이터베이스 구성(setup) 중 데이터 변경이 수행될 때만 실행되는 특정 action을 둘 수 있습니다.

예:

  • nae_app/server/actions/nae_form/setup_save.js
  • nae_app/server/actions/nae_form/setup_saved.js

제거, 삭제 또는 말소 (Remove)​

레코드가 제거될 때 실행될 액션을 만들려면 이 액션의 스크립트 이름을 remove로 지정합니다. 이는 데이터베이스에서 무언가 삭제 중임을 의미합니다. 예:

  • nae_app/server/actions/nae_form/setup_remove.js

이 액션은 데이터베이스 명령을 실행하기 전에 실행됩니다.

데이터가 데이터베이스에 저장된 후 코드를 실행하려면 removed 액션을 사용합니다. 예:

  • nae_app/server/actions/nae_form/setup_removed.js

이 액션은 데이터베이스 명령이 실행된 후 실행됩니다.

즉, 애플리케이션의 server/actions 폴더 안에 양식(테이블) 이름으로 하위 폴더를 만들고, 그 안에 remove 또는 removed라는 스크립트를 두어 데이터베이스 명령 전후에 실행할 코드를 담습니다.

관계 충돌​

데이터 모델에 따라 다른 테이블(역시 다른 양식)과의 관계에서 사용 중인 레코드를 제거할 때 관계가 깨지지 않도록 제거할 수 없는 경우가 발생할 수 있습니다.

그러면 제거 데이터베이스 명령 후 실행되는 removed 액션에서 다음과 같이 이 오류가 발생하는지 확인할 수 있습니다:

nae_app/server/actions/nae_form/removed.js
if (_dataItem.isStatusAsError() && _dataItem.isStatusAsRelations()) {
_log.error(
"테이블과의 관계 때문에 제거할 수 없습니다: "
+ _dataItem.getRelationTable() + ", ID " + _dataItem.getRelationItem().getInt("id")
)
}

대안으로, 레코드를 삭제하는 데이터베이스 명령을 수행하기 전에 실행되는 remove 액션에서 관계가 있을 수 있는 다른 레코드의 "정리"를 구현할 수 있습니다. 예:

nae_app/server/actions/nae_form/remove.js
_db.form("dareun_form")
.where(
_db.where("nae_form_id")
.equals(_dataItem.getRecord().getInt("id"))
)
.delete()

설정(Setup)​

데이터베이스 구성(setup) 중 데이터 제거가 수행될 때만 실행되는 특정 action을 둘 수 있습니다.

예:

  • nae_app/server/actions/nae_form/setup_remove.js
  • nae_app/server/actions/nae_form/setup_removed.js

결론​

액션(actions)을 사용하면 특정 데이터 조작과 관련된 특정 작업을 중앙 집중화할 수 있습니다.

무결성을 보장하고, 작업을 용이하게 하며, 통합을 수행하고, 병렬 작업을 하고, 추가 검증을 하는 등 유용한 메커니즘을 제공하는 코드로 확장할 수 있습니다.

액션을 코딩하는 것은 간단하고 매우 유용하며, 로우코드 폴리글랏 프레임워크의 다른 모든 리소스를 사용하여 확장할 수 있습니다.

액션 코드에서는 로우코드 폴리글랏 프레임워크의 모든 리소스를 사용할 수 있습니다.

액션 사용을 고려해 보세요. 그러면 얻는 편리함이 많은 유용한 전략을 얼마나 강화할 수 있는지 빠르게 확인할 수 있습니다.