스프링 트라이앵글 - PSA

HyeonWoo·2021년 2월 18일
0

스프링 & JPA

목록 보기
28/34
post-thumbnail

PSA이란?

1. 스프링 Web MVC

아래 스프링 Web MVC 코드만 보면, @Controller 어노테이션이 붙은 클래스에서 @GetMapping, @PostMapping과 같은 어노테이션을 사용해서 요청을 매핑하고 있다.


// 기존의 서블릿 프로그래밍
public class OwnerCreateServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Exception{
    	super.doGet(req, resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Exception{
    	super.doPost(req, resp);
    }
 
}

// 스프링 Web MVC
@Controller
class OwnerController {

    ...
    ...
    
    @GetMapping("/owners/new")
    ....
    
    @PostMapping("/owners/new")
    ....
    
}
    

스프링 Web MVC도 서블릿 기반 위에서 만들어진 프레임워크이기 때문에 기존의 서블릿 프로그래밍 코드가 존재해야 하지만, 실제로는 내부적으로 서블릿 기반으로 코드가 동작하지만 서블릿 기술은 추상화 계층에 의해 숨겨져 있는 것이다.

이렇게 추상화 계층을 사용해서 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것이 Service Abstraction이라는 개념이다.

즉, 개발자는 @Controller, @GetMapping 과 같은 어노테이션으로 서블릿을 간편하게 개발할 수 있다. 뒷단에 Spring이 제공해주는 여러 기능들이 숨겨져 있기 때문이다.
그 기능들 때문에 서블릿을 low level로 개발하지 않아도 된다.
따라서 HttpServlet을 상속받고 doGet(), doPost()를 직접 구현하지 않아도 되는 것이다.

Service abstraction의 목적 중 하나가 이러한 편의성을 제공하는 것이다.

더 나아가 Service Abstraction으로 제공되는 기술을 다른 스택으로 간편하게 바꿀 수 있는 확장성을 갖고 있는 것이 PSA(Portable Service Abstraction)이다.

Spring Web MVC는 내장 톰캣이 탑재되어 실행된다. 하지만 PSA에 의해 코드는 그대로 둔 상태에서 톰캣이 아닌 완전히 다른 기술 스택으로 실행히 가능하다. 예를 들어, 프로젝트가 spring-boot-starter-web 의존성 대신
spring-boot-starter-webflux 의존성을 바꿔주기만하면 톰캣이 아닌 netty기반으로 실행할 수 있다.

여기서 중요한 점은 원래 기존의 코드를 변경시키지 않아도 기술 스택을 간편하게 바꿀 수 있다는 점이다!


2. Spring Transaction

Low level로 트랜잭션을 처리한다고 했을때 코드는 아래와 같을 것이다.

try{
	dbConnection = getDBConnection();
	dbConnection.setAutoCommit(false);
	
	preparedStatementInsert = ...
	...

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

} catch (SQLException e) {
	System.out.println(e.getMessage());
	dbConnection.rollback();
} finally {
	...
}

하지만 스프링에서 @Transactional 어노테이션을 사용하면 위와 같이 Commit관련 코드와 rollback같은 행위들을 한번에 처리해준다.

더 나아가, PSA로써 다양한 기술 스택으로 구현체를 바꿀 수 있다.
JDBC를 사용하는 DatasourceTransactionManager, JPA를 사용하는 JpaTransactionManager, Hibernate를 사용하는 HibernateTransactionManager를 유연하게 바꿔서 사용할 수 있는 것이다. 기존 코드는 변경하지 않은 채로 트랜잭션을 실제로 처리하는 구현체를 사용 기술에 따라 바꿔 끼울 수 있는 것이다.


3. Spring Cache

Cache도 마찬가지로 JCacheManager, ConcurrentMapCacheManager, EhCacheCacheManager와 같은 여러가지 구현체를 사용할 수 있다.

개발자는 @Cacheable 어노테이션을 붙여줌으로써 구현체를 크게 신경쓰지 않아도 필요에 따라 바꿔 쓸 수 있다.

Spring이 제공해주는 다양한 PSA 기술 덕분에 코드는 더 견고해지고 기술 스택이 바뀌어도 유연하게 대처할 수 있는 것이다.


참고자료

예제로 배우는 스프링 입문(개정판)

profile
학습 정리, 자기 개발을 위한 블로그

0개의 댓글