PSA (Portable Service Abstraction)
환경의 변화에 관계없이 일관된 방식의 기술 접근 환경을 제공하려는 추상화 구조
즉, 일부 코드 변경만으로도 완전히 다른 기술로 동작이 가능한(Portable) 서비스 추상화(Service Abstraction) 구조이다.
Tomcat & Netty
간단한 gradle 의존성 변경으로 tomcat 또는 netty 사용이 가능하다.
// tomcat
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
// netty
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
}
개발자가 직접 Low Level 코드를 제어하지 않고 간단한 의존성 변경으로 이러한 작업이 가능하다.
Spring Transaction Manager
기존의 JDBC에서의 Transaction 처리는 AutoCommit 해제 등 많은 Low Level 처리가 필요하다.
하지만, Spring이 제공하는 추상화 계층에서는 @Transactional을 사용하면 알아서 처리를 해준다.
그리고 JDBC, JPA, Hibernate에 따라 Connection 관리 방법 등 구현 방법이 다르다.
하지만, Spring은 @Transactional 단일 어노테이션으로 이를 다 커버한다.
이것이 바로 추상화 때문에 가능한 것이다.
즉, @Transactional은 각 TransactionManager를 구현하고 있는 것이 아니라
최상위 PlatformTransactionManager를 이용하고 필요한 TransactionManager를 DI받아 사용하고 있다.
PlatformTransactionManager는 TransactionManager를 extends 하고,
PlatformTransactionManager는 한번 더 추상화 되어 AbstractPlatformTransactionManager로 제공이 된다.
그리고 각 TransactionManager(JDBC, JPA, Hibernate 등)은 AbstractPlatformTransactionManager를 extends 받아,
각 방식대로 Transaction 처리를 구현한 구조이다.
Spring의 PSA 덕에 개발자는 JDBC를 사용하던, JPA를 사용하던 트랜잭션 처리를 위해 @Transactional만 사용하면 되는 것 이다.
참고
'Develope > Spring & Springboot' 카테고리의 다른 글
[Spring-Data-Rest] REST API 자동 생성 (0) | 2022.07.31 |
---|---|
Spring Cloud Gateway 란? (1) | 2022.06.30 |
[Spring] Spring Triangle - DI, AOP, PSA (0) | 2022.06.29 |
[Spring] AOP - Aspect Oriented Programming (0) | 2022.06.28 |
[Spring] Inversion of Control & Dependency Injection (0) | 2022.06.28 |