[실용주의 프로그래머] 메타 프로그래밍 |
-
아무리 뛰어난 천재라도 세부사항에 집착하면 그 재능이 발휘되지 않는 법이다. - 레비의 8번째 법칙
-
세부사항은 우리의 깔끔한 코드를 어질러 놓는다.
특히 변화가 잦을 때는 더욱 그러하다.
-
세부사항을 코드에서 몰아내라.
이렇게 함으로써 우리의 코드는 매우 설정 가능(configurable)하게 되고 ‘소프트’해진다.
즉, 변화에 쉽게 적응할 수 있게 되는 것이다.
동적 설정
-
시스템을 되도록 설정가능하게 만들어야 한다.
배경 색, 프롬프트 텍스트 뿐 아니라 알고리즘의 선택, 사용할 데이터베이스 제품, 미들웨어 기술, 사용자 인터페이스 스타일 등 시스템의 심층까지 말이다.
이런 아이템들은 통합하거나 엔지니어링하지 말고 설정 옵션으로 구현해야 한다.
-
통합하지 말고 설정하라.
-
메타데이터(metadata)를 이용하여 반환 매개 변수, 사용자 선호 사항, 설치 디렉터리와 같은 앱 설정 옵션을 기술하라.
-
메타데이터란 엄밀히 이야기하면 데이터에 관한 데이터이다.
데이터베이스 스키마, 데이터 디렉토리 등을 대표적인 예로 들 수 있다.
넓은 의미로 사용하자면, 메타데이터는 앱을 기술하는 모든 데이터다.
앱이 어떻게 실행되어야 하고, 어떤 자원을 이용해야 하는지 등을 기술하면 메타데이터라고 할 수 있다.
-
보통 메타데이터는 컴파일타임이 아닌 런타임에 접근, 사용된다.
메타데이터 주도 앱
-
가능한 많은 메타데이터를 써서 앱을 설정하고 실행시켜라.
우리의 목표는 어떻게가 아닌 무엇을 해야 하는지를 명시함으로써 선언적(declarative)으로 생각하는 것이고, 이로써 더 동적이고 적응가능한 프로그램을 만드는 것이다.
-
코드에는 추상화를, 메타데이터에는 세부 내용을.
-
코드를 추상화하고, 메타데이터에 세부 내용을 넣으면 다음의 이점이 생긴다.
설계의 결합도를 줄여 좀 더 유연하고 적응성 있는 프로그램을 만들 수 있다.
세부사항을 코드 밖으로 몰아냄으로써 보다 강하고 추상적인 디자인을 만들 수 있다.
앱을 커스터마이징하기 위해 다시 컴파일할 필요가 없다. 이런 방식의 커스터마이징을 통해 실제 제작 공정 시스템에서 일어날 수 있는 치명적인 버그에서 벗어나는 우회로를 쉽게 만들 수 있다.
메타데이터는 범용 프로그램 언어보다 문제 도메인에 가까운 방식으로 표현될 수 있다.
동일한 앱 엔진과 상이한 메타데이터를 이용해 여러 다른 프로젝트를 진행할 수 있게 된다.
-
가능한 마지막 순간까지 세부 정의를 피하고, 세부사항을 소프트하게, 변화하기 쉽게 남겨 두라. 빠르게 변화할 수 있는 해결안을 강구함으로써 많은 프로젝트에 범람하는 방향 전환이란 홍수에 보다 유연하게 대처하라.
비지니스 로직
-
비지니스 정책이나 룰은 프로젝트의 다른 어떤 부분보다 변화하기 쉽기 때문에 이를 유연한 포맷을 통해 유지보수하는 것이 좋다.
-
다소 덜 복잡한 로직은 소형 언어를 통해 표현할 수 있으며, 그렇게 하면 환경이 바뀔 때마다 재컴파일, 재배포하지 않아도 된다.
예제 : 엔터프라이즈 자바빈즈
-
엔터프라이즈 자바빈즈(EJB)는 분산, 트랜잭션 기반 환경의 프로그래밍을 단순화해 주는 프레임워크다.
EJB 는 앱을 설정하고 코드 작성의 복잡도를 줄이기 위해 어떻게 메타데이터를 사용하면 되는지에 대한 좋은 사례이다.
-
상이한 데이터베이스 벤더, 서로 다른 쓰레드와 로드 밸런싱 모델을 사용하는 여러 머신 간의 트랜잭션 처리를 수행해야 하는 자바 소프트웨어를 만들어야 한다고 가정하면..
EJB 를 사용할 경우 이런 사항들은 걱정하지 않아도 된다.
특정 규약을 따르는 자족적(self-contained) 객체인 빈을 작성하고, 이것을 여러분을 대신해 여러 하위(low-level) 세부사항을 관리해주는 빈 컨테이너(bean container)에 넣어주기만 하면 된다.
개발자는 빈의 코드만 작성하면 되는데, 이때 트랜잭션 연산이나 쓰레드 관리는 신경쓰지 않아도 된다. EJB 는 메타데이터를 사용하여 트랜잭션이 어떻게 처리되어야 하는지를 지정하기 때문이다.
-
빈 컨테이너는 빈이 여러 방식 중 하나를 선택해 트랜잭션을 관리할 수 있도록 해준다. 그리고 빈의 행동에 영향을 미치는 모든 매개 변수는 빈의 디플로이먼트 디스크립터(deployment descriptor)에서 지정한다.(디플로이먼트 디스크립터는 필요로 하는 메타데이터를 담은 직렬화된 객체다.)
협동적 설정
-
앱이 서로를 설정하게 만든다면, 소프트웨어가 스스로 환경에 적응하도록 만들면 엄청나게 강력할 것이다.
도도 코드를 작성하지 말라.
-
메타데이터를 사용하지 않는다면 코드는 최대한의 적응성이나 유연성을 얻을 수 없다.
환경에 적응하지 못하는 종은 멸종하게 된다.
'프로그래밍 놀이터 > Tips' 카테고리의 다른 글
[실용주의 프로그래머] 단지 뷰일 뿐이야 (0) | 2018.11.01 |
---|---|
[실용주의 프로그래머] 시간적 결합 (0) | 2018.10.31 |
[실용주의 프로그래머] 결합도 줄이기와 디미터 법칙 (0) | 2018.10.29 |
[실용주의 프로그래머] 리소스 사용의 균형 (0) | 2018.10.28 |
[실용주의 프로그래머] 언제 예외를 사용할까 (0) | 2018.10.27 |
댓글