본문 바로가기
프로그래밍 놀이터/Tips

[실용주의 프로그래머] 메타 프로그래밍

by 돼지왕 왕돼지 2018. 10. 30.
반응형

[실용주의 프로그래머] 메타 프로그래밍


bean container, configurable, deployment descriptor, ejb, meta data, [실용주의 프로그래머] 메타 프로그래밍, 결합도, 데이터에 대한 데이터, 디플로이먼트 디스크립터, 런타임 접근, 메타 데이터, 메타데이터 세부 내용, 메타데이터 주도 앱, 문제 도메인, 비지니스 룰, 비지니스 정책, 빈 컨테이너, 설정 가능, 설정 옵션, 세부사항, 세부사항을 코드에서 몰아내라, 소프트, 소형 언어, 앱을 기술하는 모든 데이터, 자바빈즈, 코드 추상화, 통합 엔지니어링, 통합하지 말고 설정하라, 포맷, 협동적 설정


-

아무리 뛰어난 천재라도 세부사항에 집착하면 그 재능이 발휘되지 않는 법이다. - 레비의 8번째 법칙



-

세부사항은 우리의 깔끔한 코드를 어질러 놓는다.

특히 변화가 잦을 때는 더욱 그러하다.



-

세부사항을 코드에서 몰아내라.

이렇게 함으로써 우리의 코드는 매우 설정 가능(configurable)하게 되고 ‘소프트’해진다.

즉, 변화에 쉽게 적응할 수 있게 되는 것이다.





동적 설정


-

시스템을 되도록 설정가능하게 만들어야 한다.

배경 색, 프롬프트 텍스트 뿐 아니라 알고리즘의 선택, 사용할 데이터베이스 제품, 미들웨어 기술, 사용자 인터페이스 스타일 등 시스템의 심층까지 말이다.

이런 아이템들은 통합하거나 엔지니어링하지 말고 설정 옵션으로 구현해야 한다.



-

통합하지 말고 설정하라.



-

메타데이터(metadata)를 이용하여 반환 매개 변수, 사용자 선호 사항, 설치 디렉터리와 같은 앱 설정 옵션을 기술하라.



-

메타데이터란 엄밀히 이야기하면 데이터에 관한 데이터이다.

데이터베이스 스키마, 데이터 디렉토리 등을 대표적인 예로 들 수 있다.


넓은 의미로 사용하자면, 메타데이터는 앱을 기술하는 모든 데이터다.

앱이 어떻게 실행되어야 하고, 어떤 자원을 이용해야 하는지 등을 기술하면 메타데이터라고 할 수 있다.



-

보통 메타데이터는 컴파일타임이 아닌 런타임에 접근, 사용된다.





메타데이터 주도 앱


-

가능한 많은 메타데이터를 써서 앱을 설정하고 실행시켜라.

우리의 목표는 어떻게가 아닌 무엇을 해야 하는지를 명시함으로써 선언적(declarative)으로 생각하는 것이고, 이로써 더 동적이고 적응가능한 프로그램을 만드는 것이다.



-

코드에는 추상화를, 메타데이터에는 세부 내용을.



-

코드를 추상화하고, 메타데이터에 세부 내용을 넣으면 다음의 이점이 생긴다.


    설계의 결합도를 줄여 좀 더 유연하고 적응성 있는 프로그램을 만들 수 있다.

    세부사항을 코드 밖으로 몰아냄으로써 보다 강하고 추상적인 디자인을 만들 수 있다.

    앱을 커스터마이징하기 위해 다시 컴파일할 필요가 없다. 이런 방식의 커스터마이징을 통해 실제 제작 공정 시스템에서 일어날 수 있는 치명적인 버그에서 벗어나는 우회로를 쉽게 만들 수 있다.

    메타데이터는 범용 프로그램 언어보다 문제 도메인에 가까운 방식으로 표현될 수 있다.

    동일한 앱 엔진과 상이한 메타데이터를 이용해 여러 다른 프로젝트를 진행할 수 있게 된다.



-

가능한 마지막 순간까지 세부 정의를 피하고, 세부사항을 소프트하게, 변화하기 쉽게 남겨 두라. 빠르게 변화할 수 있는 해결안을 강구함으로써 많은 프로젝트에 범람하는 방향 전환이란 홍수에 보다 유연하게 대처하라.






비지니스 로직


-

비지니스 정책이나 룰은 프로젝트의 다른 어떤 부분보다 변화하기 쉽기 때문에 이를 유연한 포맷을 통해 유지보수하는 것이 좋다.



-

다소 덜 복잡한 로직은 소형 언어를 통해 표현할 수 있으며, 그렇게 하면 환경이 바뀔 때마다 재컴파일, 재배포하지 않아도 된다.





예제 : 엔터프라이즈 자바빈즈


-

엔터프라이즈 자바빈즈(EJB)는 분산, 트랜잭션 기반 환경의 프로그래밍을 단순화해 주는 프레임워크다.

EJB 는 앱을 설정하고 코드 작성의 복잡도를 줄이기 위해 어떻게 메타데이터를 사용하면 되는지에 대한 좋은 사례이다.



-

상이한 데이터베이스 벤더, 서로 다른 쓰레드와 로드 밸런싱 모델을 사용하는 여러 머신 간의 트랜잭션 처리를 수행해야 하는 자바 소프트웨어를 만들어야 한다고 가정하면..

EJB 를 사용할 경우 이런 사항들은 걱정하지 않아도 된다.

특정 규약을 따르는 자족적(self-contained) 객체인 빈을 작성하고, 이것을 여러분을 대신해 여러 하위(low-level) 세부사항을 관리해주는 빈 컨테이너(bean container)에 넣어주기만 하면 된다.

개발자는 빈의 코드만 작성하면 되는데, 이때 트랜잭션 연산이나 쓰레드 관리는 신경쓰지 않아도 된다. EJB 는 메타데이터를 사용하여 트랜잭션이 어떻게 처리되어야 하는지를 지정하기 때문이다.



-

빈 컨테이너는 빈이 여러 방식 중 하나를 선택해 트랜잭션을 관리할 수 있도록 해준다. 그리고 빈의 행동에 영향을 미치는 모든 매개 변수는 빈의 디플로이먼트 디스크립터(deployment descriptor)에서 지정한다.(디플로이먼트 디스크립터는 필요로 하는 메타데이터를 담은 직렬화된 객체다.)





협동적 설정


-

앱이 서로를 설정하게 만든다면, 소프트웨어가 스스로 환경에 적응하도록 만들면 엄청나게 강력할 것이다.





도도 코드를 작성하지 말라.


-

메타데이터를 사용하지 않는다면 코드는 최대한의 적응성이나 유연성을 얻을 수 없다.

환경에 적응하지 못하는 종은 멸종하게 된다.




반응형

댓글