
추상화 계층의 인터페이스인 PlatformTransactionManager 인터페이스를 두고 이를 구현하는 다양한 서비스의 비즈니스 로직을 추상화 해두었다. 개발자는 단순히 PlatformTransactionManager를 선언해서 이용하면 되고 언제든지 이를 구현하는 다른 구현체로 변경할 수 있다.
예를 들어 JDBC를 사용하는 DatasourceTransactionManager, JPA를 사용하는 JPATransactionManager, Hibernate를 사용하는 HibernateTransactionManager를 유연하게 바꿔서 사용할 수 있다.

JDBC Driver도 마찬가지이다. 인터페이스로 추상화되어 이를 다양한 서비스로 구현되었기 때문에 비즈니스 로직 변경없이도 다른 서비스로 쉽게 교체가능한 것이다.
이렇듯 애노테이션과 여러가지 복잡한 인터페이스들 그리고 기술들을 기반으로 사용자가 기존의 코드를 거의 변경하지 않고, 웹기술 스택을 간편하게 바꿀 수 있도록 한다.
추상화 계층을 추가함으로써, 코드가 더 많은 레이어를 거치게 된다. 예를 들어, 데이터베이스 접근을 추상화하는 인터페이스와 이를 구현하는 클래스들 사이에서 여러 단계의 호출이 이루어질 수 있다. 이로 인해 호출 스택이 깊어지고, 불필요한 메서드 호출이나 객체 생성이 발생할 수 있으며, 이는 성능 저하로 이어질 수 있다.
PSA는 다양한 기술을 지원하기 위해 일반화된 방법을 사용한다. 그러나 이 일반화는 특정 상황에서 최적화된 솔루션을 제공하기 어렵게 만들 수 있다. 예를 들어, 특정 데이터베이스나 메시징 시스템에 대해 최적화된 기능을 사용하지 못하고, 보다 범용적인 접근 방식을 사용하게 되면, 성능이 떨어질 수 있다.
스프링 프레임워크는 기본적으로 많은 기능을 지원하고, 다수의 자동 설정을 제공한다. 이로 인해 사용되지 않거나 최적화되지 않은 기능들이 애플리케이션에 포함되어 성능에 영향을 미칠 수 있다. 예를 들어, 특정 시점에 불필요한 빈이 생성되거나 초기화될 수 있다.
PSA 개념을 사용한 예시를 알아보자.
트랜잭션이 필요한 매서드에서 작업을 할 때, @Transactional 어노테이션을 붙여서 작업한다.
해당 어노테이션을 사용해 주면, 트랜잭션의 시작, 트랜잭션의 전파, 커밋, 롤백 등의 작업을 보다 쉽게 관리할 수 있게 도와준다.
명시적으로 commit(), rollback() 등을 호출하지 않았지만, 트랜잭션이 마무리되면 커밋을 해주고, 중간에 트랜잭션이 깨지면 롤백을 해줍니다.
그리고 이러한 트랜잭션을 관리하는 TransactionManager의 다양한 구현체들이 존재한다.
일반 클래스에 @Controller 어노테이션을 사용하면 요청을 매핑할 수 있는 컨트롤러 역할을 수행하는 클래스가 된다. 그 클래스에서는 @GetMapping 과 @PostMapping 어노테이션을 사용해서 요청을 매핑할 수 있다.
Spring Web MVC를 사용하면 서블릿을 간편하게 개발할 수 있는데, 뒷단에 Spring 이 제공해주는 여러 기능들이 숨겨져 있기 때문이다.
그래서 우리는 서블릿을 low level 로 개발하지 않아도 된다.
즉 HttpServlet을 상속받고 doGet(), doPost()를 구현하는 등의 작업을 직접 하지 않아도 된다.
Spring Web MVC