OOP를 더 OOP스럽게 만들어 주는 기술
공통 로직
과의 의존성 x단위테스트
용이핵심 로직
에 집중 -> 코드관리, 가독성 용이XXXService{
login() {
1. 로그를 남김
2. login 처리 로직
}
register() {
1. 로그를 남김
2. register 처리 로직
}
XXX() {
login, register 로그를 복붙 (코드 중복 -> 유지보수 어려움)
}
}
XXXService{
login() {
1. log();
2. login 처리 로직
}
register() {
1. log();
2. register 처리 로직
}
log(){
로그를 남김
}
}
YYYService{
write(){
XXXService.log(); // 의존성 생김(결합도 ↑)
}
}
XXXService{
login() {
1. LogService.log();
2. login 처리 로직
}
register() {
1. LogService.log();
2. register 처리 로직
}
}
YYYService{
write(){
LogService.log();
}
}
LogService{
log(){
로그를 남김
}
}
log()
메소드 호출 코드까지 관심사로 봄 => 호출코드까지 분리해야 완벽한 관심사의 분리
핵심 로직 (Core Concern)
: 우리가 직접 구현하는 주요 로직들, 공통 로직을 활용(사용) 대상
횡단(공통) 로직 (Cross-Cutting Concern)
: 여러 핵심 로직에서 재사용되는 공통(공용) 로직
Advice
: 공통 로직
Class
Target
: 핵심 로직
Class, Advice
가 적용될 대상
Weaving
: Advice
를 Target
에 적용, 처리해주는 작업
Weaving
의 작업 방식 3가지
Weaving
XXX.class(공통 로직 호출코드 X) - Weaving -> XXX.class(공통 로직 호출코드 O)
Weaving
XXX.class - 메모리 로드 (바이트코드 조작) -> XXX.class(메소드안에 공통 로직 호출코드 포함)
Weaving
(Spring 방식)XXX.class - 실행 시 Proxy 생성 -> XXX_Proxy.class(공통 로직 호출코드 O)
JoinPoint
: 어떤 부분, 어디에 Advice
적용, 코드 삽입할지 위치
PointCut
: target
필터링 + method
필터링 역할
표현식 사용(주로 AspectJ 표현식 사용)
=> 메소드 호출 관련 => execution(메소드 선언부 : public * *(..) throws XXXException) (..은 0개 이상)
Spring은 Proxy기반 위빙 사용.
PointCut
에 관련된 JoinPoint
는 메소드 호출 관련된 것만 가능!