이전 포스트에서 POJO를 간단하게나마 설명하였습니다.
그중에서 IOC와 DI는 짧게라도 설명한 적이 있으나, AOP와 PSA는 없었기에
이번 기회에 포스트하고자 합니다.
AOP란?
Aspect Oriented Programming의 약자로 관점 지향 프로그래밍을 뜻합니다.
관점지향은 쉽게 설명하자면, 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고
그 관점을 기준으로 각각 모듈화하겠다... 정도로 설명이 가능합니다.
한 마디로 표현하자면, 어떤 로직을 어떤 관점으로 각각 공통화된 로직이나 기능을 하나의 단위로 묶는 것
이라고 표현할 수 있습니다.
핵심관점은 보통 우리가 적용하고자하는 핵심 비즈니스 로직 등이고, 부가적인 관점으로는 핵심로직을 실행하기위해
행해지는 DB연결, 로깅, 파일 입출력 등을 예로 들 수 있습니다.
AOP는 각 관점을 기준으로 로직을 모듈화라는 것은 이제 어느정도 이해가 되셨을 겁니다.
즉, 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들을 보통 흩어진 관심사라고 부릅니다.
흩어진 관심사를 관점으로 모듈화하고 핵심적인 비지니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지입니다.
Spring AOP의 특징은?
- 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서임
- 스프링 빈에만 AOP를 적용 가능
- 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적
@Aspect 어노테이션을 붙여 해당 클래스가 Aspect를 나타내는 클래스임을 명시하고, @Component 어노테이션을 붙여
Spring Bean으로 등록합니다.
Spring PSA란?
Portable Service Abstraction의 약자로 서비스 추상화입니다. 추후 포스팅하게 될 내용인 Transaction과 관련이 있습니다. @Transactional 어노테이션을 붙여주는 것만으로도 별도의 코드 추가없이 트랜잭션 서비스를 사용할 수 있습니다.
이 말은 즉슨, 내부적으로 트랜잭션 코드가 추상화되어 숨겨져있다는 의미입니다.
이렇게 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것이 서비스 추상화입니다.
많고많은 DB에 접근하는 방법을 아무런 문제없이 @Transactional 어노테이션 하나만으로 트랜잭션을 유지하는 기능을
추가할 수 있습니다. 이렇게 하나의 추상화로 여러 서비스를 묶어둔 것을 Spring에서 PSA라고 합니다.
(Transaction을 제어함에 있어 하나의 기술에 국한되지않고 트랜잭션 관리의 모든 기술을 아우를 수 있는 것 =
Spring의 PSA)
PSA의 원리
모든 트랜잭션, DB에 접근하는 방법이 모두 통하게 설계해야합니다.
예를 들어 JDBC를 사용하기 위해 트랜잭션을 개발한다고 가정한다면, Connection을 사용해서 설계하도록 됩니다.
하지만, JPA는 Connection을 직접 관리를 하지않고 EntityManager로 간접으로 관리합니다.
Hibernate라면 Session으로 관리하게 됩니다.
그렇다고 그에 맞는 하나하나의 트랜잭션을 개발하게 된다면 설계 의도에 맞지 않게 됩니다.
이는 앞서 설명했듯이 추상화를 사용하여 설계되어 있습니다.
Spring의 @Transactional 어노테이션은 각 TransactionManager를 각각 구현하고있는 것이 아닌
최상위 PlatformTransactionManager를 이용하고 필요한 TransactionManager를 DI로 주입받아 사용하는 원리를 가지고 있습니다.
이상입니다.
'Spring' 카테고리의 다른 글
[Spring] Spring Transaction 세부 설정 설명 (0) | 2022.02.21 |
---|---|
[Spring] Spring Transaction 특징 및 핵심기술 설명 (0) | 2022.02.20 |
[Spring] Spring POJO 설명 (0) | 2022.02.18 |
[Spring] Spring Entity, Repository 설명 (0) | 2022.02.17 |
[Spring] Spring DAO, DTO 설명 (0) | 2022.02.16 |