🔖 오늘 읽은 범위 : 11장, 시스템
“복잡성은 죽음이다. 개발자에게서 생기를 앗아가며, 제품을 계획하고 제작하고 테스트하기 어렵게 만든다.”
- 레이 오지(Ray Ozzie), 마이크로소프트 최고 기술 책임자(CTO)*
여기서 말하는 시스템 수준이란 ‘전체적인 구조/아키텍처’를 의미하는 것 같다. 처음에는 시스템이 어떤 의미인지 감이 잘 안왔는데, 후에 “깨끗한 코드는 코드 수준에서 시스템을 조장하고 확장하기 쉽게 만든다. (p.199)” 라는 말에서 그와 반대되는 개념이라는 생각이 들었다.
public service getService() {
if (service = null)
service = new MyServiceimpl(...); // 모든 상황에 적합한 기본값일까?
return service;
}
영속성과 같은 관심사는 애플리케이션의 자연스러운 객체 경계를 넘나드는 경향이 있다. 모든 객체가 전반적으로 동일한 방식을 이용하게 만들어야 한다.
원론적으로는 모듈화되고 캡슐화된 방식으로 영속성 방식을 구상할 수 있다. 하지만 현실적으로는 영속성 방식을 구현한 코드가 온갖 객체로 흩어진다. 여기서 횡단 관심사라는 용어가 나온다.
한마디로, 횡단 관심사란 애플리케이션의 객체 경계를 넘나드는, 모든 객체가 전반적으로 동일한 방식을 이용해야하는 공통의 관심사를 의미한다.
AOP에서 관점(aspect)이라는 모듈 구성 개념은 “특정 관심사를 지원하려면 시스템에서 특정 지점들이 동작하는 방식을 일관성 있게 바꿔야 한다”라고 명시한다.
class Example {
private static class FieldHolder {
static final FieldType field = computeFieldValue();
}
private static FieldType getField() {
return FieldHolder.field;
}
}
getField
가 처음 호출되는 순간 FieldHolder.field
가 처음 읽히면서, 비로소 FieldHolder 클래스 초기화를 촉발한다.class Example {
private volatile FieldType field;
private FieldType getField() {
FieldType result = field; // 초기화 시 한 번만 읽도록 하기 위함
if (result != null) {
return result;
}
synchronized (this) {
if (field == null) { // 두 번째 검사 (락 사용)
field = computeFieldValue();
}
return field;
}
}
}
class Example {
// final 한정자를 통한 인스턴스 필드 생성
private final FieldType field = computeFieldValue();
}
스프링에선 IoC라는 용어만 가지고는 개념이 너무 추상적이라 그 핵심을 짚는 용어가 필요했는데, 이때 몇몇 사람들의 제안으로 만든 용어가 바로 DI인 것이다.