LINQ and Functional Programming

SQL Server 2008 관련된 동영상을 보다가 Entity Data Platform 이란거에 대해서 좀 봤고 LINQ라는 것에 대해서 좀 봤고, 최근에 알게된 Erlang 에도 생각이 미치더니만, 괜한 공상이 머릿속을 흔든다.

앞으로도 DB의 중요성은 절대 줄어들지 않을 것 같으므로 정확하고 효율적인 모델링, 능숙한 SQL사용, 성능과 저장공간을 동시에 고려한 최적의 인덱스 작성 능력은 언제나 요구되는 능력일 것이다. DB를 기반으로 한 솔루션에서 대부분의 병목은 DB에서 발생하기 때문이다. 그런데 인터넷 세상이 되고 비즈니스에서 속도가 강조되면서 개발도 함께 빨라져야할 필요가 생기고 있다. 더불어 유지보수의 용이함도 꼭 필요하다. 이런 측면에서 객체 모델의 도입이 필요하다. 하지만  OR impedence 를 해결하는게 쉬운 일은 아니며, 이를 위한 OR매핑 솔루션의 사용도 결코 쉽지 않다. 만들기는 더더욱 어렵다.

SQL2008 white paper 를 읽다보니 개발측면에서 흥미로운게 눈에 띄었는데, ADO, Visual Studio 와 함께 결합한 LINQ라는 놈이다. Language Integrated Query 라는건데, DB에 SQL로 질의를 하는게 아니라(테이블 데이터를 내놔라! 하는 기존방식) 고객 엔티티를 내놔라! 하고 요청하고 그 결과가 DataSet이 아니라 .NET 객체로 반환되는 것이다. 아... 이건 사실상의 OR매퍼가 아닌가? 다음과 같은 syntax로 사용한다.

public partial class DataDemos_1_HelloWorld : System.Web.UI.
{
    protected void Page_Load(object sender, EventArgs e)
    {
        AdventureWorks db = new AdventureWorks();

        var query = from person in db.SalesPeople
                         where person.HireData > new DataTime(2002,1,1)
                          select person;

        DataList1.DataSource = query;
        DataList1.DataBind();
    }
}

코드를 보자. 저거 ASP.NET 코드다. 

근데 AdventureWorks 라니? 그렇다.. SQL2005 의 데모 DB인 AdventureWorks를 객체로 이해하고 접근하고 있다. db.SalesPeople 는 저 DB에 있는 스키마일까? person 은 어떤 테이블하고 매핑되어 있는 것일까? 글고 원본 그림을 보면 "Results are .NET objects, strongly typed, support data binding" 이라고 되어 있다. 음.. 별도의 비즈니스 객체 레이어를 생성해줘야지 거기다가 메서드를 추가할텐데...  혹시 매핑관계를 별도로 다 정의해줘야 하는걸까? 그 노가다도 상당히 골때릴텐데... 게다가 저 놈이 결국 DB에 날리는건 SQL일텐데 이 놈의 성능은 어떨까? 객체를 Persist 할 때 만들어 내는 SQL은 객체의 프라퍼티중 변경된 넘들만 들어가게 만들어 줄까? DBA입장에서 보기엔 DB관리가 점점 더 힘들어지는 상황인 것 같다.

관련 링크 : http://link.allblog.net/4060901/http://pobeez.egloos.com/218530
관련 링크 : http://blogs.msdn.com/charlie/archive/2007/01/26/anders-hejlsberg-on-linq-and-functional-programming.aspx (동영상 꼭 볼것!)

동영상을 보면 대충 뭘 하려는지 짐작이 된다. 데이터를 다루는 시스템을 예로 들어보자. 결국 다른 소스에서 온 서로 다른 데이터들을 이리저리 엮고, 계산해서 보여주고 인풋을 계산해서 보여주는거 아니던가 말이다. LINQ가 하려는건 언어에 데이터를 다루는 기능을 통합하되, 그걸 좀 더 추상적인 레벨에서 수행할 수 있게 하는거다. 음.. 간단하게 설명하자면 C#같은 언어에 DB의 쿼리 엔진같은넘이 들어간다고 보면 되겠다. 동영상에 함수형 프로그래밍이니 지연된 실행이니 타입 추론이니 어쩌구 나오는데... 설명 가만 들어보면 SQL을 DB가 받아서 parse tree만들고 그러면서 타입체크하고 실행 계획 만들면서 CPU갯수 체크해서 병렬로 돌릴 수 있는거 돌리고... 그러는거랑 LINQ에서 추구하는게 대단히 흡사하다. 얘네들은 언어레벨에서 이걸 하려고 하는거고, 이렇게 하기 위한 최고의 방법이 함수형 언어 패러다임의 도입이고, 이것의 밑바탕은 선형 대수이고 이게 되면 람다식을 해석해서 만든 expression tree를 보고 CPU남으면 병렬로 돌릴지 결정하는거도 쉽게 쉽게 할 수 있다는 말이 되겠다.

LINQ를 자유자재로 쓰게 되면 XML하고 텍스트, DB데이터를 필터링해서 읽어온다음 join 해서 group by 한 다음에 결과를 어디로 보내는 작업을 DB에서 쿼리 만들듯이 할 수 있게 될거다. 중간에 Hashtable에 넣고 Vector에 넣고 이러는거 하나도 없다. 알아서 한다는게 동영상의 내용으로 보인다. 뭐, DB에서 현재 하고 있는거랑 똑같자나? ETL툴들도 여러 데이터 소스에서 읽어와서 join , group by 하는거 다 된다. 특정한 모듈, 이를테면 DW에서 많이 쓰는 lookup 같은것도 CPU 여러개 쓰면서 잘 돈다. 데이터를 핸들링하는 과정이 단위 기능으로 쪼개졌기 때문이다.

자 그러면 이런 문제를 자연스럽게 예상할 수 있다. expression tree를 만드는게 얼마나 효율적인 것이냐. DB에서 실행 계획 만드는게 의외로 CPU많이 쓰는 작업임을 생각해보면 이런 문제도 분명히 생길거다. 글고 실행계획 재사용같은게 되려나? 앗. 프로그램이니까 컴파일이 되는구나-_-; 실행계획 재사용에 해당하는 문제는 없겠다. ㅋㅋㅋ 근데 만들어낸 expression tree가 진짜로 최적일거냐 하는 문제는 여전히 예상이 된다.  두개의 XML소스와 세개의 텍트스 소스와 하나의 DB에서 데이터를 읽어서 join을 한다고 치면 뭘 먼저 읽고 어떤 순서로 join 할지는 상황에 따라 최적값이 다를텐데. 뭐, 이건 DB 튜닝을 하다보면 맨날 만나는 문제지만. 그럴때는 지가 알아서 컴파일된 코드를 바꿀까???? ㅋㅋㅋ

적으면서 생각을 정리하다보니 비전은 원대하나 실무에서 검증되기엔 많은 난관이 있어보인다는 생각이 든다. 게다가... 객체도 잘 모르는 대다수의 개발자들이 함수형 프로그래밍도 공부해야 한다는 어려움도 예상이 되는구먼. 절차지향, 집합지향, 객체지향, AOP, 함수형 등등 뭐가 이리 많단 말이냐. ㅎㅎㅎㅎ


@제가 FP나 LINQ에는 전혀 경험이 없으니 위의 동영상을 깊이있게 이해하지 못하거나 오해하고 있는 부분이 있을 수 있습니다. 추가하실 말씀이 있으시면 덧글로 가르침을 주시면 감사하겠습니다.

Posted by maceo

06 7, 2007 17:01 06 7, 2007 17:01
, , , , ,
Response
No Trackback , a comment
RSS :
http://merritt.co.kr/tt/rss/response/102

  실전 코드로 배우는 실용주의 디자인 패턴  앨런 홀럽 지음, 송치형 옮김
너무 단순한 예제들 때문에 실제 프로젝트에서의 패턴 활용법을 깊이 있게 이해할 수 없는 기존의 책들과 달리, '라이프 게임'과 '소형 내장 데이터베이스'를 구현해 가며 패턴을 학습하도록 한다. 두 프로그램을 통해 상용 제품 수준의 애플리케이션에서 실제로 패턴을 활용할 수 있는 방법을 익히게 되는 것이다.

 환상적인 책!!!!! 디자인 패턴 책을 몇권 보고 실무에 조금 적용해본 사람이라면 객체 지향 소프트웨어 설계가 얼마나 어려운지, 적절한 곳에 적절한 패턴을 사용하는 것이 얼마나 헷갈리는 일인지 피부로 느끼고 있을 것임. 이 책은 바로 딱 그런 상태에 있는 개발자들을 위한 책임. 이런 좋은 책을 내준 사이텍 미디어에 감사를...

Posted by maceo

05 23, 2007 17:08 05 23, 2007 17:08
Response
No Trackback , a comment
RSS :
http://merritt.co.kr/tt/rss/response/99

SW 아키텍트로 가기 위한 필독서들...

사실 아직 일천한 수준이긴 한데... SW 아키텍트로 가기 위해서는 기본적으로 뭘 봐야할지에 대해서 한번 정리를 하고 싶어졌다. 일단은 개발을 잘해야겠지? 설계도 잘해야겠고. 그런데 개발/설계를 잘 한다함은 특정 플랫폼에 종속되는 것이 아니라 어떤 플랫폼이더라도 통용될 수 있을 정도로 잘해야 한다는 것을 의미한다. 이런 능력을 기르는데 필독서는 다음 두권이다.

GOF의 디자인 패턴  Erich Gamma 외 지음, 김정아 옮김
이 책은 디자인패턴과 보다 효과적인 객체지향 프로그래밍에 관심이 있는 개발자들을 위한다. 책을 읽기위해서는 자바나 C++과 같은 객체지향 언어에 어느정도 익숙해져야 한다. 디자인 패턴 자체가 보다 재사용가능하고 유지보수가 쉬운 객체지향 프로그래밍 구현을 목적으로 하고 있기 때문에 기본적인 이해는 필수적이다.
Refactoring - 기존 코드의 디자인을 개선하는 방법  Martin Fowler 지음, 윤성준.조재박 옮김
리팩토링은 소프트웨어의 외부 기능을 변경하지 않으면서 내부 구조를 바꾸는 기술이다. 리팩토링을 사용하면 나쁜 디자인의 코드를 취해서, 외부 기능을 변경하지 않고, 좋은 디자인의 코드로 바꿀 수 있다. 따라서 리팩토링을 이용하면 처음부터 미리 모든 경우에 대해 고민하고, 필요할지 확실하지도 않은 유연성을 소프트웨어에 주기 위해 비용을 낭비할 필요가 없다.

개발할 때 아주 중요한 것이 절차지향, 객체지향, 집합지향 패러다임에 모두 익숙해지는 것이다. 분야에 따라서 객체지향이 필요없는 곳도 있고 집합지향이 필요없는 곳도 있다. 하지만 일반적인 웹개발에서는 세가지 모두에 능숙할 필요가 있다. 개인적인 경험으로는, 객체지향 패러다임으로의 전환이 가장 힘들다. 특정 문제 상황을 객체지향적으로 해결하는 것은 인간의 상식적인 사고를 많이 벗어난다는 느낌을 가지고 있다. (절차지향이 가장 상식적) 그래서 C++이나 Java나 C#으로 개발을 해도 옛날의 C코드와 똑같은 코드가 나와버리고 if-else 의 미로가 생기는 것이다.

이런 상황을 탈피하기 위한 첫걸음이 위의 두 책이 되겠다. 01년인가 원서로 두 책을 모두 읽었는데, 그야말로 대충격이었다. 일단 디자인 패턴책은 상당히 이해하기 어려웠다. 하지만 리팩토링책은 아주아주 쉽고 재밌었으며 실용적이었다. 특히 리팩토링 2장에서 아주 일반적인 절차지향 로직이 리팩토링 기법을 통해서 슬금슬금 아주 깔끔한 객체지향 코드로 변해가는 과정이 아주 충격적이었다. 이 책에 나오는 수많은 예제를 통해서 내가 그동안 얼마나 엄청난 스파게티를 만들어 왔는지 반성할 수 있었다.

디자인 패턴은 특정 문제상황을 객체지향적으로 설계해서 해결하는 훌륭한 생각의 단초를 제공해준다. 한마디로 객체지향 패러다임으로 전환하는데 아주 도움이 많이 된다. 물론 쉽지 않다. 기존의 사고의 틀을 깨야 하므로... 하지만 반드시 필요하다. 패턴에 감을 잡으면 개발속도도 빨라지고 버그도 적어진다.

위의 두 책을 본 후에는 다음 책을 보면 좋을 것 같다.
 엔터프라이즈 애플리케이션 아키텍처 패턴  마틴 파울러 지음, 송대국 옮김

이 책은 큰 규모의 웹서비스를 구성할 때 전체 아키텍쳐를 어떻게 잡아야 할지 가이드 라인을 제시해준다. 사실 이 책에서 권고하는대로 사이트를 구성하기는 좀 힘들다. 개발자들이 모두 패턴에 대해 전문가 수준이 되어야 하기 때문이다. 하지만 아키텍쳐의 큰 효과중의 하나가 개발자들간의 커뮤니케이션의 효율화임을 생각해본다면 위의 책을 보고 전체 아키텍쳐를 고민해보는 과정이 반드시 필요하다.

사실 위의 책 이전에 Pattern Oriented Software Architecure 1권을 봐두는게 좋다. 이 책에는 XP에서 말하는 메타포 수준의 아키텍쳐가 수백페이지에 걸쳐서 나와있다. (알라딘에 없다. 국내에 없다. 아마존으로 가야함) 아키텍쳐 스타일이라고도 부른다. 이 책의 장점이라면, 웹사이트뿐만 아니라 특정 영역의 솔루션을 개발할 때 기본적인 설계도를 제공해준다는데 있다. 엔터프라이즈 애플리케이션 아키텍쳐 패턴은 웹사이트가 레이어드 아키텍쳐로 개발된다는 것을 전제로 레이어 안의 설계를 위해서 어떻게 해야 하는지에 대한 지침을 제공한다면, POSA 1권은 그거 보다 좀 더 큰 수준, 레이어 아키텍쳐니 MVC니 파이프&필터니 블랙보드, 퍼블리쉬&서브스크라이브니 하는 패턴들이 나온다. 그 유명한 MVC도 사실 POSA 1권에 나오는 하나의 패턴에 불과하다. 이정도로 큰 규모의 패턴들을 다루는게 POSA 1권이다. 게다가 디자인 패턴책처럼 각 패턴의 말미에 어떤 솔루션을 개발할 때 사용되었다는 간략한 코멘트도 나온다. 옛날에 ETL툴 개발할 떄 이책에 나온 파이프&필터 아키텍쳐에서 핵심 아이디어를 얻었다. 가장 중요한 것을 해결하고 나니 그 뒤로는 상세설계&개발이 비교적 수월하게 풀려나간 경험이 있다. 물론 확장성/유연성도 아주 좋았다.

만약 당신이 네트웍 개발에 종사하고 있다고 하자. 네트웍 서버를 만들어야 하는데... 그렇다면 다음 책을 보면 된다.
C++ Network Programming Volume 1 - ACE와 패턴을 사용한 객체지향 네트워크 프로그래밍  더글라스 슈미츠 외 지음, 곽용재 옮김
수많은 하드웨어 플랫폼과 운영체제상에서 쓸 수 있도록 연구, 개발된 네트워킹 오픈소스 프레임워크 ACE(Adaptive Communication Environment)를 사용한 프로그래밍 방법을 알려주는 책으로, 복잡한 분산 시스템을 개발하고 최적화하기 위한 실용적인 해결책을 제시한다.
C++ Network Programming Volume 2 - ACE와 프레임워크를 이용한 체계적인 재사용 기법  더글라스 슈미츠 외 지음, 곽용재 외 옮김
<C++ Network Programming Volume 1>에서 네트워크 처리 기초 구성 요소인 ACE와 ACE Wrapper Facade 클래스에 대해서 소개했다면, 이번 Volume 2에서는 상위수준의 통신 서비스를 제공하기 위해 Wrapper Facade 위에 프레임워크를 어떻게 구축하는 가를 설명한다.

사실 위의 책은 Pattern Oriented Software Architecture 2권을 좀 더 친절하게 풀어쓴 것에 불과하다. 하지만 POSA 2권이 울나라에 없으니..-_-;;; POSA 2권은 위 두 책의 저자가 ACE 프레임웍을 만들면서 생각해낸 각종 네트웍 개발에 관한 패턴들을 담고 있다. ACE 프레임웍은 유닉스/윈도우에서 모두 돌아가는 비동기 통신 프레임웍이다. 나온지는 꽤 되었는데 한국에는 작년쯤부터 쓰이기 시작했다. 유닉스/윈도우의 시스템 콜을 모두 래핑해서 플랫폼 독립적인 코드가 돌도록 해준다. 이 프레임웍은 플랫폼 독립적인 메모리, IO, 소켓, 데이터타입등을 자체 제공한다. C++이라 매우 빠르다. 2002년에 ETL툴 만들때 이거를 처음 접했으니 그당시에 한국에서는 거의 처음이지 않았을까 싶다. 그때 ACE프레임웍 원저자랑 이멜 주고받으면서 버그도 잡고 그랬는데. 울팀 서버개발자들이 엄청난 천재들이어서 가능한 일이 아니었나 싶다. (난 ACE가지고 직접 개발은 못해보고 공부만 대충...)

위의 책들을 공부하고 나면 어떤 시스템이던 대략 감잡고 큰 설계를 해낼 수가 있다. 물론 OS나 DBMS를 만드는 수준까지야 힘들겠지만, 그 바로 위의 시스템 소프트웨어들, TP모니터나 웹서버, WAS서버등은 설계가능 할 것이고... 웹사이트나 각종 솔루션 설계는 상당히 쉽게 해낼 수 있을거라고 생각한다.

사실 위의 책들은 어디까지나 SW아키텍쳐에 국한한 얘기고 이거 이후에는 데이터 아키텍쳐(전사 데이터 모델링, 튜닝, 데이터 품질관리 등등의 이슈가 있다), 시스템 아키텍쳐(인프라에 해당하는 기계들 구성하고 배치하는 쪽일걸? 잘 모른다) 등등을 통달하면 엔터프라이즈 아키텍트라 이름붙일만 할 것이다. 이 수준까지 가면 미국같으면 연봉 10만달러 우습겠지만 한국에선 솔직히 잘 모르겠다. ㅎㅎㅎ

Posted by maceo

09 22, 2006 01:19 09 22, 2006 01:19
, , , , ,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/70

XP팀의 작업실

XP팀의 작업실

우아 멋지삼~! @.@

CVS체크인->자동빌드->단위테스트->통합테스트 가 자동으로 진행된다는게 대단.
역시 XP의 정수? 는 TDD와 테스트 자동화가 아닐까 싶군.
저런 환경에서 개발을 못해본게 참으로 안타깝네.

Posted by maceo

08 29, 2006 09:56 08 29, 2006 09:56
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/66

Extreme Programming Explained 2판 출간

익스트림 프로그래밍 - 변화를 포용하라, 2판  켄트 벡.신시아 안드레스 지음, 정지호.김창준 옮김
'Extreme Programming' 초판이 나오고 5년 만에 두 번째 판이 나왔다. 개정판이라고는 하지만 사실상 완전히 새로 쓴 것이나 다름없다. 2판은 '무엇'에서 한 단계 더 나아가 XP에 대한 '왜', 곧 실천방법 뒤에 놓인 동기와 원칙들에 대해 매우 많은 것을 말해준다.

나를 만든 책중의 하나인 Extreme Programming Explained 2판이 출간됐다.

때는 바야흐로 2002년, 좌충우돌 초보팀장 시절. 쉽지 않은 프로젝트 두개를 어떻게 관리해야할 지 막막하던 와중에 한줄기 빛이 되어준 김창준님의 XP 소개 기사. 기사를 읽자마자 XP 시리즈 책을 아마존에서 한꺼번에 구입, 순식간에 다 읽었다. 그야말로 제대로 꽂혀서 XP 신도가 되긴 했는데, 돌이켜보건데 철저한 XP 신도인 것만은 아니었던 것 같다.

가장 중요한 테스트 주도 개발을 스스로 관철시키지 못했다. 당시 이니시스에 다니던 후배말로는 습관바꾸는게 너무 힘들었는데 바꾸고 나니 확실히 좋긴 좋았다는 이야기를 들었을 뿐,정작 나는 습관을 바꾸진 못했다. 하지만 NUnit 이나 VBUnit 을 이용해서 테스트 코드를 만들고, 그것을 통과한 코드는 정말로 믿음이 갔다. 뭐랄까... 테스트를 통과한 코드에 문제가 있을리 없다는 자신감? 안도감? 뭐 그런 느낌이랄까? 그리고 변경에 대한 두려움이 확실히 줄어들긴 한다. 하지만 변경이 너무 잦은 경우 테스트 코드와 원래 로직을 함께 바꿔야 하는 부담이 있어서 그 고비를 넘지 못한게 못내 아쉽다. 그때 분명히 내가 잘못한게 있었을 것이다.

그리고 pair programming 도 완전하게 도입하진 못했다. 신입사원 교육할때나 개발 난이도가 좀 있어서 타인의 크로스 체킹이 필요할 때 정도만 pair programming 을 활용했던 것 같다. 다만, 활용해보면 그 효과는 정말로 끝내준다. 개발 속도가 그렇게 느리지도 않을 뿐더러 버그가 확실히 적어진다. 내가 회사 나간 후 클라이언트 개발을 pair 로 상당부분 진행했다고 하는데, 둘이 각자 진행하는것과 비교해서 진척률도 비슷하고 품질은 당연히 더 높았다고 하는군.

유저스토리나 계획게임, 가장 가치있는 것부터 만들기, 매일 10분 간단 미팅 등은 지금 회사에서 플젝 관리를 할 때도 유용하게 써먹는 best practice 다. 마침 울회사의 프로젝트란게 프로젝트다운 프로젝트는 없고 끊임없는 개선작업 정도라고 부르면 적당하다. 1~3명의 개발자가 2주~1달정도 하는 것이니 XP의 일부 practice 를 적용해보기에 아주 좋다. 상담서비스 개발할때 가장 가치있는 것부터 만들기, 매일 10분 간단 미팅 등을 적용해서 이슈거리는 미리미리 제거하고 프로젝트 진행의 가시성을 확보했으며 전체적으로 스무스하게 프로젝트를 끝낸 경험이 있다. 지금 하고 있는 알바에서도 가장 가치있는 것부터 만들기 practice 를 적용중이고...

그때나 지금이나 완전한 XP프로젝트는 겪어보지 못했고 이젠 DBA를 하는지라 불행히도 앞으로 겪어볼 일이 없을 것 같지만, 실제 업무에서 너무나 유용하게 쓰일 수 있는 지혜로 가득차 있는 방법론이라 할만한다. 그런 점에서 XP Explained 의 2판 출간이 너무나 반갑다. 이런책은 자비로 질러줘야 한다. ㅋㅋㅋ



@서점에 가보니 Refactoring to Patterns 번역본도 나와있고 실전에서 어쩌구 하는 패턴책도 있고... 4년전에 비해서 시장규모는 줄었지만 좋은 책은 정말 많이 나왔다. Enterprise Architecture Pattern 이 미국내에서 출판도 되기 전에 Martin Fowler 홈페이지에서 하나하나 받아서 프린트해가며 공부하던 시절이 엊그제 같은데 그책 번역판도 나와있고... 격세지감이 느껴지누만.

Posted by maceo

07 30, 2006 17:17 07 30, 2006 17:17
,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/58

M3 만들때 다이어그램 에디팅 모듈 만든다고 삽질한 기억이
새록새록-_-;;;;;;;;;

클릭! Windows Form을 사용하여 간단한 다이어그램 작성 도구 빌드

--

여기에다가 Command Pattern 적용해서 undo 기능도 붙이고 그러면 된다.

Posted by maceo

11 30, 2005 09:54 11 30, 2005 09:54
,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/10

객체지향 설계에 대한 미신

객체 지향 설계 원칙에 대한 아주 좋은 글.

객체 지향 설계에 대한 미신


조금 인용하자면,

과거에 잘못 소개된 객체 지향 개념들 중 대표적인 것은 다음과 같습니다.

1. 상속은 기능의 확장이다.
2. 객체는 데이터+메소드이다.
3. 캡슐화는 데이터 은닉이다.


'알기 쉬운 디자인 패턴'에서 저자는 위의 개념들이 다음과 같이 수정되어야 한다고 주장하고 있습니다.

1. 상속은 기능의 확장이 아니라 클래스들을 분류하는 수단이다.
2. 객체는 책임이 있는 어떤 것이다.
3. 캡슐화는 데이터, 인터페이스, 클래스, 시스템 등 구현 가능한 모든 것에 대한 은닉이다.



1번 언뜻 보면 이해가 잘 안되지만 찬찬히 읽어보면 정말로 그렇다는 것을 알게 된다. 지금은 하는 일이 DBA라 주로 데이터만 보지만, 개인적인 느낌으로 제대로 된 객체 모델링이 데이터 모델링 보다 훨씬 어려운 것 같다. 엔티티를 찾아내는 것은 데이터의 형태로 실재하는 것을 다루지만 객체 모델링은 해당 도메인에서 일어나는 모든 행위를 먼저 찾고, 그 행위를 수행할(=책임을 지는) 클래스를 도출해내는 것이라 접근 방향이 완전히 다르다.

데이터를 생각할때는 구체적인 비즈니스 로직에 대한 고민을 좀 덜해도 되지만 클래스를 도출해낼때는 그 도메인의 비즈니스 로직의 흐름을 대부분 알고 있어야 제대로 된 클래스를 분류해낼 수 있게 된다. 1번에서 이야기 하는 "상속은 클래스 분류수단" 이라는 말이 결국 잘 보면 행위를 분류하는 수단이라는 말이 아닌가. 게다가 POSA 나 DP에 나온 각종 패턴들이 들어가기 시작하면, 클래스 간의 디펜던시 최소화 문제를 고민해야 하고 그러다보면 객체 모델링의 난이도는 엄청나게 올라간다.

예전 회사에서 각종 툴을 만들면서 대부분의 디자인 패턴을 사용해보기는 했지만, 복잡한 비즈니스를 객체 모델로 구현해본 경험이 없어서 좀 아쉽다. 한번만 제대로 해보면 좋겠는데 (딱 한번만-_-;; 두번은 보나마나 너무 고생스러울 것이기 때문에. ㅎㅎㅎ)

-------------

_퇴근하고 집에서 조금 더 추가_

DB를 사용하는 시스템을 만들다 보면 항상 고민되는 것은 크게 세가지다.

1. (AS-IS와 TO-BE 업무요건이 모두 나왔다는 전제하에) 데이터 모 델링과 객체 모델링은 병렬적으로 진행될 수 있는가?


힘들지만 가능하다... 는게 내 의견이다. 물론 객체 모델링 하는 사람은 그 어려운 OR매핑 레이어 디자인을 염두에 두고 모델을 그려야 하기 때문에 훨씬 고생할 각오를 해야 한다.

열심히 리팩토링하고 TDD하면서 점진적으로 디자인을 개선해갈 수 있겠지만 초기에 빡세게 한 1,2주일 정도 디자인에 대해서 미리 고민을 하는게 무작적 코드로 달려드는 것 보다는 훨씬 더 좋은 것 같다.


2. 불특정 다수의 사용자를 위한 툴이 아닌 일반 비즈니스용 OLTP 시스템에서 디자인 패턴이나 아키텍처 패턴의 효용가치는 어느 정도나 되나?


마틴 파울러나 XP 진영의 guru 들은 대형 SI 프로젝트를 통해 패턴을 만들고 XP 사상을 정립해냈지만, 내 실력이 딸려서 그런지-_- 툴 만들때는 패턴을 적용할만한 상황들이 꽤 많이 보였는데 OLTP 시스템을 만들때는 될듯 안될듯 한 상황이 많았다.


3. (MS플랫폼에 한정된 이야기일 수 있지만) 비즈니스 로직은 애플리케이션 서버단에 있는 것이 좋은가, DB의 스토어드 프로시저로 있는 것이 좋은가?


지금 있는 회사에는 객체지향 마인드를 가진 개발자가 한명도 없기 때문에-_- 별 고민없이 ASP 에 스토어드 프로시저로 모든 시스템을 만들었다. 물론 SP 가 속도도 빠르고 쉽게 쉽게 바꿀 수 있어서 좋긴 한데, 절차지향 언어라는 특성상 업무가 복잡해 지면 if ... else if ... else if ... 의 미로가 필연적으로 나올 수 밖에 없다.
(아 생각만 해도 토나온다-_-;;;;)

파울러의 엔터프라이즈 소프트웨어 아키텍쳐를 봐도 비즈니스 시스템의 가장 도전적인 과제가 끊임없이 변하는 비즈니스 로직을 빠르게 수용하는 것인데 이 문제를 우아하게 해결하는 유일한 방법은 객체 모델 + 리팩토링 이라는 말도 있질 않나. 지금 회사에 들어와서 지난 5년간 계속 뜯어고친 코드들을 보다보니 정말 그 말에 뼈저리게 동감할 수 밖에 없었다.

하지만 애플리케이션 서버라는 것이 중간에 들어가게 되면, 일단 그쪽의 로직을 객체지향적으로 제대로 디자인해내는 것도 상당히 어려운 일인데다가, 무지막지한 로드가 그쪽에 걸리는 상황에서 애플리케이션 서버의 안정적인 운영 자체가 하나의 부담이 되어 버린다. 또한 애플리케이션 서버의 컴포넌트들은 stateless 로 구현해야 하기 때문에 잦은 DB call 의 부담을 피하기가 대단히 힘들다.

이런 고민 때문인지 오라클에는 이미 오래전부터 JDK 와 SQLJ 가 있었고 MS는 SQL2005 에 와서야 .NET 프레임웍을 내장해서 .NET 코드로 스토어드 프로시저를 만들 수 있게 해주고 있다 .하지만 2005 기술문서들을 보면, 데이터를 select, insert, update 하는데는 .NET CLR 보다는 기존의 T-SQL 방식이 더 좋고 읽어온 데이터로 계산할 때 .NET CLR 로 코드를 만들라고 권고하고 있다. 즉, 퍼포먼스와 안정성에 아직 많은 의문의 여지가 있는 것이다. (SQL2000 의 UDF 같은 역적으로 판명될지도 모르지. ㅎㅎㅎ)

아무리 고민을 해도 좀처럼 알 수 없는 어려운 문제다. 대형 SI 프로젝트에서 죽도록 고생하며 고수에게 가르침을 받아야 하는가... (국내에 진정한 고수가 도대체 있긴 한가 모르겠다만...-_-;;;)

Posted by maceo

11 29, 2005 19:33 11 29, 2005 19:33
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/9


블로그 이미지

가늘어도 긴놈이 장땡

- maceo

Archives

Authors

  1. maceo

Calendar

«   9 2010   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

Site Stats

Total hits:
179546
Today:
15
Yesterday:
62