이전 포스팅까지 Spring Triangle 중 IOC와 AOP에 대하여 다루어 보았습니다.
https://chanho0912.tistory.com/8?category=866707
https://chanho0912.tistory.com/16
마지막 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을 하여 도와주는 겁니다.
*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.
'Backend > Spring' 카테고리의 다른 글
[SpringBoot] 블로그 프로젝트 #0 Github 연동하기 (0) | 2021.06.24 |
---|---|
[SpringBoot] SpringBoot와 Mysql 연동 (0) | 2021.06.24 |
[Spring] AOP란? (1) | 2021.06.23 |
[Spring/SpringBoot] 코드로 확인하는 Dependency Injection (0) | 2021.06.22 |
[Spring] IOC 컨테이너와 Bean이란? (0) | 2021.06.16 |