[Spring] 스프링 PSA
PSA(Portable Service Abstraction)
Spring은 Spring Triangle이라고 부르는 세 가지 개념을 제공해준다. 각각 IoC, AOP, PSA를 일컫는다.
@Controller 어노테이션이 붙어있는 클래스에서 @GetMapping, @PostMapping와 같은 @RequestMapping 어노테이션을 사용해서 요청을 매핑한다.
실제로 내부적으로 서블릿 기반으로 코드가 동작하지만 서블릿 기술은 추상화 계층에 의해 숨겨져 있는 것이다.
이렇게 추상화 계층을 사용해서 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것을 Service Abstraction 이라 한다.
더하여 Service Abstraction으로 제공되는 기술을 다른 기술 스택으로 간편하게 바꿀수 있는 확정성을 갖고 있는 것이 Portable Service Abstraction이다.
Spring은 Spring Web MVC, Spring Transaction, Spring Cache 등의 다양한 PSA를 제공한다.
Spring Web MVC
일반 클래스에 @Controller 어노테이션을 사용하면 요청을 매핑할 수 있는 컨트롤러 역할을 수행하는 클래스가 된다.
그 클래스는 @GetMapping와 @PostMapping 어노테이션을 사용해서 요청을 매핑할 수 있다.
@Controller
class TestController {
private final TestService testService;
public Test(TestService testService){
this.testService = testService;
}
@GetMapping("/test")
public Test getTest() {
Test test = testService.getTest();
return test;
}
@PostMapping("/test")
public void createTest(@Valid Test test) {
testService.createTest();
}
}
Spring Web MVC를 사용하면 이렇게 서블릿을 간편하게 개발할 수 있는데, 뒷단에 Spring이 제공해주는 여러 기능들이 숨겨져 있기 때문이다.
그래서 우리는 서블릿을 low level로 개발하지 않아도 된다.
즉 HttpServlet을 상속받고 doGet(), doPost()를 구현하는 등의 작업을 직접 하지 않아도 된다.
Service Abstraction의 목적 중 하나가 이러한 편의성을 제공하는 것이다.
이렇게 Spring Web MVC는 @Controller, @RequestMapping 와 같은 어노테이션과 뒷단의 여러가지 복잡한 인터페이스들 그리고 기술들을 기반으로 하여 사용자가 웹 기술 스택을 가편하게 바꿀 수 있도록 해준다.
중요한것은 이런 것들이 기존 코드를 거의 변경하지 않고도 가능하다는 것이다.
Spring Transaction
Low Level로 트랜잭션 처리를 하려면 setAutoCommit()와 commit(), rollback()을 명시적으로 호출해야 한다.
그러나 Spring이 제공하는 @Transactional 어노테이션을 사용하면 단순히 메소드에 어노테이션을 붙여줌으로써 트랜잭션 처리가 이루어진다.
@Transactional
User getUser(String username);
이 또한 PSA로써 다양한 기술 스택으로 구현체를 바꿀 수 있다.
예를 들어 JDBC를 사용하는 DatasourceTransactionManager, JPA를 사용하는 JpaTransactionManager, Hibernate를 사용하는 HibernateTransactionManager를 유연하게 바꿔서 사용할 수 있다.
즉 기존 코드는 변경하지 않은 채로 트랜잭션을 실제로 처리하는 구현체를 사용 기술에 따라 바꿔 끼울 수 있는 것이다.
Spring Cache
Cache도 마찬가지로 JCacheManager, ConcurrentMapCacheManager, EhCacheCacheManager와 같은 여러가지 구현체를 사용할 수 있다.
@Transactional
@Cacheable("users")
List<User> getAllUser();
사용자는 @Cacheable 어노테이션을 붙여줌으로써 구현체를 크게 신경쓰지 않아도 필요에 따라 바꿔 쓸 수 있는 것이다.
이렇게 Spring이 제공해주는 다양한 PSA 기술 덕분에 코드는 더 견고해지고 기술이 바뀌어도 유연하게 대처할 수 있게 된다.