프레임워크 = 디자인 패턴 + 라이브러리?

어제 어쩌다가 프레임워크 관련 문서를 하나 읽었다. 더글라스 C. 슈미트의 Object-Oriented Application Frameworks와 랄프 존슨의 Evolving Frameworks를 잘 요약해 놓은 문서였는데 이 문서 중에 이런 식이 적혀 있었다.
프레임워크 = 디자인 패턴 + 라이브러리

이 식을 보는 순간 뭔가 억지스럽다는 느낌이 들었다. 별다른 설명없이 이 식만 적혀 있었기에 글에서 (그리고 위의 두 문서에서도) 단서를 찾을 수는 없었다. 식을 보고 든 생각은 대략 이런 것들이었다.
  • 디자인 패턴과 라이브러리를 합한 게 프레임워크라고?
  • 디자인 패턴이 GoF의 디자인 패턴이나 그에 준하는 설계 패턴들을 말하는 건가?
  • 디자인 패턴이 프레임워크를 만들 때 중요한 역할을 하지만 프레임워크의 두 구성 요소 중 하나라고 할 수 있나?
  • 혹시 디자인 패턴을 아키택처 패턴까지 포함한 넒은 의미로 사용했나?
  • 그렇다고 해도 특정 애플리케이션 영역의 지식과 추상화가 프레임워크 제작에서 디자인 패턴보다 더 중요하지 않나?
  • 라이브러리가 그걸 말하는 걸까?
  • 라이브러리란 표현도 좀 어색한데? 어떤 의미로 사용한 거지? 보통은 상위 로직의 추상화가 아닌 하부 로직 모음을 라이브러리라고 하지 않나? 프레임워크에 유용한 클래스 라이브러리가 포함되기는 하지만 필수요소라고 볼 수는 없을 듯 한데... 뭐 이거야 얼마든지 다양하게 쓸 수 있는 여지가 많으니 일단 패스...
무엇보다 그냥 무시하지 못할 것이, 글 자체가 다른 유명한 논문을 요약한 글이기에 작성자가 자의로 이런 식을 쓰지는 않았으리라는 생각이 들었기 때문이다.
대략 이런 단상들이 복잡하게 섞여 떠오르다가 미투데이에 글을 썼다.
프레임워크 = 디자인 패턴 + 라이브러리 이란 공식의 근거는 뭘까? 논리적 비약이 있다고 보는데 혹시 권위 있는 논문이나 책에 근거를 두고 있다면 보고 싶구나
그랬더니 이일민씨가 댓글로 몇가지 단서가 될만한 얘기를 해 줬고 이 식의 원전일 수도 있는 문서를 하나 소개해줬다. ACM에 제출한 논문이라 돈을 주고 사야하나 했는데 간단한 구글 검색으로 구할 수 있었다. (-O-);
이일민씨는 계속 토론을 하고 싶어했지만 내가 배경지식이 없어 오해를 하고 있는 상황일 수도 있으니 일단 문서를 읽고 토론을 계속하거나 내 생각을 정리하기로 했다. (그래서 이 글을 쓴다).
이일민씨가 소개해준 문서는 GoF 중 한 사람인 랄프 존슨의 문서였고 문서 제목이 문제의 식과 비슷했다.
프레임워크 = 컴포넌트 + 패턴 (Frameworks = (Components+Patterns))

회사 업무 때문에 문서 읽을 시간이 없어서 퇴근길에 아이폰에 담아 두었는데 읽기 전까지 제목만 보고는 대략 이런 생각이 들었다.
  • 문제의 식과는 달리 디자인 패턴이 아니라 그냥 패턴이라고 했군.
  • 혹시 이 패턴은 애플리케이션의 문제 영역에 대한 해법을 패턴화한다는 뜻 아닐까? 아니면 그런 의미까지 포함한 더 넓은?
  • 컴포넌트라... 재사용 가능한 클래스를 컴포넌트라고 한 건가?
  • 프레임워크를 사용해 컴포넌트를 만든다고 말한다면 모를까 프레임워크의 두 구성요소 중 하나가 컴포넌트라니... 어떤 의미로 컴포넌트란 단어를 쓴 걸까?
  • 프레임워크, 패턴, 컴포넌트가 복수다. (정확히는 모르겠지만 뭔가 느낌이 달라!)
참고로 내가 컴포넌트라는 말을 쓸 때의 의미는 대략 이렇다.
  • 클래스를 하나 이상 사용해 구현한 기능 단위
  • 소스 코드가 아닌 바이너리 상태로 배포/재사용된다.
  • 경계 객체가 외부와의 인터페이스 역할을 한다.
  • 여러 속성을 외부에서 설정해서 작동 방식을 조정할 수 있지만 일반 클래스 라이브러리보다는 응집도가 높아서 기능을 확장하기엔 한계가 있다.
아무튼 시간은 흘러 퇴근 시간이 됐고 문서를 읽었다. 피곤한 가운데 (10시 퇴근) 흔들리는 버스 안에서 읽었기에 정독하지는 못했기에 바로 이해했는지 모르겠지만 문서의 내용은 대략 이랬다.
  • 프레임워크는 객체지향 재사용 기술이다.
  • 프레임워크는 다른 전통적인 재사용 기술과 비슷한 부분도 있지만 차이점도 있다.
  • 프레임워크는 장점도 있지만 단점도 있다.
  • 프레임워크가 컴포넌트라고 말하는 사람이 있는데 비슷한 부분이 있음에도 프레임워크는 컴포넌트보다 더 (확장해서 애플리케이션의 특별한 상황에 맞추기에) 유연하고 (배우고 사용하기) 복잡고 어렵다.
  • 프레임워크가 설계 재사용이라고 볼 수도 있지만, 다른 설계 재사용 기술이 별도의 설계 표현 방법을 사용하는 한편 프레임워크는 코드로 설계를 표현했다는 점에서 다르다. 프레임워크는 언어에 종속적이다.
  • 프레임워크는 애플리케이션 생성기나 도메인 전용 아키텍처와도 유사하지만 다르다.
  • 프레임워크는 패턴을 표현하기도 하고 패턴을 활용하기도 한다. 하지만 코드로 표현했다는 면에서 더 구체적이고 일부 구현을 했다는 점에서 유연성이 떨어진다.
 글에서 다른 재사용 기술과 프레임워크의 차이를 비교하면서 프레임워크의 성격을 정의한 문장은 이렇다.
Frameworks are firmly in the middle of reuse techniques. They are more abstract and flexible than components, but more concrete and easier to reuse than a pure design (but less flexible and less likely to be applicable). Although they can be thought of as a more concrete form of a pattern, frameworks are more like techniques that reuse both design and code, such as application generators and templates. Patterns are illustrated by programs, but a framework is a program.

 프레임워크는 분명히 재사용 기술들 중심에 있다. 프레임워크는 컴포넌트보다 추상적이고 유연하지만 순수한 설계보다는 구체적이고 재사용하기 쉽다(반면에 유연성이나 적용 가능성이 떨어진다). 프레임워크를 패턴을 구체화한 형태로 볼 수 있다. 그럼에도, 프레임워크는 애플리케이션 생성기과 템플릿처럼 설계와 코드 모두를 재사용하는 기술에 더 가깝다. 패턴을 설명할 때 프로그램을 사용하는 반면에 프레임워크는 프로그램 자체다.
 그럼 문서를 읽고 나서의 내 생각은 뭘까?
 일단 프레임워크 = 패턴 + 컴포넌트라는 식에 대한 생각은 이렇다.
  • 이 식을 수식으로 보면 안 된다. 프레임워트가 단순히 하나 이상의 패턴과 컴포넌트의 "조합"이란 의미는 아니다.
  • 그럼 이렇게 보면 어떨까? Pattern < Framework < Component. 어느 정도 문서의 내용과 비슷하지만 이것도 아니다. 프레임워크가 추상화 관점에서 패턴과 컴포넌트 중간 정도에 있는 건 맞지만 패턴이 컴포넌트로 구체화 되는 중간에 생기는 것은 아니다.
  • 이 식을 변증법적으로 읽으면 어떨까? 즉 "+" 기호를 "종합"으로 읽으면? 비록 패턴과 컴포넌트가 정과 반의 관계는 아니지만 둘을 "종합"한 결과로 전혀 다른 성격의 합이 나왔다는 식으로 읽으면 어느 정도 글의 내용과도 일치하고 내 직관과도 어긋나지 않는다.
원래의 식인 프레임워크 = 디자인 패턴 + 라이브러리에 대한 내 생각은 이렇다.
  • 일단 글에서 자세한 설명을 하지 않았기에 추측 이상은 어렵다.
  • 랄프 존슨의 글이 원전이라면 패턴을 디자인 패턴으로 바꾼 건 오류에 가깝다. 흔히 디자인 패턴은 GoF의 디자인 패턴을 말할 때 사용하는데 이 디자인 패턴은 패턴이라는 도구를 객체 설계 영역에 적용한 결과며 랄프 존슨의 글에서는 디자인 패턴에 제한해서 패턴을 말하지는 않는다. 물론 디자인 패턴은 프레임워크 제작에 아주 중요한 역할을 한다.
  • 컴포넌트를 라이브러리로 바꾼 부분도 오해의 소지가 크다. 흔히 라이브러리는 작은 하위 기능 요소의 묶음을 의미하며 컴포넌트 같이 덩어리가 큰 코드를 묶었다고 라이브러리라고 부르지는 않는다. (적어도 내 단어 사전에 의하면... 하지만 Evolving Framework에서는 컴포넌트 라이브러리란 말을 쓴다).
하지만 마음을 곱게 써야 성장한다고 하니 이 글 덕에 좋은 글을 읽을 수 있어서 고맙다고 해야겠고 오해의 소지가 있어 보임에도 아주 틀렸다고도 할 수 없으니 뭐... 그렇다. (응?)
다시 확인한 교훈 한가지는 가능하면 원전 또는 고전을 읽어야 한다. 사실 랄프 존슨의 논문은 여러 글에서 인용된 글이라서 어느 정도 부분적으로는 접했던 내용이다. 하지만 원문을 읽으니 확실히 이해의 깊이와 폭이 다르다.
나 같은 삼거리 개발자가 스프링 덕에 별 복에도 없는 좋은 지식을 익히게 된다는 생각이 든다. 좋은 API는 좋은 코드를 유도할 뿐 아니라 좋은 지식을 쌓게 하고 좋은 사람들을 만나게 한다. (갑자기 왠 뚱딴지 같은 결말?)

------

추가

여러 말을 했지만 내 논점은 딱 두 가지다.
  1. 문제의 식에서 디자인 패턴이 뭘 말하는 걸까? 내 생각에 디자인 패턴이란 단어는 고유명사에 가깝다고 생각한다. 그러니 식에서 사용한 디자인 패턴이 GoF의 디자인 패턴을 말할 때 사용하는 디자인 패턴과 의미가 다르다면 표현을 바꾸거나 따로 설명을 해야 한다고 본다. 그리고 만약 정말 GoF의 디자인 패턴과 같은 의미로 사용했다면 디자인 패턴의 의미를 너무 강조한 것 아니냐는 생각이 든다. 프래임워크 제작에 디자인 패턴이 중요하지 않다는 말이 아니다. 비 본질적이라는 의미다. 내 말은 좋은 객체지향 코드 중에 디자인 패턴이랑 관계 없는 코드가 어디 있냐는 말이다.
  2. 문제의 식이 자의적으로 만들어낸 식인지, 아니면 어떤 권위있는 원전에 근거를 두고 있는지 아직 모르겠다. 적어도 랄프 존슨의 글은 아니라고 본다.

by 박성철 | 2011/07/21 10:17 | 프로그래밍 이야기 | 트랙백(2) | 핑백(1) | 덧글(4)

트랙백 주소 : http://gyumee.egloos.com/tb/3203986
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from Younghoe.Inf.. at 2011/07/22 11:56

제목 : 프레임워크에 대한 논의
다시 블로깅을 한다고 해놓고 휴업 중이다가 폭발적인 소재는 아니지만, 친한 두 사람의 논쟁에 괜히 끼고 싶은 마음에 몇 자 적는다. 무릇 논쟁을 하려면 문헌을 찾아가며 사실에 기초하는 태도가 옳다고 하겠으나 그랬다가는 쓰다가 포기할 것이 뻔하고, 할 일도 많아서 오래전 대학원에서 공부한 내용과 일하면서 습득한 내용을 버무려서 개입하려고 한다. 그래서, 읽는 이의 오류를 줄이기 위해서 주장의 근저에 있는 가치관을 밝히면 나는 대체로 문헌에 대한 ......more

Tracked from Younghoe.Inf.. at 2011/07/26 09:30

제목 : 랄프 존슨의 프레임워크 관련 글을 읽고
Toby 형이 (묻지도 따지지도 않고) 보내준 기사를 어제 퇴근 길에 읽었다. 성철형이 찾아낸 링크를 통해 누구나 구할 수 있다. 무려 97년 글이지만, 상당 부분은 프레임워크 이해에 도움을 준다. 그래서, 간단히 메모해둔다. Frameworks are a component in the sense that venders sell them as products, and an application might use several framewkrs.......more

Linked at 프레임워크 관련 링크 - Ki.. at 2014/06/13 10:52

... 모르겠다. 구글에서 몇글자 검색했더니 너무너무 좋은 글들이 많이 보인다. 이분들 블로그를 보면.. 나의 밑바닥 지식이 참 부끄러워진다.. ㅠㅠ http://gyumee.egloos.com/3203986 http://myepistle.egloos.com/511641http://arload.wordpress.com/2008/09/15/ev ... more

Commented by PatternLoa at 2011/07/22 14:19
작년에 PLoP에 Framework Engineering이라는 논문을 냈습니다.

전 그때 POSA의 저자인 Douglas Schmidts 님의 말을 인용했지요..

Frameworks define “semi-complete” application that embody domain-specific object structures and functionality.

전 개인적으로 이 문구가 마음에 듭니다. ^^ 사람마다 다르겠죠.

joe yoder (AOM) 분이 저의 패턴을 다듬어 주셨는데, ralph johnson의 framework 철학을 더 적어주시길 원하는 눈치였습니다. 그 분의 제자라서.. 쿨럭..

좋은글 감사드리구요. 저 역시 framework design guidelines 라는 서적을 번역하면서, 이것 저것 많이 배우는 입장인데, 제가 일전에 framework에 관련된 내용들을 서적을 읽으면서 정리했습니다. :)

좀더 정보를 공유하는 차원에서 제가 일전에 적었던 글을 포스팅합니다.

http://arload.wordpress.com/2009/02/05/maso200902_frameworkengineering/

http://arload.wordpress.com/2009/03/04/maso200903-framework-engineering-ii/
Commented by 박성철 at 2011/07/26 09:05
안녕하세요. 손영수님. 반갑습니다. 지금보니 밑 글에도 댓글을 달아주셨네요. 링크거신 글은 잘 읽어보겠습니다.그런데 인용하신 더글라스 슈미츠씨의 말과 랄프 존슨의 철학이 어떻게 다른가요? semi-complete라는 표현이 적절하지 않다고 느끼는 걸까요? 오해의 여지가 있기는 한데요.
암튼 반갑습니다.
아! 에바의 백승용씨가 저희 회사에 있습니다. 잘 부탁드립니다. ^^
Commented by 최영목 at 2011/08/03 21:50
스프링 덕에 좋은 지식을 얻게되셨듯 좋은 업계 선배님덕에 후배들이 좋은 지식을 얻게끔 해주세요!!!

지난번에 저 강의때 번개하시고 ㅠㅠ 조만간 번개 부탁드려요 굽신굽신(__)

ps. 채수원 과장님께도 부탁드렸어요 ^^ 아 맞다. 저 8월 16일부터 2주간 또 야간강의입니다. 이번에는 송파 ㄷㄷㄷ;;;;
Commented by patternloa at 2011/10/27 19:18
제가 발 부탁드려야죠. ^^ 그런 의미는 아니구요. 서로 자타를 공인하는 프레임웤의 대가이기 때문에. 약간 자기의 사싱이나 생각을 더 적어주기를 바라는 거죠. ^^ 일종의 영향력 행사..

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶