Home [Spring] 스프링 PSA 개념
Post
Cancel

[Spring] 스프링 PSA 개념

PSA (Portable Service Abstraction)

일관성있는 서비스 추상화

  • Service Abstraction
    • 어댑터 패턴을 적용해 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한 것
    • 추상화 계층을 사용해서 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것
  • Portable Service Abstraction
    • 서비스 추상화로 제공되는 기술을 다른 기술 스택으로 간편하게 바꿀 수 있는 확장성을 갖고 있는 것

Spring이 제공하는 PSA

Spring Web MVC (Model View Controller)

1
2
3
4
5
6
7
8
9
10
@Controller
class SampleController {			// controller
  
  @GetMapping("/sample")
  public String initForm(Map<String, Object> model) {
    Sample sample = new Sample();	// model
    model.put("sample", sample);
    return "sample/init";			// view
  }
}
  • @Controller 을 사용하면 요청을 Mapping 할 수 있는 Controller 역할을 수행하는 Class라는 의미이다.

    그 Class에서 @GetMapping, @PostMapping 등으로 요청을 Mapping한다. (URL에 해당하는 요청이 들어왔을 때 메소드가 처리할 수 있도록 한다.)

    • Servlet을 Low level로 개발하지 않고도 Spring Web MVC를 사용하면 이렇게 Servlet을 간편하게 개발할 수 있다.

      • servlet을 직접 구현했을 때 (doGet, doPost 직접 구현)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
      public class SampleCreateServlet 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);
        }
      }
      
  • PSA인 이유 : @Controller, @RequestMapping 등 을 사용하면 기존의 코드를 거의 변경하지 않고 웹 기술 스택을 바꿀 수 있다. (Servlet 혹은 Reactive로 코딩할 수 있고, 서버를 톰캣, 제티, 네티, 언더로우로 바꿔가며 쓸 수 있다.)

스프링 트랜잭션 (Platform TransactionManager)

1
2
3
4
5
public interface SampleRepository extends Repository<Sample, Integer> {
  
  @Transactional(readOnly = true)
  Sample findById(Integer id);
}
  • @Transactional 이 붙어있는 메소드는 트랜잭션 처리가 된다.
  • PSA인 이유 : @Transactional을 사용하면 JPA, JDBC, Hibernate 등 사용하는 기술에 따라 트랜잭션을 관리하는 구현체를 JpaTransactionManager, DatasourceTransactionManager, HibernateTransactionManager 로 바꿔가며 사용할 수 있다. (코드를 변경하지 않더라도)

스프링 캐시 (CacheManager)

1
2
3
4
5
6
public interface SampleRepository extends Repository<Sample, Integer> {
  
  @Transactional(readOnly = true)
  @Cacheable("samples")
  Collection<Sample> findAll() throws DataAccessException;
}
  • @Cacheable 이 붙어있는 메소드는 캐시를 가져온다.
  • PSA인 이유 : @Cacheable을 사용하면 캐시를 관리하는 구현체를 JCacheManager, ConcurrentMapCacheManager, EhCacheCacheManager로 바꿔가며 사용할 수 있다.

출처📎

This post is licensed under CC BY 4.0 by the author.