파이썬 DSL: 특화 도메인을 위한 맞춤형 솔루션
프로그램을 작성할 때 해결하려는 문제가 특정 영역, 즉 도메인(Domain)에 속한다는 것을 알게 됩니다. 예:
- 은행 시스템: 거래, 이자율 기술 필요
- 웹 애플리케이션: 라우트, 템플릿, 응답 정의 필요
파이썬, 자바 같은 범용 언어(GPL)로 이 문제들을 풀 수 있지만, 코드가 너무 자세하고 반복적이게 됩니다. 그래서 DSL(Domain Specific Language)을 사용합니다.
DSL - 도메인 특화 언어
DSL은 특정 도메인 전용 프로그래밍 또는 명세 언어입니다. 범용 언어(GPL: 파이썬, C++, 자바)와 다릅니다. 두 유형:
- 외부 DSL(External DSL) — 독자적 문법과 컴파일러를 가진 완전히 새로운 언어
- 내부 DSL(Internal DSL / Embedded DSL) — 호스트 언어 내부에서 그 문법과 구조를 사용해 구축된 DSL
외부 DSL
데이터베이스 작업엔 SQL 사용. 데이터를 수동 루프로 스캔하는 대신:
SELECT name FROM users WHERE age > 10;
웹페이지 설계엔 HTML 사용. 텍스트 문자열과 위치를 수동 관리 대신:
<h1>Welcome To Tutorialspoint</h1>
내부 DSL
파이썬에서 DSL은 파이썬 문법 위에 구축됩니다. Flask나 Pandas 같은 프레임워크가 DSL류 라이브러리로 문제를 명확히 표현하도록 돕습니다.
@app.route('/home')
def home():
return "Hello...!"
왜 파이썬에서 DSL인가?
파이썬이 DSL에 최적인 이유:
- 문법이 단순하고 표현력 풍부
- 함수와 클래스를 빌딩 블록으로 사용 가능
예: `pytest` 같은 테스트 프레임워크나 `Flask` 같은 웹 프레임워크가 DSL적. 저수준 로직 대신 표현력 있는 명령 작성 가능.
예제 1: 수학 언어를 명명된 함수로 추상화
def add(x, y): return x + y
def multiply(x, y): return x * y
print(add(multiply(1, 3), multiply(2, 4)))
출력: 11 (1×3 + 2×4 = 3 + 8 = 11)
예제 2: 설정 파일에서 DSL 활용
class demo:
def __init__(self):
self.settings = {}
def set(self, key, value):
self.settings[key] = value
return self
def get(self, key):
return self.settings.get(key)
result = demo()
result.set("host", "Welcome").set("port", 1231)
print(result.get("host"))
출력: Welcome
예제 3: 파이썬 내부 SQL 스타일 데이터 쿼리 DSL
class demo:
def __init__(self, dataset):
self.dataset = dataset
def where(self, condition):
self.dataset = [item for item in self.dataset if condition(item)]
return self
def select(self, selector):
return [selector(item) for item in self.dataset]
users = [
{"name": "Ram", "age": 10},
{"name": "Ravi", "age": 24},
{"name": "Rahul", "age": 19},
]
result = demo(users).where(lambda u: u["age"] > 18).select(lambda u: u["name"])
print(result)
출력: ['Ravi', 'Rahul']