PE Notes · 사업관리
OOP와 AOP
객체가 도메인을 나누는 자리와, 로그·보안·트랜잭션처럼 여러 객체를 가로지르는 횡단 관심사를 애스펙트로 빼는 AOP를 비교합니다.
주문 클래스마다 로그·권한·트랜잭션을 붙이면, 비즈니스가 아니라 부가가 파일을 채웁니다. 은 도메인을 객체와 메시지로 나눕니다. 은 여러 객체를 가로지르는 를 한 로 빼 핵심 메서드를 얇게 둡니다. 상속으로 안 사라지는 중복이 여기로 옵니다.
객체가 못 닫는 칸
캡슐화·상속·다형성은 주문·결제·재고처럼 세로로 선 책임을 잘 가릅니다. 로그, 인가, 트랜잭션, 캐시, 감사는 그 세로를 가로로 자릅니다. 부모에 로그를 넣으면 모든 자식이 같은 형식에 묶이고, 유틸을 부르면 호출이 수백 곳에 남습니다. 의 단일 책임도, 부가가 핵심과 한몸에 있으면 깨집니다.
AOP는 핵심 클래스에 processOrder()만 남기고, 전후에 붙는 일을 애스펙트가 끼웁니다. 모듈의 단위가 클래스에서 관점으로 한 칸 더 갑니다. Java·C++가 객체의 대표라면, AspectJ와 스프링 프록시가 관점의 대표입니다.
| 비교축 | OOP | AOP |
|---|---|---|
| 나눔 | 클래스·객체 | 애스펙트 |
| 잘 푸는 것 | 도메인 복잡 | 가로지르는 중복 |
| 연결 | 상속·조합 | 위빙 |
| 한계 | 횡단이 산재 | 포인트컷이 과하면 흐름이 안 보임 |
애스펙트 다섯 이름
애스펙트는 횡단을 모듈로 묶은 단위입니다. 어드바이스는 그 단위가 실제로 하는 코드입니다. 조인 포인트는 끼울 수 있는 자리(메서드 호출, 예외)이고, 은 그중 어디를 고를지입니다. 은 애스펙트를 핵심에 삽입하는 시점입니다. 타깃은 부가가 붙는 비즈니스 클래스입니다.
어드바이스는 전(Before), 후(After), 정상 반환, 예외, 전후를 감싸는 Around입니다. Around가 가장 세고, 트랜잭션·실행 시간 측정이 여기를 씁니다. 위빙은 컴파일, 클래스 로드, 런타임 프록시로 갈립니다. 스프링의 선언적 트랜잭션·캐시·보안 애노테이션이 런타임 쪽에 가깝습니다.
| 이름 | 한 줄 |
|---|---|
| 애스펙트 | 횡단의 모듈 |
| 어드바이스 | 전·후·감싸기 코드 |
| 조인 포인트 | 끼울 수 있는 자리 |
| 포인트컷 | 실제 적용 위치 |
| 위빙 | 삽입 시점 |
같이 쓰는 법
객체는 남기고 관점을 더합니다. 대체재가 아닙니다. 도메인 규칙은 객체와 패턴에 두고, 로그·보안·트랜잭션·캐시·공통 예외만 애스펙트로 올립니다. 비즈니스 분기를 포인트컷에 숨기면 읽기가 깨집니다. 디버거가 프록시 뒤에서 멈추는 비용도 답에 한 줄 적습니다.
공공·금융은 감사 로그와 권한 검사를 한 애스펙트에 모아 정책 변경을 한곳으로 닫습니다. 시험은 핵심 로직과 애스펙트를 나눠 스텁할 수 있습니다. 과잉 포인트컷은 마법이고, 그때는 명시 호출이 낫습니다.
답안은 OOP≠AOP 표, 횡단 예, 애스펙트·어드바이스·포인트컷·위빙, 스프링 한 줄, 과잉 경고를 한 장에 닫습니다.