PSA(Portable Service Abstraction)
PSA는 잘 만든 인터페이스이다.
💡PSA(Portable Service Abstraction): 하나의 추상화로 여러 서비스를 묶어둔 것, 환경의 변화와 관계없이 일관된 방식으로 기술에 접근할 수 있는 환경을 제공하려는 추상화 구조를 말한다.
추상화 계층을 사용해서 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것을 서비스 추상화(Service Abstraction)이라 한다. 이러한 서비스 추상화로 제공되는 기술을 다른 기술 스택으로 간편하게 바꿀 수 있는 확장성을 갖고 있는 것이 PSA이다.
예를 들어 @Cacheable 애노테이션을 보면 된다. 비즈니스 로직의 특정 메서드의 결과를 캐싱하고 싶을 때 @Cacheable 애노테이션을 사용한다. 현재 EhCache를 사용해 로컬 캐시를 사용하고 있다고 했을 때 이를 Redis로 바꾸고 싶다. 그럼 해당 비즈니스 로직을 모두 수정해야할까?
단순히 CacheManager만 EhCacheManager에서 RedisCacheManager로 교체만 해주면된다.
이와 같이 비즈니스 로직 수정없이도 다른 서비스로 교체 가능한 이유는 PSA에 있다.
Spring은 Spring Web MVC, Spring Transaction, Spring Cache 등의 다양한 PSA를 제공하고 있다.
Spring PSA의 원리
Spring PSA는 추상화 계층을 추가해 서비스를 추상화하고 여러 서비스를 비즈니스 로직을 수정하지 않고 교체할 수 있도록 하는 것을 의미한다. 즉, 추상화 계층의 핵심사항이다.
@Transactional
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
추상화 계층의 인터페이스인 PlatformTransactionManager 인터페이스를 두고 이를 구현하는 다양한 서비스의 비즈니스 로직을 추상화 해두었다. 개발자는 단순히 PlatformTransactionManager를 선언해서 이용하면 되고 언제든지 이를 구현하는 다른 구현체로 변경할 수 있다.
예를 들어 JDBC를 사용하는 DatasourceTransactionManager, JPA를 사용하는 JPATransactionManager, Hibernate를 사용하는 HibernateTransactionManager를 유연하게 바꿔서 사용할 수 있다.
JDBC Driver
JDBC Driver도 마찬가지이다. 인터페이스로 추상화되어 이를 다양한 서비스로 구현되었기 때문에 비즈니스 로직 변경없이도 다른 서비스로 쉽게 교체가능한 것이다.
Spring Web MVC
Spring Web MVC에서의 PSA도 살펴보자.일반 클래스에 @Controller 애노테이션을 사용하면 요청을 매핑할 수 있는 컨트롤러 역할을 수행하는 클래스가 된다.
@RequiredArgsConstructor
@Controller
public class PostsController {
private final PostsService postsService;
@GetMapping("/")
public String list(Model model, @RequestParam(value="page", defaultValue = "1") Integer pageNum
, Pageable pageable, @LoginUser UsersDto.Response user){
.. 생략
}
... 생략
}
Spring Web MVC를 사용하면 이렇듯 서블릿을 간편하게 개발할 수 있는데, 그 이유는 뒷단에 Spring이 제공해주는 여러 기능들이 숨겨져 있기 때문이다.
직접 HttpServlet을 상속받고 doGet(), doPost()를 구현하는 등의 작업을 직접해주는 않아도 된다는 것이다. 이러한 이유는 서비스 추상화에 있다. 서비스 추상화의 목적 중 하나가 이러한 편의성을 제공하는 것이다.
또한, Spring Web MVC는 코드를 거의 바꾸지 않고도 톰캣이 아닌 다른 기술 스택으로 실행할 수 있다. 예를 들어 spring-boot-stater-web 의존성 대신 spring-boot-stater-webflux 의존성을 받도록 바꿔주기만 하면 톰캣이 아닌 netty 기반으로 실행할 수 있다.
이렇듯 애노테이션과 여러가지 복잡한 인터페이스들 그리고 기술들을 기반으로 사용자가 기존의 코드를 거의 변경하지 않고, 웹기술 스택을 간편하게 바꿀 수 있도록 한다.
'Spring > 개념' 카테고리의 다른 글
[Web] HTTP 웹 기본 (0) | 2023.06.04 |
---|---|
[Web] 서블릿(servlet)이란? (0) | 2023.05.23 |
[Spring] 스프링 AOP (0) | 2023.05.11 |
[Spring Security] 스프링 시큐리티의 동작 구조 (0) | 2023.05.11 |
[Spring Security] 스프링 시큐리티와 FilterChain (1) | 2023.05.11 |