시스템
복잡성은 죽음이다. 개발자에게서 생기를 앗아가며, 제품을 계획하고 제작하고 테스트하기 어렵게 만든다 - Ray Ozzie, Microsoft CTO
도시를 세운다면?
- 도시를 세운다면 혼자서 모든 사항을 직접관리할 수 있을까?
- 그것은 분가능하다, 전체적인 그림을 그리는 사람도 있지만 작은 사항에 집중하는 사람들도 존재해야한다
- 소프트웨어 팀도 이와 유사하다
- 깨끗한 코드를 구현하면 낮은 추상화 수준에서 관심사를 분리하기 쉬어짐
- 이번 장에서는 높은 추상화 수준, 직 시스템 수준에서 깨끗함을 유지하는 방법을 살펴봄
시스템 제작과 시스템 사용을 분리하라
- 제작(construction)은 사용(use)과 아주 다름
소프트웨어 시스템은 (애플리케이션 객체를 제작하고 의존성을 서로 연결하는) 준비 과정과 (준비 과정 이후에 이어지는) 런타임 로직을 분리해야함
- 시작 단계는 모든 애플리케이션이 풀어야 할 관심사(concern)임
- 관심사 분리는 우리 분야에서 가장 오래되고 중요한 설계 기법중 하나임
-
불행히도 대다수 애플리케이션은 시작단계라는 관심사를 분리하지 않음
- 체계적으고 탄탄한 시스템을 만들고 싶다면 흔히 쓰는 좀스럽고 손쉬운 기법으로 모듈성을 깨서는 절대 안 됨
Main 분리
팩토리
의존성 주입
확장
- 처음부터 올바르게 시스템을 만들 수 있다는 믿음은 미신
- 우리는 오늘 주어진 사용자 스토리에 맞춰 시스템을 구현해야함
- 내일은 새로운 스토리에 맞춰 시스템을 조정하고 확장해야함
- 이것이 반복적이고 점진적인 애자일 방식의 핵심
- 테스트 주도 개발, 리팩터링, 클린코드는 코드 수준에서 시스템을 조정하고 확장하기 쉽게 만듬
- 시스템 수준에서는 관심사 분리를 통해 ..
횡단 관심사
- EJB2 아키텍처는 일부 영역에서 관심사를 거의 완벽하게 분리
- 예를 들어 트랜잭션, 보안, 일부 영속적인 동작은 소스 코드가 아니라 배치 기술자에 정의
자바 프록시
- 자바 프록시는 단순한 상황에 적합
- 개별 객체나 클래스에서 메서드 호출을 감싸는 것이 좋은 예
순수 자바 AOP 프레임워크
- 순수 자바 관점을 구현하는 스프링 AOP, JBoss AOP등과 같은 여러 자바 프레임워크는 내부적으로 프록시를 사용
- POJO는 순수하게 도메인에 초점을 맞춤
AspectJ 관점
- 마지막으로 관심사를 분리하는 가장 강력한 도구는 AspectJ 언어
- AspectJ는 언어 차원에서 관점을 모듈화 구성으로 지원하는 자바 언어의 확장
- AspectJ에 대한 문법과 사용법을 익혀야하는 단점이 있지만 최근에는 애너테이션으로 적용가능
테스트 주도 시스템 아키텍처 구축
- 관점으로 관심사를 분리하는 방식은 그 위력이 막강함
- 비즈니스 로직을 POJO로 작성할 수 있다면, 진정한 테스트 주도 아키텍처 구축이 가능해짐
의사 결정을 최적화하라
- 한사람이 모든 의사결정을 하는것이 아닌 가장 적합한 사람에게 책임을 맡기는게 좋음
- 때로는 가장 마지막 순간까지 결정을 미루는 방법이 최선이라는 사실을 까먹곤 함
- 게으르거나 무책임해서가 아니라 최선의 결정을 내리기 위해서임
명백한 가치가 있을 때 표준을 현명하게 사용하라
- 표준을 사용하면 아이디어와 컴포넌트를 재사용하기 쉬움
- 적절한 경험을 가진 사람을 구하기 쉬움
- 좋은 아이디어를 캡슐화하기 쉬움
- 컴포넌트를 엮기 쉬움
- 그러나 표준을 만드는데 너무 오래 걸려 기다리지 못하거나 원래 표준을 제정한 목적을 잊어버리기도 함
시스템은 도메인 특화 언어가 필요하다
- DSL
- 좋은 DSL은 도메인 개념과 그 개념을 구현한 코드 사이에 존재하는 의사소통간격을 줄여줌
결론
- 시스템이 깨끗하지 못하면 도메인 논리를 흐리며 제품 품질을 떨어트림
- 이는 생산성을 떨어트리고 TDD의 장점을 사라지게함
- 시스템 설계이든 모듈 설계이든 실제로 돌아가는 가장 단순한 수단을 사용해야함