Refactoring to Patterns - 패턴을 활용한 리팩터링

컴퓨터가 이해하는 코드는 어느 바보나 다 짤 수 있다. 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 짠다.[F,15]

자바개발자로서 생활을 하다가 보면, 신규 솔루션이나 새로운 도메인 영역을 개발을 해야 할때도 있지만, refactring역시 중요한 업무중의 하나이다.

국내 현실에 있는 대부분의 코드들은 OOP의 개념을 잡고 만든 코드들을 만나보기 힘들고, 양질의 코드보다는 단순 스크립트 코드들이 즐비한 상태이고, 중복 코드가 곳곳에 존재를 하며, 레이어간 분리가 잘 안된 경우도 허다하다.

이 코드들을 분석을 해서 refactoring을 하는 작업은 힘들고, 고통스러운 경우가 많다.
refactoring의 고통은 해본 사람들은 코드를 아예 재작성이 낫다고 얘기할 만큼 쉬운 것이 아니다.

refactoring을 하는 이유

  • 새로운 코드를 더 쉽게 추가할 수 있도록 하기 위해
  • 기존 코드의 설계를 개선하기 위해
  • 기존 코드를 더 잘 이해하기 위해
  • 덜 짜증나는 코드로 만들기 위해

refactoring을 하다가 보면, 더 자세히 코드를 보게 되고, refactoring을 통해서 나온 코드들은 자신이 읽기에 편하다. 그래서, 나는 기존 코드를 더 잘 이해하기 위해 refactoring을 선택을 자주 한다. 모르는 상태에서 버그를 일으키는 시스템보다는 좀더 공격적으로 코드개선을 통해서 risk를 관리해 나가는 것이 일정한 시점에 이르면 더 강건한 시스템을 만들 수 있기 때문이다.

리팩토링의 진정한 가치는 아래와 같은 그림, 링크에서 처럼 어느 순간에 급격하게 증가한다.
http://www.ologist.co.kr/376



refactoring하는 기준과 목적은 무엇일까? GOF의 디자인 패턴은 어떤 목적으로 쓰여진 얘기일까? marting fowler가 쓴 refactoring은 어떤 모습을 지향하는 것일까?

많은 사람들이 기존에 코드를 유지보수가 편하게 하기 위해서 refactoring을 하다가 보면, 자신도 모르는 사이에 어떤 패턴(GOF Patterns)의 모습으로 코드를 만들어 가고 있다는 것을 깨닫게 된다.

이 책을 보면, 그들 간의 유기적인 관계(디자인 패턴과 리팩터링의 상호관계)를 알수가 있게 된다.

패턴과 리팩터링 사이에는 자연스런 관계가 있다. 패턴을 도달하고 싶은 곳이고, 리팩토링은 그곳으로 가는 방법이다.[F,107]

막연했던 카탈로그들을 그 책을 본 동등한 필자(Joshua Kerievsky)가 그가 경험하고, 실전에 써먹었던 코드들을 바탕으로 책을 써내려간다. TDD 및 XP,애자일 사상이 곳곳에 보이는 이 책은 refactoring을 하고자 하는 이에게 나침반 같은 존재가 될것 이다.

refactoring의 방향성을 찾고 싶다면.
1. GOF 디자인 패턴
2. Refactorign - martin folwer
를 반드시 봐야 한다.

그리고, 이 책으로 좀더 실전적인 감을 익히고, 시작하면 더 양질의 코드를 만들수 있지 않을까 기대가 된다.

이 책의 목적

  • 리팩토링과 패턴을 어떻게 결합하는지 이해
  • 패턴을 고려한 리팩터링으로 기존 코드의 설계를 개선
  • 코드에서 패턴을 고려한 리팩터링이 필요한 영역을 식별
  • 새로운 설계의 초기부터 패턴을 사용하는 것보다 기존 코드를 개선하기 위해 패턴을 사용하는 것이 좋은 이유를 이해

Joshua Kerievsky
- XP전문기업 Industrial Logic(http://industriallogic.com)
- 전문 소프트웨어 개발자, 코치, 강사

패턴을 활용한 리팩터링

Joshua Kerievsky / Insight (인사이트)

POJOs in Action을 보다가 보면 3가지 개발방식이 나온다.
주로 저자(Chris Richardson)가 애용하는 방식은 1,3번이다.

1. Domain Model Pattern(fowler) : state와 behavior를 가지는 rich domain model을 지향한다.
cf) Domain Driven Design - Eric Evan

2. Table Module Pattern(fowler) : Transaction Script Pattern보다는 좀더 구조적인 프로그래밍이긴 하지만, value기반의 프로그래밍을 하게 만든다.

3. Transaction Script Pattern(fowler) : state와 behavior를 분리해서 개발을 하게 한다.

4. Non-Transaction Map Based Script Pattern(ologist,2006) : 인터페이스도 없고, 도메인 모델도 없는 단순한 function기반의 스크립트 프로그래밍 모델이다.

4번은 내가 한번 용어를 만들어 봤다...ㅎㅎㅎ

자바를 이용해서 개발을 할수 있는 프로그래밍 모델인데, 자바를 사용한다고 해서 모든 소스가 OOP가 아니다.

4가지 프로그래밍 모델중 가장 OOP적인 순서대로 적었다. 개발을 할때 Domain Expert와 업무분석을 할때 어떤 프로그래밍 모델이 좋을지 판단을 잘해야 한다. 판단미스로 여러 사람 고생을 시키지 말자.

개인적으로는 1번을 지향하고 있다. 1번을 좋아하는 이유 중에 하나는 유지보수가 쉽고, 코드를 읽기가 편하기 때문이다. 둘째는 국내에서 진행하는 프로젝트는 대부분 OOP적이지 않는 스크립트 패턴으로는 복잡성을 풀어내기가 용이 하지 않기 때문이다.

자바를 사용하면서 C와 같은 procedural언어보다 OOP의 장점인 견고하고, 유지보수가 쉽고, 코드 리딩이 용이한  이점을 얻지 못하고 있다면, 여러분들은 자바로 procedural한 방식으로 개발을 하고 있었다는 얘기다.

대부분 사람들은 자바를 하면 OOP를 하는 것으로 착각을 한다. OOP를 해도 과거의 단점을 극복할 수 없다는 얘기마져 나온다. 제대로 OOP를 하고 단점을 얘기하자. 원칙과 개념을 정확히 모른다고 할때, 개발방식에서 데이터의 흐름을 최소화 하고, 위임하는 방식을 추구하면 당연히 유지보수가 편해질수 밖에 없는 것이다,

추상화,캡슐화,다형성을 비롯한 객체지향 원칙을 잘 지키면, OOP에서 얘기하는 장점을 충분히 느낄수 있을 것이다. 하지만, 그것들을 잘 지키는 것이 쉽지만은 않은게 사실이다...^^;

FLIP-FLOP Pattern

2006/07/26 20:49
모듈이 두 인터페이스 가운데 하나를 구현하고 다른 인터페이스와 통신하기 때문에 모듈을 둘러싼 환경을 우리 마음대로 바꿀 수가 있다. 진정한 추상화는 OCP를 지키기 위한 열쇠이다.
ologist :
저는 최근들어서 패턴의 중요성을 더 느끼고 있습니다. 과거에는 패턴을 공부하고 프로젝트에 적용하려 애를 썼었습니다. 지금 거의 패턴을 잊어버렸다고 생각을 하고, 일단 프로젝트를 어느정도 구현을 하고, 중복코드를 없애는 작업을 했습니다. 그 다음 패턴책을 읽어보니 그 안에 중복코드를 없애려고 할때 생각했던 고민들이 있었습니다. 패턴을 위한 패턴이 아니라 중복코드를 줄이고, 유지보수 비용을 줄이기 위한 경험이라고 생각을 하면 반드시 필요하다고 얘기할수 있습니다

안영회님 :
넵.. 동감입니다. 그러나, 그러한 접근은 리팩토링에 가깝죠.
리팩토링을 하다 보면 패턴에 가까워진다는 설명이 자연스러울 수 있을 것 같습니다. 자주 코드를 개선하는 과정에서 결과를 만들어내는 것이 자연스러우니까요.
물론, 충분히 훈련된 분들에게는 바로 직관을 주는 패턴이 더 유용할 수 있겠죠.

디자인 패턴, 나에게도 유용한가?
http://blog.empas.com/ahnyounghoe/14674430

위에 있는 글은 안영회님의 글에서 내가 덧글을 단 내용과 그 답변을 가져왔다. 내 블로그에도 글을 남길만한 가치가 있는 듯해서 내용을 가지고 와서 아래와 같이 추가를해서 글을 적어본다. 조만간 안영회님의 블로그가 이사를 하면 덧글이 사라질 가능성이 많을 듯해서..^^;

나의 못다한 얘기 :
리팩토링에 가까운 접근이지만, 리팩토링이 필요한 소스를 만들어 내지 않는 것도 좋은 품질의 소스라고 생각을 합니다. 개발과 유지보수 중에 리팩토링이 반드시 필요하기는 하지만, 어느정도 수준에 올라섰다면 일부러 리팩토링되는 소스를 만들 필요는 없을 듯 합니다. 정형화되고 자주 리팩토링 되는 소스구조라면 디자인 패턴이 적용이 되어야 합니다.

숙련된 개발자들에게는 패턴은 정말 좋은 친구죠. 리팩토링의 리스크를 사전에 최소화 할수 있을테니까요.

PS.
1. 숙련된 개발자라는 표현에서 애매한 부분이 있지만, 초보 or 범상한 개발자들이 훌륭한 개발자들이나 숙련된 개발자들에 가깝게 가기 위한 자기계발을 충분히 해야 한다는 일반적인 가정을 하고 이야기를 적었습니다...^^

2. 안영회님 말씀처럼 시간이 갈수록 기초의 부족이 느껴지는 왜일까요? 2006년은 다시 기초부터 공부하는 해로 정했습니다. 오래만에 회사 사내강의로 자바 fundamental & sevlet,jsp 강의를 들었는데, 재밌더군요...ㅎㅎㅎ

다음과 같은 글이 있어서 추가로 적습니다. 위에 적은 글과 비슷한 내용의 article이 이미 있네요...^^;
Pre-Factoring
http://blog.naver.com/django44/40026544455
http://www.oreillynet.com/pub/a/network/2005/11/15/what-is-prefactoring.html

변화


Head First Design Patterns - 에릭프리먼(한빛미디어)
주요 이슈
1. CBD
2. MDA
3. J2EE Core Pattern
4. Spring의 컨셉
5. WEBWORK의 컨셉
6. Framework들이 가져다는 주는 장단점?
7. loosely coupled(layer간에 decoupled에 대한 이야기)
8. TO(VO) vs Map
9. OOP? 과연 현실을 표현이 가능한가...상속, 다형성, 위임에 대한 이야기
10. 비즈니스 로직 및 알고리즘에 대한 집중방법

서비스 클래스를 생성하는 방법(dependency)

  • 다수의 팩토리 클래스
    XXXService xxx = XXXServiceFactory.getXXXService();
    YYYService yyy = YYYServiceFactory.getYYYService();
    ZZZService zzz = ZZZServiceFactory.getXXXService();
    xxx.doXXX();
    yyy.doYYY();
    zzz.doZZZ();
  • ServiceLocator 클래스
    XXXService xxx = ServiceLocator.getXXXService();
    YYYService yyy = ServiceLocator.getYYYService();
    ZZZService zzz = ServiceLocator.getXXXService();
    xxx.doXXX();
    yyy.doYYY();
    zzz.doZZZ();
  • Ioc 컨테이너
    interface , setter method, constructor

CORE J2EE PATTERNS

2006/05/02 09:33
CORE J2EE PATTERNS
http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html

수료를 못하면 비용을 지불해야 해서 부담스럽게 한달간 수강을 했지만, 다행히 마무리를 잘해서 생각보다 좋은 점수로 수료를 했다....ㅎㅎㅎ

이제 1년간 무료로 다시 듣기를 볼수가 있는데, 다시한번 정리를 하면서 들어봐야겠다.
큰 도움이 될까했지만, 들으면서 흩어져있던 지식들이 정렬이 되는 느낌을 받았다.

앞으로도 사이버(e-campus)를 자주 들어야 겠다.

Command 패턴

2006/04/28 09:40


장점

-        디자인 로직이 간단해진다

-        확장성이 좋아진다

-        Undo를 쉽게 구현할 수 있다.

-        Command 수행을 다른 thread 또는 다른 machine에서 수행할 수 있습니다.

-        EJB와 이를 사용하는 클라이언트를 분리합니다.

-        Deploy가 더 쉽게 만들어 줍니다. EJB인터페이스는 변경시키지 않고, command만 변경할수 있습니다.

-        한번의 서버 호출로 실행됩니다.(session facade역학 수행)

단점

-        객체를 사용하고, 폐기하는데 오버헤드가 있습니다.

-        EJB가 아니고, POJO이기 때문에 EJB컨테이너에서 제공하는 보안기능을 사용할 수가 없습니다.선언적 보안정의가 불가능합니다.

-        마찬가지로 command는 다양한 에러처리 로직을 갖지 못합니다. 따라서 에러처리 로직이 복잡해 집니다. 클라이언트에서는 직접 command객체의 에러를 발견해야 합니다.

-        대형 프로젝트의 경우 command 개수가 많아서 관리가 어렵습니다. 또는 request들이 한정적으로 정해진 경우에는 필요없습니다.

-        Command Receiver는 구조상 EJB들과 강하게 커플됩니다.


BLOG main image
OOP and Java by ologist

공지사항

카테고리

All (649)
private!! (106)
WEB & IT (140)
Developer (400)