전기요금을 계산하는 프로그램을 개발해야 했다.
전기요금 계산이 이거 이래도 되나 할정도로 복잡하고, 지역, 계절, 년도등의 변수가 많고, 계산 또한 변수가 너무 많았다.
이런경우 이런 계산 로직을 코드로 작성을 하는것보다, 변수에 빠르게 적응을 하기 위해서,
다이나믹한 기법을 사용하는게 더 좋을것 같다는 생각을 했다.
rule엔진을 사용하는게 좋아보이지만 (drools등), 단순 계산을 위해 rule엔진을 사용하는건 오버엔지니어링이라고 판단을 했다.
그리고, rule엔진이 사실, 사용하는게 상당히 번잡하고 복잡하다...
먼가 간단하면서, 다이나믹하게 계산식을 적용하고, 반영되게 하는 방법을 원했다.
고민중에 예전에 mocksal이라고 개인 mocking 서비스를 만들때 (https://tech.super100.app/35)
사용한 방법인 javascript엔진을 이용하면,
위의 요건을 충족할것같다는 생각이 들었다.
더불어, 스크립트 정도는 쉬운언어이기도해서, 계산식을 비개발자(기획)들이 관리할수도 있는 이점도 더불어 있다고 생각했다.
간단하게 설명하면,
한달 전기 사용량, 전기 누전단계 정보, 가격표를 상수로 js에 바운딩하여 js엔진에서 사용할수있도록 한다.
import org.graalvm.polyglot.Context
fun main() {
val context = Context.create()
val bindings = context.getBindings("js")
bindings.putMember("한달_전기_사용량", XXXXXX)
bindings.putMember("전기_누전단계_정보", XXXXXX)
bindings.putMember("가격표", XXXXXX)
val result = context.eval("js", "
한달_전기_사용량 * 전기_누전단계_정보;
//여기 js로 계산식을 적는다.
")
println(result.asInt()) //전기요금값
}
위와 같이 js로 전기요금계산식을 만들어 사용하고, 해당 js를 db에 관리하고 어드민에서 수정할수있도록하면,
전기요금계산식이 변화하거나, 어떤 예외가 발생했을때, 계산식을 변경만 해주면, 바로 대응이 가능하도록 만들수있다.
코드로 작성하는것보다, 스크립트코드를 관리하고 해당 스크립트코드를 사용하여, 결과를 얻는 방법을 사용하면,
좀더 비개발자도 수정이 가능할수있는 시스템이 되지않을까 한다.
성능의 의심이 예전 나스혼 엔진(구 js엔진)에서는 상당히 거시기 했는데....
다행히 , GraalVM JavaScript엔진은 상당한부분 성능이 개선되었다.
부담없이 사용가능하다고 판단된다.
다만, 주의해야할부분은 Js엔진에서 사용하는 Context객체는 ThreadSafe하지 않다는것이다.
Context를 매번 create()해서 사용하는건 성능상 좋지않기에,
Context를 pool로 여러개 만들고,
사용하고 반환하는식 (db pool과 유사)으로 사용해야 ThreadSafe하다는것은 꼭 기억해야한다 !!!
(멀티 스레드에서는 항상..ThreadSafe가 골치아프다..ㅠ)
'MY아이디어' 카테고리의 다른 글
| [아이디어] Switch문 최대한 안쓰기 (0) | 2026.04.10 |
|---|---|
| [아이디어] 스크래핑으로 플로우 간단히 만들기 (0) | 2026.04.07 |
| [아이디어] 대기열 기능 만들기에 대해서 (0) | 2026.04.04 |
| [아이디어] 대용량 앱푸시 예약발송 기능 어떻게 만들까? (0) | 2026.03.14 |
| [아이디어] AI끼리 싸움을 붙이면.. (0) | 2026.02.10 |
