우리회사 팀원들은 각 분야에 일가를 이룬 분들입니다. 특히 금융 전산 분야에서 우리의 능력은 탁월하죠. 다만 오래전부터 경력쌓던 분이라 그런지 절자지향적인 개발에 익숙하고 객체지향 개발은 다소 멀게 느끼시는 그런 모습이 있었습니다.

잠깐, 내가 생각하는 절차지향, 객체지향 프로그래밍
절차지향은, 모든 프로그래밍을 처리, 분기, 반복으로 처리할수 있다는 관점에서 절차적으로 처리하는 방식
객체지향은, 세상의 모든 요소를 객체와 객체간의 관계로 추상화하여, 추상화시 얻을 수 있는 확장성과 유지보수 편리함을 지향하는 개발 방법론

예전에 우리 회사 솔루션 개발에 객체지향 솔루션을 가져다 쓰면서 동료들이 몇가지 의문을 제기한 부분이 있었는데요. 그 의문들은 대부분 원론적인 질문들이라 제가 제대로 답변을 못한 부분이 많았습니다.

그런데 이런 의문들은 한번쯤 생각해볼만한 가치있는 질문이라 예전부터 따로 정리하려고 벼르고 있었습니다. 이번에 드디어 쓰려고 하는데요. 제가 당시 대답했거나 이렇게 대답하면 좋았을걸~ 이란 답변들을 써보겠습니다.


+ 2007년 가을 어느 회의실

> 스프링 프레임워크 좋기는 한것 같은데.. 우리 나름대로 개발하는게 더 편하고 더 빨리 개발할 수 있으면 프레임워크 없이 써도 되는거 아닐까?

잠깐, 프레임워크의 정의 : http://jus1170.tistory.com/4799 에 잘나와있습니다.

프레임워크의 도입 여부는 비용대 효과가 얼마큼 되느냐에 달려있을 것입니다. 프레임워크에서 가장 많이 드는 비용은 바로 개발자의 학습 비용입니다. 만약 학습 비용만큼의 효과가 없다면 그냥 우리 마음대로 개발하면 될 것이고 학습 비용만큼의 효과를 볼 수 있다면 당연히 프레임워크를 도입해야 할 것입니다.

만약에 우리 회사 홈페이지 게시판 같은 작은 프로그램을 만든다면 우리 마음대로 개발해도 됩니다. 그런데 우리 회사의 핵심을 담당할 솔루션이라면 프레임워크를 사용하여 체계적으로 개발할 필요가 있습니다. 그래서 프레임워크 학습비용을 지출해서라도 프레임워크를 써야 할 필요가 있습니다.

그렇다면 프레임워크 도입시 어떤 효과가 있는가~ 여부가 이슈일 것인데, 무엇보다 개발자를 귀챃게 만드는게 프레임워크가 아니라 개발자를 편하게 하기 위해 프레임워크가 만들어졌다는 것이 핵심입니다.

스프링 프레임워크를 예로 들면 개발자가 개발을 하다 보면 나도 모르게 객체지향 개발에서 어긋나게 되는데 꾸준한 객체지향을 돕기 위한 IoC기능이 있고, 일반 자바를 쓰면 복잡하면서 커넥션 누수등의 위험 요소 가득한 DB 접근 코드 대신, 스프링이 알아서 다해주는 DAO 유틸리티 기능을 제공하여 DB 작업을 안전하고 편리하게 쓸 수 있습니다. 이렇게 스프링에는 개발자들에게 편리함을 제공하는 여러 유틸리티 기능이 미리 들어가 있고 IoC, MVC등의 바른 객체지향 개발을 유도하는 프레임워크적인 고유 기능도 잘 들어가있습니다.

이런 프레임워크의 장점을 온전히 누릴수 있기 때문에, 개발자를 귀찮게 하는 것이 아니라 반대로 공짜로 편리하게 개발할 수 있도록 도와주기 때문에, 약간의 학습비용을 지출해서라도 우리회사에 꼭 도입해야 되는 것입니다.


> 객체지향스럽게 짜야 되는 이유는 무엇일까, 그리고 객체지향 스럽게 짠다는 의미가 어떤 의미지?

객체지향이란 세상의 모든 요소를 객체와 객체간의 관계로
추상화 한다고 제가 정리해봤는데요. 객체지향의 핵심은 바로 추상화에 있다고 생각합니다.

추상화가 무엇이냐면 공통적으로 묶일수 있는 특성들을 묶어서 하나의 객체 그룹으로 재 창출하는 것이라 정리해 봤습니다.

예를들어 블랙잭, 햅틱, 아이폰, 아르고등의 핸드폰이 있습니다. 이 핸드폰은 개별로 존재하는 객체지만 ‘핸드폰’ 이란 하나의 객체로 추상화 시켜서 ‘가족화/그룹화’ 시킬수 있습니다.

핸드폰이란 추상객체가 있고 이 핸드폰의 명세를 준수하는 블랙잭, 햅틱, 아이폰, 아르고 등이 존재하는 것이죠. 이렇게 묶어놓으면 '핸드폰 가족 객체'를 필요로 하는 곳에서 별도의 자식 핸드폰 객체의 의존 없이(예:블랙잭, 아이폰의 자식 객체에 의존할 필요가 없다.) 사용할 수 있기 때문에 확장성 높고 유지보수 편리한 개발을 할 수 있습니다.

객체지향스럽게 짜야되는 이유는 바로 추상화를 통한 높은 확장성과 유지보수 편리한 개발을 지향할 수 있기 때문이고, 객체지향스럽게 짠다는 의미는 바로 대상 요소를 잘 추상화 하여 자유로운 확장을 지향하고 유지보수 편리하게 활용한다는 의미라고 생각합니다.

사용자 삽입 이미지
[절차지향같은 경우 하나의 가족으로 묶어서 추상화 할 수 있는 핸드폰 관련 요소들도 별도의 함수로 분리되어 있다.]

사용자 삽입 이미지
[위의 분산된 요소를 하나의 핸드폰 가족으로 묶어서 추상화 하고, 통화방법 및 무선인터넷 기능 같은 경우 Strategy Pattern으로 묶어서 다시 추상화 하여 골라 쓸 수 있다.]


+ 다음편에서는..


지금 제가 적은 답변들은 완전한 정답이 아니라 제가 공부한것과 경험으로 쓴 것이기 때문에 어딘가 부족할것이 있다고 생각합니다.
다시 한번 고수개발자 분 들의 값진 조언을 듣고 싶습니다. 객체지향에 관한 수많은 재야 고수들이 계실것인데 값진 피드백 부탁드립니다.

1편에서는,
> 스프링 프레임워크 좋기는 한것 같은데.. 우리 나름대로 개발하는게 더 편하고 더 빨리 개발할 수 있으면 프레임워크 없이 써도 되는거 아닐까?
> 객체지향스럽게 짜야 되는 이유는 무엇일까, 그리고 객체지향 스럽게 짠다는 의미가 어떤 의미지?
의 의문을 다뤘는데요.

2편에서는,
> JUnit 등으로 테스트 클래스를 만들면 왜 좋은거죠?
> 성능 VS 유지보수라면 빨리 개발하고 빠른 성능 봐야 되는 우리 입장에서 성능을 고려해야 되지 않을까.

3편에서는
> 잠깐, 왜 인터페이스와 인터페이스를 상속하는 구현체를 만드는 식으로 프로그래밍 해야 하는 거죠?
> 스프링 프레임워크에 실제로 레거시 코드(예전에 짠 소스)를 어떻게 이식했는가..

의 의문에 대한 제 나름대로의 답을 쓸 예정입니다. 3편까지 다 써놨는데, 한편으로 종합하려다 보니 너무 길어서 3개의 포스팅으로 분리하였습니다. 부디 제 생각이 맞았으면 좋겠고, 고수 개발자분들의 피드백 부탁드립니다. ^ ^


덧1) 산골 블로그의 객체지향 관련글
추상화의 고수가 되자. (생각의 탄생)
객체지향 글쓰기 (글쓰기 프로그래밍이 가능할까?)
한국스프링사용자모임2회(KSUG) 참가 후기 (스프링 달인의 한수 가르침)
한국스프링사용자모임3회(KSUG) 참가 후기 (자리잡은 커뮤니티)
한국스프링사용자모임4회(KSUG) 참가 후기 (AOP)
한국스프링사용자모임5회(KSUG) 참가 후기 (웹플로우(WebFlow), 보안(Acegi))

덧2) IBM developerWorks의 관련글
마침 IBM developerWorks의 유익한 기사가 있어서 소개합니다. '보다 나은 프로그래밍으로 가는 길' 라는 제목의 객체지향의 장점을 설명한 기사입니다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 산골
산골 블로그 소개 저는 하얀머리 개발자와 작가를 꿈꾸는 블로거 산골 입니다. 프로그램 개발자로서 저의 관심사는 개발자의 숨통을 트여준 아이폰 개발, 철학과 같은 깊이가 있는 객체지향 방법론입니다. 글쓰기와 수영을 좋아합니다. 블로그를 통해 관심사를 공유합니다. 제 블로그에 관심 있으시면 아래 RSS나 즐겨찾기로 편하게 구독하세요.

rss Bookmark and Share

댓글을 달아 주세요

  1. BlogIcon arma 2008.05.19 15:54 신고  댓글주소  수정/삭제  댓글쓰기

    이 글을 보면 우리회사에는 개념없는 개발자(개발편의주의자)만 있는 줄 알겠네... 아싸~~ 좋쿠나~

    • BlogIcon 산골 2008.05.23 11:50 신고  댓글주소  수정/삭제

      어이쿠~ 팀장님 죄송합니다.
      그런데 저런 질문이 안좋은게 아니라 당연히 할말한
      질문이라고 생각합니다.
      다만 같은말이라도 늬앙스의 차이인데 질문의 늬앙스
      를 바꿨습니다.
      저런 질문이라면 누구나 할말한..저라도 돌다리도
      두드려가는 생각으로 할만한 당연한 질문이라고 생각합니다. ^ ^;

      그리고 이 글 마무리 지으면서 그래도 내가 객체지향은
      좀 하지~ 이렇게 생각했는데 오늘 또 반전을 경험했네요.

      회사동료가 DB모델링을 분석해보라고 했는데,
      앞이 깜깜하니 잘 분석이 안되더라구요.

      같은 프로그래밍 분야라도 나에게 맞는 분야가 있고
      어려운 분야가 있는것 같은데 객체지향은 저에게
      잘 맞는 것 같은데 DB분석같은 경우는 제가 많이
      배워야 될 것 같습니다.

      서두에도 강조했지만..우리 동료들은 자기만의 분야에서
      일가를 이루신 분들입니다. 팀장님은 업무분석에
      달인이시고요.. 그런 생각을 가지고 썼고..당연히
      할만한 질문이라고 생각했기에 쓰게 되었습니다.

      결론은 아직도 배울길이 멀다는 것을 오늘 또 느꼈습니다. ^ ^

  2. 쉰밥 2008.05.19 16:21 신고  댓글주소  수정/삭제  댓글쓰기

    이건 순전히 제 개인적인 생각이며 전혀 검증되지 않은 의견이니 너무 심각하게 읽지는 마시기 바랍니다.
    저도 심각한 주제들에 대해 동료들과 가끔 이야기를 나눠봅니다만 누구의 의견이
    옳고 그름을 떠나서 이런 대화 자체가 개발이라는 분야에서 일하는 우리들에게 전진할 에너지를
    공급해 주는 것 같습니다.

    제가 이런 얘기를 하는 이유는 아래 글이 비실용적인 선문답처럼 보이기도 하기 때문입니다. ^^

    객체지향에 입문한 것은 아주 오래 전이군요. 처음엔 도무지 감을 잡지 못하겠더군요.
    그렇지만 그 시절 이 책 저 책에 빠지지 않고 나왔던 "소프트웨어 위기",
    "실세계 모사", "패러다임 전환" 이런 문구들은 늘 기억에 남았습니다.

    먼저 소프트웨어 위기부터 얘기 하자면... 다들 아시다시피 시대가 변하면서 소프트웨어의
    규모와 다양성이 증대되고 복잡도는 그에 대한 지수배 증가를 피하지 못하게 되었죠.
    이쯤 되니 사람 머리로는 모두 이해하기 또는 기억하기가 불가능한 수준에 다다른 것이죠.

    이 당시에도 "관심 사항의 분리"나 "잘게 쪼개서 정복한다"는 등의 기법들은 가지고 있었지만
    소프트웨어 구성 요소들이 단순히 길다랗게 한줄로 늘어서 있는것이 아니라 서로 얽히고 섥혀 있기
    때문에 기존의 방법만으로는 복잡도를 조절하는 것에 한계가 있었습니다.

    태초에 누구의 아이디어였는지는 모르겠지만 소프트웨어의 그런 얽히고 섥힌 관계들이 마치
    우리 실제 새상과 비슷하다고 느꼈던 것 같습니다. 그리고 실 세계를 보면서 우리 인간은 소프트웨어를
    해석할 때처럼 머리를 쥐어 뜯지는 않는다는데 착안한 것 같습니다.

    소프트웨어도 우리가 실세계를 바라보듯 이해한다면 나름대로는 편안하게 그럭저럭 돌아가도록
    또는 이해할 수 있도록 만들 수 있을것이라 생각한 것이죠.

    그러다보니 인간 자체에 대해 관심을 갖을 수 밖에 없었습니다. 실제 세상은 무지 복잡하다는
    것을 우리는 알고 있습니다 그렇지만 우리는 늘 머리를 뜯으며 지내진 않습니다. 이 것은 인간의
    진화 과정과 매우 밀접한 관계가 있어보입니다.
    예를 들어 초원에서 사자를 만난다면 우리에게 "사자는 인간을 먹는다"는 사실 이외의 정보는 필요치 않을겁니다.
    이 정보만 있어도 우리는 무조건 도망간다는 우리에게 꼭 필요한 행위를 수행하기 위한 판단을 할 수 있으니까요.
    더 많은 정보는 우리 머리숱도 남아나지 않게 하겠지만 머리 뜯고 있는동안 사자도 2미터 앞에서 보게될테니까요.

    이는 추상화의 과정이기도 한데 추상화의 관점이 인간이 세상을 보는 방식으로 이뤄져야한다는 것을
    의미합니다. "실세계 모사"는 이를 두고 한 말이죠. 사자를 보고 "발이 네개 달린 동물"로 추상화 하는
    것보다는 "사람을 잡아 먹는 동물"로 추상화 하는것이 더 적절할 것입니다. 그래야 머리를 쥐어 뜯지 않고도
    내가 죽을 힘을 다해 튀어야 한다는 결론에 쉽게 이를 수 있죠. (사실 실제 프로그래머들이 작성한 코드를
    보면 if (iSee("발이 네개 달린 동물")) runAway(); 이런 식으로 되어 있는 경우도많죠 ^^)

    객체지향의 여러 도구(원칙)들을 보면 인간이 어떻게 실세계를 인식하는지를 조사해 발명한 것 처럼 보입니다.
    가장 유명한 상속이라는 것도 그렇지 않은가요? (다형성도 그렇죠. 객체지향은 인간이 더 이해하기
    쉽게 하자고 나온 것인데 우리나라에서는 더어려워진 것 같습니다. 다형성이라는 용어를 처음 접했을 때의
    기분이라니...)

    "패러다임 전환"이라는 용어는 그 동안 컴퓨터 프로그램을 컴퓨터적인 시각으로 봐온 것을 인간의 시각으로
    전환했다는 이야기입니다. 컴퓨터적인 시각으로 본다는 것은 어찌 보면 본질적으로 더 단순할 수 있지만
    우리 인간에게는 몸에 맞지 않은 옷을 입는 겪이었죠. 객체지향 이전의 소프트웨어 공학이라는 것이
    옷에 몸을 맞추려는 시도로 일관되어 왔었지만 객체지향이 나타나면서 시각 전환을 감행한 것입니다.

    객체지향적 접근법을 배우면서 재사용성이나 확장성같은 것들도 꼭 고민해봐야할 주제지만 무엇보다도
    중요한 것은 다루는 대상을 인간의 관점으로 목적에 맞게 추상화하는 모델링 능력인 것 같습니다.

    좀 벗어나지만 객체지향 모델링에 대해 이야기 해보고싶네요.

    모델링(Modeling)과 설계(Design)를 저도 헤깔릴 때가 많습니만 설계가 다루는 대상을How로 생각하고
    모델링이 다루는 대상을 What으로 생각하는 것이 좋겠습니다.

    모델링은 IT인이 아니어도 할수 있습니다. 모델링 능력을 키우는 것은 이미 프로그래머이신 분들에게는
    생각보다 시간이 많이 소요될 것입니다. 저도 모델링 경험이 많다고 생각하지만 요즘도 할 때마다
    고민을 많이 합니다. 아직 인간이 안된 모양입니다.

    저는 어떤 책을 읽고 나면 가끔 내용 요약 차원에서 객체지향 모델링해봅니다. 그러면 머리 속에 핵심
    내용이 한큐에 들어서는 경우가 많습니다. 소설을 읽었을 때도 인물, 장소, 시간, 갈등요소 이런 것들을
    나열하고 서로 연결해 관계를 맺어주면 정말 책을 제대로 읽었다는 흐뭇함까지 느껴지곤 합니다.
    인물도 "나쁜놈", "좋은놈" 여기서부터 상속 계층을 만들 수도 있잖아요. (현대소설은 좀 무리가 있겠네요. --)

    아무튼 객체지향 모델링은 여러모로 세상을 이해하는 데 좋은 도구인 것 같습니다. 게다가 이 곳 저 곳에
    써보다보면 모델링 실력이 향상되서 언젠가는 결국 연봉을 올려주는데도 일조할 수 있을테니까요. ^^

    써놓고보니 댓글이라고 하기 무색하군요.

    • BlogIcon 산골 2008.05.21 01:01 신고  댓글주소  수정/삭제

      쉰밥 선생님..귀중하고 소중한 댓글..정성스런 댓글
      남겨주셔서 감사합니다..다만 쉽게 답글 달수 없는
      진지한 댓글이라 저도 생각좀 해보고 다시..답글달겠습니다. 곧 다시 답글 달겠습니다. ^ ^

    • BlogIcon 산골 2008.05.24 20:59 신고  댓글주소  수정/삭제

      검증되지 않았다고 말씀하시기에는 댓글이 너무 전문적이고 깊이가 있으셔서
      저도 답글을 달기가 쉽지 않았습니다. 너무 감사드리구요.

      컴퓨터 프로그램의 얽히고 섥힌 관계가 실제 세상과 비슷하게 느꼈고,
      소프트웨어도 실세계를 바라보듯 이해한다면 편하지 않을까.. 그리고
      그 실세계를 이해하는 과정이 추상화의 과정이다..
      그래서 객체지향은 인간이 어떻게 실세계를 인식하는지 연구해 발명한것처럼
      보인다는 말씀이시군요.

      그리고 이 객체지향이 컴퓨터적인 시각으로 봐온것을 인간의 시각으로 전환한 획기적인
      페러다임의 전환이었으며, 객체지향에서 가장 중요한 능력은 다루는 대상을 인간의
      관점으로 목적에 맞게 추상화 하는 것이 중요하다고 하셨습니다.

      모델링은 무엇을, 설계는 어떻게의 관점으로 봐야 되고..

      책의 내용 요약차원에서 객체지향 모델링을 하신다는 말씀은 참신하다고 느꼈습니다.
      저는 이런 생각까진 하지 못했는데 모든 생활에 적용하면 여러모로 유익할것이라
      생각해보았습니다.

      객체지향은 실세계와 비슷한 분석 방법으로서 세상과 컴퓨터를 이해하는데 좋은 도구이며
      이곳저곳에 모델링을 하면서 객체지향 실력과 실세계 분석능력을 키우면 도움이 될것 같아요.

      선생님의 값진 댓글을 이렇게 정리해보았습니다.

      제가 위의 글 객체지향 모델링시 강조한 추상화와 연관되는 말씀이시네요. 본문의
      글을 보완하는 값진 댓글 감사드리며 선생님 덕분에 많이 배울 수 있었습니다. ^ ^

    • 쉰밥 2008.05.27 00:14 신고  댓글주소  수정/삭제

      산골소년님... 제 댓글에 칭찬을 많이 해주셔서 몸둘바를 모르겠네요. 그리고 산만하게 써 놓은 제 댓글을 간결히 요약해 주셔서 저도 제가 무슨 말 했는지를 산골소년님이 써 놓으신 요약을 보니 더 잘 알겠더라구요. 저도 산골소년님의 블로그 등 좋은 블로그들을 구경하다보면 글 쓰는데에 도전해보고싶다는 생각이 많이 드네요. 저에게 항상 자극이 되는 좋은 글들 앞으로도 기대할께요~

    • BlogIcon 산골 2008.05.28 22:49 신고  댓글주소  수정/삭제

      쉰밥님도 블로그 하시면 잘하실것 같습니다만..
      앞으로도 종종 좋은의견 부탁드립니다. ^ ^

  3. BlogIcon 길위에서있다. 2008.05.23 11:56 신고  댓글주소  수정/삭제  댓글쓰기

    산골소년에 블로그는 너무 사실적이야.. ㅋㅋ

    산골소년에 글을 보면서 항상 느끼는 것은
    본인에 글을 확연하게 드러내기 위해서
    글이 가끔은 과장된다는 것 같아.

    그리고 본인이 믿는 것을 맹신하는 경향이 있는것 같아.
    얘기를 해보면 아니라고 하는 것을 보면
    정말로 글을 위해서 맹신하는듯한 표현을 많이 쓰는 것 같아.

    산골소년으로 인해 객체지향을 싫어하는 개념없는 개발자가 되어버렸네......

    • BlogIcon 산골 2008.05.25 09:18 신고  댓글주소  수정/삭제

      형 의도는 우리 회사가 아니라 전체적인..보편적인..
      관점에서 설명하려고 했는데 불편함만 준것 같다.
      다시는 이런 불편함과 문제가 안생기도록 할께유~
      죄송해유~ ^ ^

  4. 2008.05.23 11:58  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • BlogIcon 산골 2008.05.24 20:49 신고  댓글주소  수정/삭제

      특히 비밀님께.. 다시 이런 문제가 생기면..
      되돌릴수 없다는 생각이 들어서..더욱더 주의하여..
      앞으로는 불편함을 끼치지 않도록 하겠습니다.
      죄송합니다. ^ ^

  5. BlogIcon trendon 2008.06.08 01:52 신고  댓글주소  수정/삭제  댓글쓰기

    UML 이라는 모델링 언어가 있던데...... ㄷㄷㄷㄷ

    OOP 개념만 살짝 알고 코드를 모르는 한사람으로써...........

    개발자로 근무하시는 군요....

  6. BlogIcon 정환 2008.08.21 13:13 신고  댓글주소  수정/삭제  댓글쓰기

    흥미진진하네요. ^^ 글 잘 읽고 있습니다.