본문 바로가기

카테고리 없음

팀원에게 객제지향 개발을 유도하기 (1/3)

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

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

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

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


+ 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의 유익한 기사가 있어서 소개합니다. '보다 나은 프로그래밍으로 가는 길' 라는 제목의 객체지향의 장점을 설명한 기사입니다.