'MartinFowler'에 해당되는 글 46건

  1. 2007/12/21 롤러스케이트 구현
  2. 2007/12/07 테스트 암 Test Cancer
  3. 2007/10/05 지속적인 통합(Continuous Integration) (2)
  4. 2007/10/04 리팩터링 정의
  5. 2007/10/04 선언된 순서를 변경하는 것은 리팩터링인가?
  6. 2007/10/04 발견하지 못한 버그를 수정하는 것은 리팩터링인가?
  7. 2007/10/02 성능 최적화가 리팩터링인가?
  8. 2007/09/04 인터페이스 변경이 리팩터링인가? (2)
  9. 2007/03/30 DB 트랜젝션을 사용하지 않는 구현(Transactionless) (5)
  10. 2006/12/21 JRake (1)
  11. 2006/12/17 소프트웨어 개발자와 큰 화면 (8)
  12. 2006/12/05 POJO(Plain Old Java Object)의 기원
  13. 2006/12/02 Language Workbenches가 DSL의 Killer-app 인가? (원문 일부 번역) (4)
  14. 2006/12/02 Language Workbench의 현황 (2)
  15. 2006/10/20 언어 지향 프로그래밍(language oriented programming)의 장단점 (5)
  16. 2006/10/15 개발자의 여지를 허용하는 태도(EnablingAttitude) (6)
  17. 2006/10/15 지시에 따르는 태도(directing attitude)
  18. 2006/10/14 메소드 봉인(Seal) (2)
  19. 2006/10/14 슈하리(シュハリ) (2)
  20. 2006/10/12 클로저 (Closure) (2)
  21. 2006/10/12 IoC 콘테이너와 디펜던시 인젝션 패턴
  22. 2006/09/25 언어지향 프로그래밍의 전통
  23. 2006/09/21 주목할만한 상태(Observable State)
  24. 2006/09/20 언어 지향적 프로그래밍의 간단한 예 (2)
  25. 2006/09/17 초기화 지연 기법(Lazy Initialization)
  26. 2006/09/16 Test Invariant
  27. 2006/09/16 Published Interface
  28. 2006/09/16 테스트 전용 객체(Test Double)
  29. 2006/09/16 암묵적 인터페이스 구현(Implicit Interface Implementation)
  30. 2006/09/16 인터페이스와 구현 쌍(Interface Implementation Pair)

롤러스케이트 구현
이올린에 북마크하기(0) 이올린에 추천하기(0)

테스트 암 Test Cancer

이올린에 북마크하기(0) 이올린에 추천하기(0)

Continuous Integration
이올린에 북마크하기(0) 이올린에 추천하기(0)

리팩터링 정의
이올린에 북마크하기(0) 이올린에 추천하기(0)

선언된 순서를 변경하는 것은 리팩터링인가?
이올린에 북마크하기(0) 이올린에 추천하기(0)

발견하지 못한 버그를 수정하는 것은 리팩터링인가?
이올린에 북마크하기(0) 이올린에 추천하기(0)

성능 최적화가 리팩터링인가?
이올린에 북마크하기(0) 이올린에 추천하기(0)

A RefactoringBoundary.

코드 일부에 대해 인터페이스 변경이 가해지면 리팩터링으로 볼 수 있나요?

대답은 간단하다. 인터페이스 변경은 인터페이스를 호출하는 모든 코드에 변경이 요구되는 유형의 리팩터링의 일종이다. 이러한 리팩터링으로 대표적인 사례는 메소드 이름 변경(Rename Method)이다. 이름 변경은 거의 모든 리팩터링 도구에서 지원한다.

이러한 유형의 리팩터링에서는 반드시 호출하는 부분 빠짐없이 변경되어야 한다. 인터페이스 선언만 변경되고 호출하는 부분에서는 인터페이스 이름을 변경되지 않으면 시스템은 깨지고 결과적으로 행위가 변하고 만다.(역자주: 리팩터링은 시스템의 행위는 보존해야 한다.)

인터페이스 변경 리팩터링은 호출하는 모든 코드에 적용되는 것은 전제로 한다. 이는 Published Interface에 대해서는 더 노력을 기울여야 하는 이유이기도 하다. 인터페이스가 외부에 공개된 상황이라면, 인터페이스 자체가 시스템 행위의 일부로 인식되기 때문이다.

동적인 언어에 대해 이러한 변경을 다루는 것은 더욱 어렵다. 정적 타입 정의를 활용하면 다양한 지점에서 호출되는 인터페이스에 대해 명확하게 규명할 수 있다. 리플렉션(Reflection)을 사용하여 메소드 호출을 하는 경우라면, 메소드 이름이 문자열에 포함되어 있거나, 실행시점에서 구성되기 때문에 리팩터링 도구가 있다고 해도 인터페이스 변경 리팩터링이 쉽지 않다. 그래서 이러한 영역은 필수적으로 테스트가 요구되는 영역이다.  

출처: IsChangingInterfacesRefactoring

이올린에 북마크하기(0) 이올린에 추천하기(0)

몇년전 나는 eBay에서 일하고 있는 친구들과 이야기를 나눈 일이 있다. 수많은 사용자가 이용하는 사이트에서 사용하는 기법을 듣는 것은 항상 흥미롭다. 그러나, 그중에서도 가장 흥미로왔던 것은 eBay는 거의 데이터베이스 트랜젝션(transactions)을 사용하지 않는다는 사실이다.

대부분은 사람들에게 트랜젝션이 없는 환경은 무척 놀라운 일이다. 데이터베이스를 사용한다면 트랜젝션을 쓰는 것은 너무나도 보편적인 일이다. 나를 포함한 많은 사람들은 트랜젝션을 데이터베이스가 주는 핵심적인 이점으로 여긴다.

eBay의 대규모 사용자 환경에서 성능 저하를 야기한다는 점이 트랜젝션을 쓰지 않는 이유다. eBay는 데이터를 다수의 데이터베이스에 물리적으로 나누어 놓았기 때문에 트랜젝션이 가져오는 성능 저하는 더 심각해진다. 결과적으로 트랜젝션을 사용한다는 것은 분산 트랜젝션을 의미하기 때문이다.  

고도의 파티셔닝(partitioning)과 성능 이슈에 있어서 데이터베이스가 차지하는 지배적인 비중으로 인해 eBay는 다른 많은 데이터베이스 기능들도 사용하지 않는다. 참조 무결성(Referential integrity) 보장이나 정렬은 애플리케이션 코드에서 수행한다. 트리거(triggers)나 저장 프로시저(stored procedures)를 쓰는 일은 거의 없다.

트랜젝션이 없는 환경에 대한 이야기를 처음 들었을 때, 나는 애플리케이션 개발자에게 미치는 결과 특히 트랜젝션이 없다는 것에 대해 전반적으로 어떻게 느끼는가를 물어보았다. 대답하기를 처음에는 어색했지만, 생각보다 별 문제 없이 마칠 수 있었다고 한다. 데이터베이스에 커밋(commit)하는 순서에 유의해야 하고, 중요한 것을 먼저 커밋해야 할 뿐이다. 각각의 커밋시점에서 성공 여부를 확인하고, 실패했을 때는 어떻게 할 것인지를 결정해야 한다.

이러한 프로그래밍 스타일은 내 호기심을 자극했지만 이에 대해 거론하는 것을 조심해왔다. Dan Pritchett가 이번주에 QCon에서 eBay의 아키텍처에 대해 흥미로운 발표에서 관련 내용이 언급되었기 때문에 이제는 공개적으로 논할 수 있게 되었다. 발표 내