1 분 소요

PSA (Portable Service Abstraction)

@Controller
public class OfferController {
	@RequestMapping("/offers")
	public String showOffers(Model model) {
		List<Offer> offers = offerService.getCurrent();
		model.addAttribute("offers", offers);
		
		return "offers";		
	}
}

이런식으로 Spring에서 웹 애플리케이션을 만들때 서블릿 애플리케이션임에도 서블릿이 보이지 않는다. 단지 @Controller, @RequestMapping, @GetMapping, @PostMapping 과 같은 annotation을 사용한다.

이 경우 실제로 내부에선 서블릿 기반의 코드가 동작하지만 서블릿 기술은 추상화 계층에 의해 숨겨져 있는 것이다.

이처럼 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것을 Service Abstraction 이라고 한다. 또한 이 Service Abstraction 으로 제공되는 기술을 다른 기술 스택으로 간편하게 바꿀 수 있는 확정성을 갖고 있는 것이 Portable Service Abstraction 이다. Spring은 Spring Web MVC, Spring Transaction 등의 다양한 PSA를 제공한다.

Spring Web MVC

@Controller
public class OfferController {
	@RequestMapping("/offers")
	public String showOffers(Model model) {
		List<Offer> offers = offerService.getCurrent();
		model.addAttribute("offers", offers);
		
		return "offers";		
	}
}

@Controller 애노테이션을 사용하여 컨트롤러 역할을 수행하는 클래스가 되고 @RequestMapping 을 통해 요청을 매핑할 수 있다.

Spring Web MVC를 이용하면 이처럼 서블릿을 간편하게 개발할 수 있다. Spring이 제공해주는 기능들을 사용하면 서블릿을 low level 로 개발하지 않아도 된다. HttpServlet 을 상속받고 doGet(), doPost() 를 구현하는 등의 작업을 하지 않아도 된다.

또한 Spring Web MVC는 코드를 거의 수정하지 않고 톰캣으로 실행하던 것을 다른 기술 스택으로 실행하는 것도 가능하다.

예를 들어 프로젝트가 spring-boot-starter-web 의존성 대신 spring-boot-starter-webflux 의존성을 받도록 바꿔주기만 하면 톰캣이 아닌 netty 기반으로 실행하게 할수도 있다. 복잡한 과정이 필요했었는데 Spring Web MVC 추상화 계층을 사용하여 간단하게 실행할 수 있는것이다. 게다가 이런 과정동안 기존의 코드는 거의 변경하지 않았다.

Spring Transaction

low level 로 트랙잭션을 처리하려면 commit(), rollback() 등을 명시적으로 호출해야하지만 Spring이 제공하는 @Transactional 애노테이션을 사용하면 단순히 메소드에 애노테이션을 붙여줌으로 트랜잭션 처리가 이루어진다.

또한 PSA로써 다양한 기술 스택으로 구현체 변경이 가능하다. 예를 들면 JDBC를 사용하는 DatasourceTransactionManager, JPA를 사용하는 JpaTransactionManager, Hibernate를 사용하는 HibernateTransactionManager를 유연하게 바꿔 사용할 수 있다. 즉, 기존의 코드는 변경하지 않고 트랜잭션을 실제로 처리하는 구현체를 사용하는 기술에 맞게 변경할 수 있다.

Spring이 제공하는 PSA기술로 코드는 더 견고해지고 기술이 바뀌어도 유연하게 대처할 수 있다.

태그:

카테고리:

업데이트:

댓글남기기