
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가지
WeavingXXX.class(공통 로직 호출코드 X) - Weaving -> XXX.class(공통 로직 호출코드 O)WeavingXXX.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는 메소드 호출 관련된 것만 가능!