본문 바로가기

Backend/Spring

[Spring] PSA란?

이전 포스팅까지 Spring Triangle 중 IOC와 AOP에 대하여 다루어 보았습니다.

https://chanho0912.tistory.com/8?category=866707 

 

[SpringBoot] IOC(Inversion Of Control), DI(Dependency Injection)이란?

지난 포스팅까지 SpringBoot의 작동에 핵심적인 역할을 하는 Dispatcher Servlet에 대해 알아보았다. 이번에는 Spring에서 제공하는 핵심적인 기능 중 IOC에 대해 포스팅을 해보려 한다. IOC란? 의존 관계 주

chanho0912.tistory.com

 

https://chanho0912.tistory.com/16

 

[SpringBoot] AOP란?

본 포스팅은 https://chanho0912.tistory.com/14 [Java] 프록시 패턴이란? 원래 Spring 카테고리에 AOP에 대한 글을 포스팅하고 있었는데, Spring에서 제공하는 AOP를 이해하기 위해서는 기본적인 프록시 패턴에..

chanho0912.tistory.com

 

마지막 Spring의 핵심가치인 PSA라는 것에 대해 알아보는 시간을 갖도록 하겠습니다.

 

PSA(Portable Service Abstraction)란?

우선 PSA를 살펴보기 전에 Service Abstraction의 개념부터 살펴보고 가겠습니다.

 

try {
	dbConnection.setAutoCommit(false);

	doSomething()...

	dbConnection.commit();

	System.out.println("Done!");

} catch(SQLException e) {
	dbConnection.rollback();
}
finally {
	...
    	dbConnection.close();
}


 

위 코드는 Transaction 처리에 대한 코드 일부를 가져온 것입니다. 

 

하지만 저희는 Service에 @Transactional이라는 어노테이션을 붙여 Transaction을 활용하기만 했을 뿐, 내부적으로 어떻게 작동하는지에 대해 개발 시에 살펴볼 일이 거의 없습니다.

 

이는 Spring Framework에서 내부적으로 작동하는 기능들을 숨기고, 추상화하여 개발자에게 제공하여 편리성을 줍니다.

 

즉, 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것이 서비스 추상화(Service Abstraction) 입니다.

 

하지만 위 코드와 같이 JDBC 기반으로 Database에 접근을 할 수 있고, 혹은 JPA를 활용하여 ORM 접근을 할 수도 있습니다. 하지만 개발자는 어떠한 방법을 사용할지라도 Transactional의 내부 코드를 수정하지 않습니다.

 

이처럼 하나의 추상화로 여러 서비스를 묶어둔 것을 PSA(Portable Service Abstraction)이라고 합니다.

 

실제로 위와 같은 일이 어떻게 가능한지에 대해 조금 자세히 살펴보면,

 

기본적으로 Spring에서는 PlatformTransactionManager이라는 최상위 Manager를 사용하고, 각각 사용자의 선언에 따라서 JPATransactionManger, DatasourceTransactionManager, HibernateTransactionManger 등을 상황에 맞게 의존성 주입을 받아 사용하게 됩니다.

 

따라서 개발자는 내부적으로 어떠한 Database Mapping전략을 사용하던지 관계없이 @Transactional이라는 어노테이션을 활용하면 Transaction 처리를 할 수 있게 됩니다.

 

또 다른 예로는 기본적으로 SpringMVC를 살펴보면 확인할 수 있습니다.

 

저희는 기본적으로 Servlet기반 Application을 활용하지만, 개발자는 Spring framework를 사용하면 Servlet을 직접적으로 코딩할 일이 거의 없습니다. @Controller, @GET(url) 등의 어노테이션만 활용하게 되면 보이지 않는 곳에서 Spring이 저희가 원하는 기능을 편리하게 처리해 줍니다. 즉 개발자는 HttpServlet을 구현하여 모든 Mapping에 대해 직접적으로 구현할 일이 없게 Service Abstraction을 하여 도와주는 겁니다.

 

*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.