액션 (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로
지정합니다. 이는 데이터베이스에 무언가 저장 중임을 의미합니다. 예:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
nae_app/server/actions/nae_form/save.js
nae_app/server/actions/nae_form/save.ts
nae_app/server/actions/nae_form/save.py
nae_app/server/actions/nae_form/save.rb
nae_app/server/actions/nae_form/save.kts
nae_app/server/actions/nae_form/save.groovy
이 액션은 데이터베이스 명령을 실행하기 전에 실행됩니다.
데이터가 데이터베이스에 저장된 후 코드를 실행하려면 saved 액션을 사용합니다. 예:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
nae_app/server/actions/nae_form/saved.js
nae_app/server/actions/nae_form/saved.ts
nae_app/server/actions/nae_form/saved.py
nae_app/server/actions/nae_form/saved.rb
nae_app/server/actions/nae_form/saved.kts
nae_app/server/actions/nae_form/saved.groovy
이 액션은 데이터베이스 명령이 실행된 후 실행됩니다.
즉, 애플리케이션의 server/actions 폴더 안에 양식(테이블) 이름으로 하위 폴더를 만들고, 그 안에
save 또는 saved라는 스크립트를 두어 데이터베이스 명령 전후에 실행할 코드를 담습니다.
데이터 생성인지 구분하려면 if로 _dataItem.isInsert() 메서드의 결과를 확인할 수 있습니다. 예:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
if (_dataItem.isInsert()) {
// 새 데이터가 생성되고 있습니다...
}
if (_dataItem.isInsert()) {
// 새 데이터가 생성되고 있습니다...
}
if _dataItem.isInsert():
# 새 데이터가 생성되고 있습니다...
if _dataItem.isInsert()
# 새 데이터가 생성되고 있습니다...
end
if (_dataItem.isInsert()) {
// 새 데이터가 생성되고 있습니다...
}
if (_dataItem.isInsert()) {
// 새 데이터가 생성되고 있습니다...
}
데이터 변경인지 구분하려면 if로 _dataItem.isUpdate() 메서드의 결과를 확인할 수 있습니다. 예:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
if (_dataItem.isUpdate()) {
// 데이터가 변경되고 있습니다...
}
if (_dataItem.isUpdate()) {
// 데이터가 변경되고 있습니다...
}
if _dataItem.isUpdate():
# 데이터가 변경되고 있습니다...
if _dataItem.isUpdate()
# 데이터가 변경되고 있습니다...
end
if (_dataItem.isUpdate()) {
// 데이터가 변경되고 있습니다...
}
if (_dataItem.isUpdate()) {
// 데이터가 변경되고 있습니다...
}
ID 가져오기
변경 중인 항목의 ID(식별자)를 가져오려면:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
_dataItem.getId()
_dataItem.getId()
_dataItem.getId()
_dataItem.getId()
_dataItem.getId()
_dataItem.getId()
수정된 내용 확인
무엇이 수정되고 있는지 확인하려면 getOldRecord()로 데이터베이스의 이전 데이터를 가져와 새 데이터
getRecord()와 비교할 수 있습니다. 예:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
if (_dataItem.getOldRecord().getString("이메일") != _dataItem.getRecord().getString("이메일")) {
// 주의: 이메일이 변경되고 있습니다!
}
if (_dataItem.getOldRecord().getString("이메일") != _dataItem.getRecord().getString("이메일")) {
// 주의: 이메일이 변경되고 있습니다!
}
if _dataItem.getOldRecord().getString("이메일") != _dataItem.getRecord().getString("이메일"):
# 주의: 이메일이 변경되고 있습니다!
if _dataItem.getOldRecord().getString("이메일") != _dataItem.getRecord().getString("이메일")
# 주의: 이메일이 변경되고 있습니다!
end
if (_dataItem.getOldRecord().getString("이메일") != _dataItem.getRecord().getString("이메일")) {
// 주의: 이메일이 변경되고 있습니다!
}
if (_dataItem.getOldRecord().getString("이메일") != _dataItem.getRecord().getString("이메일")) {
// 주의: 이메일이 변경되고 있습니다!
}
오류 생성
작업이 진행되지 않도록 오류를 생성할 수 있습니다. 오류 생성은 일반적으로 데이터베이스 명령을
실행하기 전에 수행되므로 예를 들어 save 액션에서 다음과 같이 합니다:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
_dataItem.setStatusWithError()
.setErrorTitle("이메일")
.setErrorMessage("이메일을 변경할 수 없습니다.")
_dataItem.setStatusWithError()
.setErrorTitle("이메일")
.setErrorMessage("이메일을 변경할 수 없습니다.")
_dataItem.setStatusWithError()
.setErrorTitle("이메일")
.setErrorMessage("이메일을 변경할 수 없습니다.")
_dataItem.setStatusWithError()
.setErrorTitle("이메일")
.setErrorMessage("이메일을 변경할 수 없습니다.")
_dataItem.setStatusWithError()
.setErrorTitle("이메일")
.setErrorMessage("이메일을 변경할 수 없습니다.")
_dataItem.setStatusWithError()
.setErrorTitle("이메일")
.setErrorMessage("이메일을 변경할 수 없습니다.")
오류 발생 여부 확인
데이터베이스 명령 실행 중 오류가 발생했는지 확인할 수 있습니다. 다음과 같은 다양한 오류가 발생할 수 있습니다:
- 이메일이 중복되는 것은 허용되지 않습니다.
- 필수 필드가 올바르게 채워지지 않았습니다.
- 그 외에도 매우 많습니다.
오류 확인은 일반적으로 데이터베이스 명령 실행 후 수행되므로 예를 들어 saved 액션에서 다음과 같이
합니다:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
if (_dataItem.isError()) {
// 오류가 발생하여 데이터를 저장하지 못했습니다...
}
if (_dataItem.isError()) {
// 오류가 발생하여 데이터를 저장하지 못했습니다...
}
if _dataItem.isError():
# 오류가 발생하여 데이터를 저장하지 못했습니다...
if _dataItem.isError()
# 오류가 발생하여 데이터를 저장하지 못했습니다...
end
if (_dataItem.isError()) {
// 오류가 발생하여 데이터를 저장하지 못했습니다...
}
if (_dataItem.isError()) {
// 오류가 발생하여 데이터를 저장하지 못했습니다...
}
설정(Setup)
데이터베이스 구성(setup) 중 데이터 변경이 수행될 때만 실행되는 특정 action을 둘 수 있습니다.
예:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
nae_app/server/actions/nae_form/setup_save.jsnae_app/server/actions/nae_form/setup_saved.js
nae_app/server/actions/nae_form/setup_save.tsnae_app/server/actions/nae_form/setup_saved.ts
nae_app/server/actions/nae_form/setup_save.pynae_app/server/actions/nae_form/setup_saved.py
nae_app/server/actions/nae_form/setup_save.rbnae_app/server/actions/nae_form/setup_saved.rb
nae_app/server/actions/nae_form/setup_save.ktsnae_app/server/actions/nae_form/setup_saved.kts
nae_app/server/actions/nae_form/setup_save.groovynae_app/server/actions/nae_form/setup_saved.groovy
제거, 삭제 또는 말소 (Remove)
레코드가 제거될 때 실행될 액션을 만들려면 이 액션의 스크립트 이름을 remove로 지정합니다. 이는
데이터베이스에서 무언가 삭제 중임을 의미합니다. 예:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
nae_app/server/actions/nae_form/setup_remove.js
nae_app/server/actions/nae_form/setup_remove.ts
nae_app/server/actions/nae_form/setup_remove.py
nae_app/server/actions/nae_form/setup_remove.rb
nae_app/server/actions/nae_form/setup_remove.kts
nae_app/server/actions/nae_form/setup_remove.groovy
이 액션은 데이터베이스 명령을 실행하기 전에 실행됩니다.
데이터가 데이터베이스에 저장된 후 코드를 실행하려면 removed 액션을 사용합니다. 예:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
nae_app/server/actions/nae_form/setup_removed.js
nae_app/server/actions/nae_form/setup_removed.ts
nae_app/server/actions/nae_form/setup_removed.py
nae_app/server/actions/nae_form/setup_removed.rb
nae_app/server/actions/nae_form/setup_removed.kts
nae_app/server/actions/nae_form/setup_removed.groovy
이 액션은 데이터베이스 명령이 실행된 후 실행됩니다.
즉, 애플리케이션의 server/actions 폴더 안에 양식(테이블) 이름으로 하위 폴더를 만들고, 그 안에
remove 또는 removed라는 스크립트를 두어 데이터베이스 명령 전후에 실행할 코드를 담습니다.
관계 충돌
데이터 모델에 따라 다른 테이블(역시 다른 양식)과의 관계에서 사용 중인 레코드를 제거할 때 관계가 깨지지 않도록 제거할 수 없는 경우가 발생할 수 있습니다.
그러면 제거 데이터베이스 명령 후 실행되는 removed 액션에서 다음과 같이 이 오류가 발생하는지 확인할 수
있습니다:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
if (_dataItem.isStatusAsError() && _dataItem.isStatusAsRelations()) {
_log.error(
"테이블과의 관계 때문에 제거할 수 없습니다: "
+ _dataItem.getRelationTable() + ", ID " + _dataItem.getRelationItem().getInt("id")
)
}
if (_dataItem.isStatusAsError() && _dataItem.isStatusAsRelations()) {
_log.error(
"테이블과의 관계 때문에 제거할 수 없습니다: "
+ _dataItem.getRelationTable() + ", ID " + _dataItem.getRelationItem().getInt("id")
)
}
if _dataItem.isStatusAsError() and _dataItem.isStatusAsRelations():
_log.error(
"테이블과의 관계 때문에 제거할 수 없습니다: "
+ _dataItem.getRelationTable() + ", ID " + _dataItem.getRelationItem().getInt("id")
)
if (_dataItem.isStatusAsError() && _dataItem.isStatusAsRelations())
_log.error(
"테이블과의 관계 때문에 제거할 수 없습니다: "
+ _dataItem.getRelationTable() + ", ID " + _dataItem.getRelationItem().getInt("id")
)
end
if (_dataItem.isStatusAsError() && _dataItem.isStatusAsRelations()) {
_log.error(
"테이블과의 관계 때문에 제거할 수 없습니다: "
+ _dataItem.getRelationTable() + ", ID " + _dataItem.getRelationItem().getInt("id")
)
}
if (_dataItem.isStatusAsError() && _dataItem.isStatusAsRelations()) {
_log.error(
"테이블과의 관계 때문에 제거할 수 없습니다: "
+ _dataItem.getRelationTable() + ", ID " + _dataItem.getRelationItem().getInt("id")
)
}
대안으로, 레코드를 삭제하는 데이터베이스 명령을 수행하기 전에 실행되는 remove 액션에서 관계가 있을
수 있는 다른 레코드의 "정리"를 구현할 수 있습니다. 예:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
_db.form("dareun_form")
.where(
_db.where("nae_form_id")
.equals(_dataItem.getRecord().getInt("id"))
)
.delete()
_db.form("dareun_form")
.where(
_db.where("nae_form_id")
.equals(_dataItem.getRecord().getInt("id"))
)
.delete()
_db.form("dareun_form")
.where(
_db.where("nae_form_id")
.equals(_dataItem.getRecord().getInt("id"))
)
.delete()
_db.form("dareun_form")
.where(
_db.where("nae_form_id")
.equals(_dataItem.getRecord().getInt("id"))
)
.delete()
_db.form("dareun_form")
.where(
_db.where("nae_form_id")
.equals(_dataItem.getRecord().getInt("id"))
)
.delete()
_db.form("dareun_form")
.where(
_db.where("nae_form_id")
.equals(_dataItem.getRecord().getInt("id"))
)
.delete()
설정(Setup)
데이터베이스 구성(setup) 중 데이터 제거가 수행될 때만 실행되는 특정 action을 둘 수 있습니다.
예:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
nae_app/server/actions/nae_form/setup_remove.jsnae_app/server/actions/nae_form/setup_removed.js
nae_app/server/actions/nae_form/setup_remove.tsnae_app/server/actions/nae_form/setup_removed.ts
nae_app/server/actions/nae_form/setup_remove.pynae_app/server/actions/nae_form/setup_removed.py
nae_app/server/actions/nae_form/setup_remove.rbnae_app/server/actions/nae_form/setup_removed.rb
nae_app/server/actions/nae_form/setup_remove.ktsnae_app/server/actions/nae_form/setup_removed.kts
nae_app/server/actions/nae_form/setup_remove.groovynae_app/server/actions/nae_form/setup_removed.groovy
결론
액션(actions)을 사용하면 특정 데이터 조작과 관련된 특정 작업을 중앙 집중화할 수 있습니다.
무결성을 보장하고, 작업을 용이하게 하며, 통합을 수행하고, 병렬 작업을 하고, 추가 검증을 하는 등 유용한 메커니즘을 제공하는 코드로 확장할 수 있습니다.
액션을 코딩하는 것은 간단하고 매우 유용하며, 로우코드 폴리글랏 프레임워크의 다른 모든 리소스를 사용하여 확장할 수 있습니다.
액션 코드에서는 로우코드 폴리글랏 프레임워크의 모든 리소스를 사용할 수 있습니다.
액션 사용을 고려해 보세요. 그러면 얻는 편리함이 많은 유용한 전략을 얼마나 강화할 수 있는지 빠르게 확인할 수 있습니다.