PSA 란 ? 잘 만든 인터페이스
나의 코드
확장성이 좋지 못한 코드 or 기술에 특화되어 있는 코드
나의 코드
+++++++++
잘 만든 인터페이스(PSA)
++++++++++++++++
확장성이 좋지 못한 코드 or 기술에 특화되어 있는 코드
스프링 트랜잭션
@Transactional 이라는 annotation을 처리하는 Aspect 가 있다.
그 Aspect에서는 *PlatformTransactionManager 라는 인터페이스를 사용해서 코딩을 해놨다.
* 잘 만든 인터페이스(PSA) 의 예
그렇기 때문에 PlatformTransactionManager 의 여러 구현체들이 바뀌더라도, 트랜잭션의 Aspect 코드는 바뀌지가 않는다.


여기서는 Repository 라는 interface를 구현하고 있는데 , 이 프로젝트는 Spring JPA Data 를 사용하고 있기 때문에,
SpringBoot의 자동설정에 의해서 JpaTransactionManager 가 기본으로 빈으로 등록되어있는 상태이다.
@Transactional을 처리하는 @Aspact는 PlatformTransactionManager 인터페이스를 사용해서
구현체가 JpaTransactionManager -> DataSourceTransactionManager 으로 바뀌어도
그 Transactional을 처리하는 Aspect 코드는 바뀌지가 않는다.
스프링 캐시

@EnableCaching가 활성화가 되면 @Cachenable | @CacheEvict | ..... 등의 annotation을 사용할수 있는데,
사용하려면 CacheManager가 있어야한다. (이 부분은 트랜잭션과 동일하다.)
이 annotation을 처리하는 Aspect가 어딘가에 있는데 그 Aspect는 분명히 TransactionManager를 사용한다.
위에 코드를 보면 @Bean이 하나 있고 그 안에 JCacheMAnagerCustomizer가 있다? -> 여기선 JCacheManager를 사용한다는 말이다.
만약 EhCacheManagerCustomizer로 바꾼다고 하면 EhCaheManger를 쓰게 될거고, 그럼에도 불구하고 처리하는 Aspect의 코드는 바뀌지 않는다.
스프링 웹 MVC

이 코드는 @Controller 와 @GetMapping 을 사용해서 웹 MVC를 구현하고 있다.
@LogExecutionTime
@GetMapping("/owners/new") //이런 요청이 들어오면 아래의 메소드들이 실행됨.
public String initCreationForm(Map<String, Object> model) {
Owner owner = new Owner();
model.put("owner", owner);
return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;
}
그리고 return View에 해당하는 view를 보여준다.
근데 이 코드가 survlet 일수도 있고, Reactive 일수도 있다.
대부분의 코드는 추상화가 되었기 때문에 survlet에서 Reactive로 바꿀수가 있다.
이것이 PSA의 가장 큰 목표고 장점이다.
PSA 란 ? 잘 만든 인터페이스
나의 코드
확장성이 좋지 못한 코드 or 기술에 특화되어 있는 코드
나의 코드
+++++++++
잘 만든 인터페이스(PSA)
++++++++++++++++
확장성이 좋지 못한 코드 or 기술에 특화되어 있는 코드
스프링 트랜잭션
@Transactional 이라는 annotation을 처리하는 Aspect 가 있다.
그 Aspect에서는 *PlatformTransactionManager 라는 인터페이스를 사용해서 코딩을 해놨다.
* 잘 만든 인터페이스(PSA) 의 예
그렇기 때문에 PlatformTransactionManager 의 여러 구현체들이 바뀌더라도, 트랜잭션의 Aspect 코드는 바뀌지가 않는다.


여기서는 Repository 라는 interface를 구현하고 있는데 , 이 프로젝트는 Spring JPA Data 를 사용하고 있기 때문에,
SpringBoot의 자동설정에 의해서 JpaTransactionManager 가 기본으로 빈으로 등록되어있는 상태이다.
@Transactional을 처리하는 @Aspact는 PlatformTransactionManager 인터페이스를 사용해서
구현체가 JpaTransactionManager -> DataSourceTransactionManager 으로 바뀌어도
그 Transactional을 처리하는 Aspect 코드는 바뀌지가 않는다.
스프링 캐시

@EnableCaching가 활성화가 되면 @Cachenable | @CacheEvict | ..... 등의 annotation을 사용할수 있는데,
사용하려면 CacheManager가 있어야한다. (이 부분은 트랜잭션과 동일하다.)
이 annotation을 처리하는 Aspect가 어딘가에 있는데 그 Aspect는 분명히 TransactionManager를 사용한다.
위에 코드를 보면 @Bean이 하나 있고 그 안에 JCacheMAnagerCustomizer가 있다? -> 여기선 JCacheManager를 사용한다는 말이다.
만약 EhCacheManagerCustomizer로 바꾼다고 하면 EhCaheManger를 쓰게 될거고, 그럼에도 불구하고 처리하는 Aspect의 코드는 바뀌지 않는다.
스프링 웹 MVC

이 코드는 @Controller 와 @GetMapping 을 사용해서 웹 MVC를 구현하고 있다.
@LogExecutionTime
@GetMapping("/owners/new") //이런 요청이 들어오면 아래의 메소드들이 실행됨.
public String initCreationForm(Map<String, Object> model) {
Owner owner = new Owner();
model.put("owner", owner);
return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;
}
그리고 return View에 해당하는 view를 보여준다.
근데 이 코드가 survlet 일수도 있고, Reactive 일수도 있다.
대부분의 코드는 추상화가 되었기 때문에 survlet에서 Reactive로 바꿀수가 있다.
이것이 PSA의 가장 큰 목표고 장점이다.