직역하면 관점 지향 프로그래밍으로 해석할 수 있다. 여기서 관점이란 애플리케이션에서 필요한 기능 중에서 공통적으로 적용되는 공통 기능에 대한 관심과 관련이 있다.
커피 주문을 위한 애플리케이션의 경우, 커피 종류의 등록과 커피를 주문하는 기능이 핵심 관점 사항에 해당되고, 애플리케이션 보안에 대한 부분은 공통 관점 사항에 해당된다. AOP는 이런 핵심 로직과 공통 로직을 분리하는 것이라고 할 수 있다.
@Component
@Transactional // (1)
public class Example2_12 {
private Connection connection;
public void registerMember(Member member, Point point) throws SQLException {
saveMember(member);
savePoint(point);
}
private void saveMember(Member member) throws SQLException {
// Spring JDBC를 이용한 회원 정보 저장
}
private void savePoint(Point point) throws SQLException {
// Spring JDBC를 이용한 포인트 정보 저장
}
}
트랜잭션 처리를 위해 중복된 코드를 공통화하여 재사용하게 하는것이 AOP의 핵심이다. @Transactoinal 어노테이션을 사용하면 이러한 기능을 적용하게 된다.
애스팩트
조인 포인트
어드바이스
포인트컷
추상 클래스를 통해 추상화의 개념과 필요한 이유에 대해서는 익히 알 것 이다. 이를 서비스에 적용하여 추상화 된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것이 PSA의 기본 개념이다.
JdbcConnector.java
public interface JdbcConnector {
Connection getConnection();
}
MariaDBJdbcConnector.java
public class MariaDBJdbcConnector implements JdbcConnector {
@Override
public Connection getConnection() {
return null;
}
}
OracleJdbcConnector.java
public class OracleJdbcConnector implements JdbcConnector {
@Override
public Connection getConnection() {
return null;
}
}
SQLiteJdbcConnector.java
public class SQLiteJdbcConnector implements JdbcConnector {
@Override
public Connection getConnection() {
return null;
}
}
위 코드의 예시를 봤을 때, MariaDB, Oracle, SQLite 모두 JdbcConnector라는 인터페이스를 구현하는 구현체이다. 세 구현체는 인터페이스를 통해 간접적으로 연결(Loose Coupling)되어 있고, 각자 일관된 방식으로 해당 서비스의 기능을 사용할 수 있다. 이렇게 서비스 기능을 접근하는 방식 자체는 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것이다.
그렇기에 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구사항을 반영하고 유연하게 대처할 수 있다.