김주엽
1. 📌 핵심 개념 정리
✅ 요약하기
- 시스템 제작과 시스템 사용을 분리하라
-
모든 애플리케이션에서 풀어야 할 관심사는 초기화 단계이다.
-
대다수의 애플리케이션이 초기화 과정 코드를 주먹구구식으로 구현하고 런타임 로직과 마구 뒤섞는다.
-
예시
public Service getService(){ if (service == null) service = new MyServiceImpl(...); // 모든 상황에 적합한 기본값일까? return service; }
- 위의 기법은
Lazy Initializaion
또는Lazy Evaluation
이라는 기법이다.- 장점
- 객체가 필요한 경우에 객체를 생성하기에 불필요한 부하가 걸리지 않는다.
- 또한 어떤 경우에도
null
을 반환하지 않는다.
- 문제점
- 메서드가
MyServiceImpl
및 생성자 인수에 의존한다. - 객체를 생성하는 로직과 동작하는 로직이 함께 있어
SRP 원칙
에 위배된다. MyServiceImpl
이 어떤 객체인지 알 수 없다.
- 메서드가
- 장점
- 위의 기법은
-
Main 분리
main
함수에서 시스템에 필요한 객체를 생성한 후 애플리케이션으로 전달한다,- 이 과정에서 애플리케이션은
main
에서 객체가 생성되는 과정을 알 수 없다.
-
팩토리
- 객체가 생성되는 시점을 애플리케이션이 결정하는 경우에는 추상 팩토리 패턴을 사용하라.
- 이 경우에도 애플리케이션에서는 객체가 생성되는 과정을 알 수 없다.
-
의존성 주입(DI, Dependency Injection)
- 객체 생성 및 관리에 대한 책임을
DI 컨테이너
가 가지며 필요한 객체를 직접 생성하거나 외부에서 주입받는 방식을 말한다. - 의존성 주입은 제어의 역전(IoC, Inversion of Control) 기법을 의존성 관리에 적용한 메커니즘이다.
- 제어의 역전에서는 한 객체가 맡은 보조 책임을 새로운 객체에게 전적으로 넘긴다.
- 새로운 객체는 넘겨받은 책임만 동작하기에
SRP 원칙
을 지키게 된다.
- 대다수의 DI 컨테이너는 객체가 필요한 순간에 생성할 수 있도록
Lazy Initializaion
기법을 이용해 팩토리를 호출하거나 프록시를 생성하는 방법을 제공한다.
- 객체 생성 및 관리에 대한 책임을
-
- 확장
- 처음부터 올바르게 시스템을 만들 수 있다는 믿음은 미신이다.
TDD
와리팩터링
으로 얻어지는 깨끗한 코드는 코드 수준에서 시스템을 조정하고 학장하기 쉽게 만든다.
- 횡단(cross-cutting) 관심사
- 하나의 기능 혹은 모듈을 관심사라고 말한다.
- 현실적으로 영속성 방식을 구현한 코드는 온갖 객체로 흩어진다.
- 이를 처리하기 위해 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)이 나오게 됐다.
AOP
에서 **관점(aspect)**이라는 모듈 구성 개념은 여러 곳에서 반복되는 기능(로그, 보안 검사 등)을 한 곳에 모아 일관되게 적용한다.AOP
에서 명시는 특별한 문법을 사용하여 간단하게 기능을 적용할 수 있어야 한다.
- 자바 프록시
- 자바 프록시는 개별 객체나 클래스에서 메서드 호출을 감싸는 경우 등 단순한 상황에 적합하다.
- 하지만
JDK
에서 제공하는 동적 프록시는 인터페이스만 지원한다.
2. 🤔 이해가 어려운 부분
🔍 질문하기
책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.
- 개념 또는 원칙의 이름
- 어려웠던 부분
해당 개념이 헷갈리거나 명확하지 않았던 점을 구체적으로 설명합니다. - 궁금한 점
해당 개념이 어떤 원리로 동작하는지, 실무에서 어떻게 활용되는지 등을 질문 형태로 정리합니다.
- 어려웠던 부분
- 개념 또는 원칙의 이름
- 어려웠던 부분
. - 궁금한 점
.
- 어려웠던 부분
- 개념 또는 원칙의 이름
- 어려웠던 부분
. - 궁금한 점
.
- 어려웠던 부분
3. 📚 참고 사항
📢 논의하기
관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.
- 관련 자료 공유
- 추가 자료
관련 블로그 글이나 공식 문서 링크를 제공합니다.
- 추가 자료
- 논의하고 싶은 주제
- 주제
논의하고 싶은 내용을 간략히 정리합니다. - 설명
논의하고 싶은 이유를 작성합니다.
- 주제