김주엽
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
에서 제공하는 동적 프록시는 인터페이스만 지원한다.
클래스 프록시를 사용하려면 별도의 바이트 코드 처리 라이브러리가 필요하다. - 코드 양이 많고 크기가 무거운 단점이 존재하기에 깨끗한 코드를 작성하기 어렵다.
-
순수 자바 AOP 프레임워크
- 자바 관점을 구현하는
스프링 AOP
,JBosss AOP
등 여러 프레임워크가 내부적으로 프록시를 사용한다. - POJO를 이용해서 구현한 프레임워크는 다른 도메인에 의존하지 않아 테스트가 개념적으로 더 쉽고 간단하다.
- 프로그래머는 설정 파일이나 API를 사용해 애플리케이션 기반 구조를 구현하고 AOP 프레임워크나 라이브러리를 사용해 관점을 명시한다.
- 프레임워크는 사용자가 모르게 프록시나 바이트코드 라이브러리를 사용해 이를 구현한다.
- 자바 관점을 구현하는
-
AspectJ 관점
- 관심사를 관점으로 분리하는 가장 강력한 도구는
AspectJ
언어다. 스프링 AOP
,JBoss AOP
가 제공하는POJO
방식은 관점이 필요한 상황 중 80~90% 에 충분하다.AspectJ
는 관점을 분리하고 강력한 풍부한 도구 집합을 제공하지만 새 도구 사용, 새 언어 문법과 사용법을 익혀야 하는 단점이 존재한다.
- 관심사를 관점으로 분리하는 가장 강력한 도구는
- 의사 결정을 최적화하라
- 모듈을 나누고 관심사를 분리하면 각 부분을 독립적으로 테스트하고 관리하기 쉬워진다.
- 관심사를 모듈로 분리한
POJO
시스템은 기민함을 제공해 최선의 시점에 최적의 결정을 내리기 쉬워지고 결정의 복잡성도 줄어든다.
- 시스템은 도메인 특화 언어가 필요하다
DSL(Domain-Specific Language)
가 최근 들어 새롭게 조명받기 시작했다.DSL
은 간단한 스크립트 언어나 표준 언어로 구현한 API를 말한다.- 좋은
DSL
은 도메인 개념과 그 개념을 구현한 코드 사이에 존재하는 의사소통 간극을 줄여준다. DSL
로 도메인 논리를 구현하면 도메인을 잘못 구현할 가능성이 줄어든다.
2. 🤔 이해가 어려운 부분
🔍 질문하기
- 순수 자바 AOP 프레임워크
- 어려웠던 부분
"Bank 도메인 객체는 자료 접근자 객체 DAO로 프록시되었으며 자료 접근자 객체는 JDBC 드라이버 자료 소스로 프록시되었다." 이 문장을 이해하기 어려웠다. - 이해한 점
Bank
객체는DAO
객체를 통해서만 데이터에 접근한다.
→Bank
객체가DAO
객체로 프록시됐다.DAO
객체는JDBC 드라이버
를 통해서만 DB에 접근한다.
→DAO
객체는JDBC 드라이버
가 프록시 역할을 수행해 DB에 접근한다.
- 어려웠던 부분
3. 📚 참고 사항
📢 논의하기
관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.
- 논의하고 싶은 주제
- 주제
AOP
를 적용할 수 있는 관심사는 어떤 것들이 있을까? - 설명
AOP
가 주로 로깅에 많이 활용된다고 알고 있는데 이외에도 어떤 관심사에 적용할 수 있을지 함께 논의하고 싶다.
- 주제