본문 바로가기

기타/객체지향의 탄생(2013)

객체지향의 탄생, 마무리

 

  1. 객체지향의 탄생, 마무리

내가 이 글들을 쓰게 된 계기는 소프트웨어 개발자가 나에게 천직이고 괜찮은 직업 같은데 우리나라에서는 워낙 고생하게 되니, 대안이 없을까 라고 생각하다가 쓰게 되었다. 어떠한 환경이라도 개발자 스스로 개발 환경 개선에 노력해야 하고 그 중심은 좋은 코드를 만들어 개발한 본인이나 다른 개발자가 유지보수하기 쉽도록 하는것이 쾌적하고 즐거운 개발의 출발이라고 생각했다.

 

객체지향은 코드를 유연하고 확장하기 쉽게 잘 만들 수 있는 모든 방법의 모음이라고 말해도 과언이 아니다. 그래서 나는 객체지향 개발에 파고들기로 했다.

 

 

1. 기본편은 객체지향이 무엇이고, 객체지향의 요소는 무엇이 있는지, 객체지향적으로 잘 개발하기 위해서는 어떻게 해야 하는지, 객체지향적으로 잘 개발하면 어떤 효과가 있는지 썼다.

 

2. 패턴편을 통해 객체지향기법을 잘 응용하여 어떻게 좋은 패턴을 만들었는지 알수 있다. 이 디자인 패턴들을 이해한다면 객체지향의 이론을 넘어 실전에 어떻게 활용할수 있을지 더 좋은 감을 얻게 될것이다.

 

3. 현실편을 통해 객체지향을 열심히 공부했지만 현장에서 부딪혔던 문제에 대해 내 스스로 답을 구하기 위한 노력들을 썼다. 절차지향과 객체지향의 차이, 디자인패턴과 프레임워크의 애매한 차이는 내가 항상 궁금해 했던 문제이다. 마지막에는 왜 9년 개발 경험 끝에 얻은, 우리나라 IT에서는 객체지향 개발이 어려운가에 대한 해답과 궁색한 대안을 제시했다.

 

독자들은 이 3가지 과정,

'기본'편을 통해 객체지향의 탄생 배경 지식, 객체지향의 기본 요소, 객체지향을 잘 활용하는 방법을 이해하고

'패턴'편을 통해 객체지향 기법을 디자인 패턴을 통해 실용적으로 활용하는 법을 배우고

'현실'편을 통해 객체지향 기술의 이해하기 어려운 고민거리와, 어려운 프로젝트 현장에서도 객체지향 기법을 적용하는 대안을 같이 고민하여,

 

어떠한 상황에서라도 객체지향의 좋은 뜻과 기술을 잘 적용하여, 좋은 코드를 만드는 개발자가 되도록 기여하는게 목표이다.

 

이 책을 통해서든 다른 책을 통해서든 현장의 훌륭한 사수를 통해서든 객체지향 지식을 쌓았다면 계속 이런 길을 공부하도록 조언 하고 싶다.

 

 

리팩토링, 리팩토링은 기능은 그대로인 상태에서 코드 품질을 객체지향적으로 높여주는 기법들의 모음이다. 디자인 패턴은 위에서 내려다보는 큰 설계를 잡는 방법이라면 리팩토링은 눈에 보이는 코드의 문제점을 알고 있는 좋은 기법으로 개선하면 되기 때문에 오히려 디자인 패턴보다 배우기도 쉽고 활용하기도 쉽다.

 

디자인 패턴은 포크레인으로 제대로 집을 짓는 방법이라면 리팩토링은 삽으로 길을 정리하고 눈을 치우는 작은 개선 활동이다. 리팩토링을 알면 코드를 객체지향적으로 개선하는 방법을 알 수 있다.

 

 

테스트 주도 개발, 테스트 주도 개발은 어느 코드를 개발하기 전에 해당 코드를 테스트 하는 코드를 먼저 작성하는 방법이다. 단순해 보이는 기법이지만 테스트 주도 개발을 통해 얻는 효과가 여러가지 있다.

 

1. 기능(=메소드=인터페이스)에 집중하는 효과

2. Exception 처리에 집중하는 효과

3. 테스트 케이스 문서화의 효과

4. 기능은 그대로인 상태에서 내부 소스 개선(=리팩토링)시 '막 개발' 때는 절대 발견 못할 꼭꼭 숨은 버그도 잡아준다.

5. 하나하나 차근차근 구현 목표에 접근하기 때문에 마음이 들뜨지 않고 안정감이 생긴다.

 

개발자라면 예를 들어 해당 일의 요일을 구해야 하는 로직을 개발한다면 이 로직을 어떻게 개발할지 머리를 싸매기 시작한다. 테스트 주도 개발을 하면 이 로직을 어떻게 개발하느냐의 관점에서 벗어나 인터페이스를 보는 관점을 갖게 된다. 나무를 보는 것이 아니라 숲을 보는 능력이 생긴다.

 

Exception 처리도 중요하다. 로직 작성에 신경 쓰다보면 이런 예외처리에 관심을 갖지 못한다. 테스트 주도 개발은 이런 예외처리도 관심을 갖게 해준다. 더 완벽한 코드를 만들 수 있다.

 

테스트 케이스 자체가 훌륭한 테스트 케이스 문서가 된다.

 

리팩토링을 하다보면 '사이드 이펙트(Side Effect)' 라고 하는 원하지 않는 파급 효과가 생긴다. 잘돌아가는 로직이 내부 코드 개선하다가 잘 못 건들어 문제가 생긴다. 테스트 주도 개발을 통해 테스트 케이스를 작성했다면 이런 문제도 해결한다.

 

개발자 스스로 하나하나 차근차근 구현 목표에 접근하기 때문에 마음이 들뜨지 않고 안정감이 생기는 경험을 했다. 테스트 주도 개발은 개발계의 만능 건강 식품 우유와 같다. 객체지향을 어떻게 적용할지 모르는 개발자라면 꼭 한번 테스트 주도 개발 책을 읽고 실천해보기 바란다.

 

 

스프링 프레임워크, 세종대왕이 한글을 만들어 평민들도 문자를 쉽게 배워 써먹을수 있게한 업적이 생각날 만큼 훌륭한 프레임워크이다.

 

객체지향은 일반 초보 개발자들이 실천하기는 쉽지 않은 진입장벽이 있다. 스프링은 IoC 기법으로 일반 개발자들도 폴리모피즘을 통한 스트라테지 패턴 구현을 쉽게 하도록 길을 열어 주었다. (IoC 기법은 스트라테지 기법을 코드상이 아닌 XML설정으로 쉽게 구현하는 방법이다.)

 

스프링은 IoC로 출발하여 DAO(DB 접근 기술), MVC(웹 관련 기술), 트랜잭션 처리, 배치 처리 등의 다양한 개발 현장에서 쓰이는 기술들이 개발자에게 제공한다. 스프링을 안다는 것은 가장 고도화된 훌륭한 코드를 아는것이며, 스프링을 잘 쓴다는 것은 가장 적은 비용으로 가장 효과적인 개발을 할줄 안다는 것과 같다.

 

 

이런 좋은 기술들을 나열하다보니 한편으로 개발자는 행복하다. 리팩토링, 테스트 주도 개발, 스프링 프레임워크와 같은 훌륭한 프레임워크가 개발자가 더 좋은 개발자가 되도록, 개발자가 더 좋은 개발을 할수 있도록 지원해주기 때문이다. 납기 준수만 강요하는 갑이 있지만 한편으로는 우리에게는 이런 훌륭한 도구와 친구들이 있다.

 

나 같은 iOS 개발자라면, 리팩토링, 테스트 주도 개발, 코코아 프레임워크를 공부하면 좋다. 코코아 프레임워크도 애플의 오랜 경력이 축적된 당도가 깊게 농축한 사과처럼 훌륭한 프레임워크이다.

 

안드로이드 개발자라면, 리팩토링, 테스트 주도 개발, 안드로이드 내부 프레임워크를 공부하면 좋다. 안드로이드는 복잡 다단 조잡했던 모바일 개발 플랫폼을 일관성있고 강력한 프레임워크로 통일하기 위해 만들어졌다. 안드로이드 프레임워크도 훌륭한 프레임워크이다.

 

 

기타, 위의 3가지 좋은 기법을 적용하는데 도움이 되는 애자일 방법론 도입도 관심과 투자할 시간이 있으면 배우고 실천하길 추천한다.

 

애자일 방법론은

개발자가 편하게 순수 프로그래밍에만 집중할 수 있도록

 

테스트, 버전 관리, 소스 빌드, 문서, 일정 관리, 의사 소통,

업무 환경등의 외적/내적 요소를

 

최대한 신경쓰지 않아도 되게끔 자동화 또는 민첩한 개선

 

통해 도와주는 모든 관련 방법/기법들의 모음이다

리팩토링과 테스트 주도 개발이 애자일 방법론안에 주요 기법으로 포함되어 있기도 하다.

 

지속적인 통합이 활성화 된다면, 개발자는 순수 로직에만 집중하게 되고, 테스트, 버전관리, 소스 빌드, 문서, 일정관리, 의사소통의 방해요소는 최대한 제거되어 개발자들이 즐겁게 일할 수 있다. 

 

  • 참고 서적

생각의 탄생, 에코의 서재, 2007

헤드 퍼스트 디자인 패턴, 한빛미디어, 2005

헤드 퍼스트 객체지향 분석 디자인, 한빛미디어, 2007

자바 디자인패턴과 리팩토링, 한빛미디어, 2003

GoF 디자인패턴, Addison Wesley, 2007

리팩토링, 대성미디어, 2002

 

덧 ) 조만간 이 객체지향의 탄생 내용 주제로 뭔가 '프로모션'을 진행할 예정입니다. 그전에 이 글들을 종종 또는 꾸준히 읽으신 분이 있고 도움이 되셨으면 소감 한번 남겨주시면 감사합니다.~