CS

[Spring] PSA(Portable Service Abstraction)

KJihun 2023. 10. 18. 16:09
728x90

 

 

추상화(Abstraction)

불필요한 부분을 생략하고 객체의 속성 중 가장 중요한 것에만 중점을 두어 개략화하는 것

 

 

PSA(Portable Service Abstraction): 휴대용 서비스 추상화

Portable은 휴대용이라는 의미로 JDBC Driver 의 종류를 비즈니스 로직의 수정없이 변경할 수 있는 것을 의미한다.

즉, MySQL Driver 를 사용하다 Oracle Driver 로 변경 시, 비즈니스 로직 수정 없이 바꿀 수 있다는 것이다.

 

이런 기능이 가능한 것은 추상화 계층이 존재하기 때문이다. 

모든JDBC Driver 는 공통적인 인터페이스를 가지고 있어 다른것으로 대체하어도 프로젝트에 영향을 끼치지 않는다.

 

이러한 점에서 Spring PSA 는 확장에는 열려있고 수정에는 닫혀있어야 한다는 OCP에 대표적인 예시라고 할 수 있다.

 

💠 완벽하게 이해하는 OCP (개방 폐쇄 원칙)

개방 폐쇄 원칙 - OCP (Open Closed Principle) 개방 폐쇄의 원칙(OCP)이란 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계가 되어야 한다는 원칙을 말한다. 보통 OCP를 확장에 대해서는

inpa.tistory.com

 

Spring PSA 를 왜 사용할까?


위에서도 언급하긴 했지만 서비스를 추상화함으로써 개발자가 실제 구현부를 알지 못하더라도 해당 기능을 사용할 수 있게된다. 즉, 추상화 계층인 인터페이스 API 의 정보를 활용해 해당 서비스의 모든 기능을 이용하면 되는 것이다.

 

또한, PSA 는 해당 추상화 계층을 구현하는 또 다른 서비스로 언제든지 교체할 수 있게 해준다. 비즈니스 로직의 수정도 없이 말이다.

 

위에서 잠깐 예시를 든 JDBC Driver 이외의 또 다른 예시를 들어보자면 @Cacheable 어노테이션을 들 수 있다.

 

비즈니스 로직의 특정 메소드의 결과를 캐싱하고 싶을 때 @Cacheable 어노테이션을 사용한다. 현재 EhCache 를 사용해 로컬캐시를 사용하고 있다고 했을 때 이를 Redis 로 바꾸고 싶다. 그러면 해당 비즈니스 로직을 모두 수정해야할까?

 

아니다. 단순히 CacheManager 만 EhCacheCacheManager 에서 RedisCacheManager 로 교체해주면 된다.

 

Spring PSA 의 구현방법


Spring PSA 는 추상화 계층을 추가해 서비스를 추상화하고 여러 서비스를 비즈니스 로직을 수정하지 않고 교체할 수 있도록 하는 것을 의미한다. 즉, 추상화 계층의 핵심사항이다. 그림으로 살펴보자.

 

 

핵심은 추상화 계층의 인터페이스인 FlatformTransactionManager 인터페이스를 두고 이를 구현하는 다양한 서비스의 비즈니스 로직을 추상화 해두었다는 것이다. 개발자는 단순히 FlatformTransactionManager 를 선언해서 이용하면 되고 언제든지 이를 구현하는 또 다른 구현체로 바꿀 수 있다.

 

JDBC Driver 예시

 

위에서 소개한 두 가지 예시를 통해서 Spring SPA 가 어떻게 맞물려 돌아가는지 이해할 수 있을 것이다.

 

이외에도 Tomcat 과 Netty 를 의존성만 변경하면 사용할 수 있는 것도 Spring PSA 를 통해 추상화되어있기 때문에 가능하다. 이처럼 Spring PSA 는 복잡한 구현로직을 수정하지 않고도 손쉽게 서비스를 변경할 수 있도록 해준다.