본문 바로가기
Dev/Spring

[스프링 프레임워크 입문] PSA

by dev_jsk 2020. 11. 18.
728x90
반응형

PSA (Portable Service Abstraction)

PSA란 환경의 변화와 관계 없이 일관된 방식의 기술 접근 환경을 제공하려는 구조이다.

 

해당 강의에서 사용하는 PetClinic은 서블릿 애플리케이션임에도 서블릿이 존재하지 않는다.

간단하게 @Controller 어노테이션이 붙어있는 클래스에서 @GetMapping, @PostMapping 과 같은 @RequestMapping 사용해서 요청을 매핑한다.

실제로는 내부적으로 서블릿 기반으로 코드가 동작하고 서블릿 기술은 추상화 계층에 의해 숨겨져 있다.

이렇게 추상화 계층을 사용하면 우리는 편하게 개발을 할 수 있다.

 

스프링은 주로 다양한 기술(Spring MVC, Spring Transaction, Spring Cache...)에 Service Abstraction을 제공한다.

Spring Web MVC

@Controller 어노테이션을 사용하면 요청을 매핑할 수 있는 컨트롤러 역할을 수행하는 클래스가 된다.

해당 클래스 안에서 @GetMapping이나 @PostMapping을 사용해 요청을 매핑한다. 또한, 요청을 처리하는 메소드들은 View를 리턴하고 View에서 사용하는 객체는 model에 담아 전달한다.

이렇게 Spring Web MVC를 사용해 서블릿 애플리케이션을 간편히 개발할 수 있는 이유는 뒷단에 스프링이 제공하는 여러가지 기능이 있다.

그 덕분에 우리는 서블릿을 만들어 HttpServlet을 상속받아 doGet(), doPost()를 각각 구현할 필요가 없다.

이것이 바로 Service Abstraction이 제공하는 편의성 중 하나이다.

 

PSA의 또 예시를 보자면 기본 Service Abstraction에서 Portable이 붙었기 때문에 다른 기술 스택으로 바꿔 사용할 수 있다.

그러면 스프링 부트의 기본 설정인 Tomcat이 아닌 Spring Webflux 라는 프로그래밍 모델을 이용해 기술을 구현해보자

 

Spring Webflux 란 Spring 5 부터 추가된 프로그래밍 모델로 기존의 Spring Web MVC와 거의 흡사하다. 그렇지만 기술이 완전히 달라 기존 서블릿 처럼 하나의 요청이 들어옴에 따라 하나의 스레드를 사용하는 것이 아닌 CPU 갯수 만큼의 스레드를 유지하면서 요청을 받아 최소한의 스레드로 가용성을 높이는 프로그래밍 방법 중 하나이다.

 

따라서 Spring Webflux로 의존성을 변경하면 Tomcat이 아닌 Netty 기반으로 변경할 수 있다.

pom.xml

Spring Web을 사용하지 않으면 ModelAndView를 사용할 수 없다. 따라서 ModelAndView를 사용하는 코드를 주석처리한다.

 

그 뒤 애플리케이션을 동작시키면 Netty 기반으로 동작하는 것을 알 수 있다.

 

원래 Netty 기반으로 코드를 작성하려면 Netty 공식 문서에 나와있는 것 처럼 작성해야 하지만 우리는 스프링이 제공해주는 Spring Web MVC 추상화 계층을 사용해서 Netty를 사용할 수 있다.

 

Spring Web MVC는 @Controller, @RequestMapping등 여러 어노테이션, 뒷단에 있는 복잡한 인터페이스나 여러 기반 시설을 기반으로 우리는 Servlet이나 Reactive로 코딩을 할 수 있다. 또한 서버를 다른 기술로 쉽게 변경할 수 있다.

중요한건 이러한 기술 변경이 코드를 거의 변경하지 않고 가능하다는 것이다.

Spring Transaction

트랜잭션이란 All or Nothing이란 속성으로 다중 작업이 모두 처리가 되거나 아니면 모두 처리가 되지 않아야 하는 것이다.

 

기존에는 트랜잭션 처리를 하려면 Low Level로 명시적으로 commit, rollback을 호출하여 처리하였지만 스프링이 제공하는 추상화 계층에서는 @Transactional을 이용하면 해당 어노테이션이 붙어있는 메소드는 트랜잭션 처리가 되기 때문에 명시적으로 commit, rollback을 호출할 필요가 없다.

 

이것 역시 PSA중 하나로 다양한 기술로 바꿔서 사용이 가능하다.

JDBC를 사용하는 경우에는 DatasourceTransactionManager를 사용할 수 있고, Hibernate를 사용할 경우 HibernateTransactionManager, JPA를 사용할 경우 JpaTransactionManager를 사용할 수 있다.

Spring Cache

Cache도 마찬가지로 @Cache어노테이션을 사용하면 JCacheManager, ConcurrentMapCacheManager, EhCacheCacheManger등 다양한 구현체로 바꿔 쓸 수 있다.

 

따라서 Service Abstraction 덕분에 기술이 견고해지고 우리의 코드는 바뀔일이 없다.

728x90
반응형

댓글