[Spring] PSA, AOP - 복습편

clean·2024년 3월 12일

Spring 입문 강의

목록 보기
6/6
post-thumbnail

스프링 삼각형 중 PSA, AOP에 대해 공부한 내용을 복습하며 작성한 글입니다.

PSA (Portable Service Abstraction)

PSA란 Portable Service Abstraction의 약자로, 해석하면 옮길 수 있는 서비스 추상화가 된다.

아래 예시들을 살펴보며 PSA가 무엇인지 이해해보자.

예시 1 - Spring MVC 프레임워크

서블릿을 직접 쓰는 방식으로 웹 개발을 하던 시절이 있었다고 한다.
(HttpServlet 추상 클래스를 확장한 서블릿 클래스를 만들고 doGet(), doPost() 등의 메소드를 오버라이딩하여 직접 서블릿을 만들던 시절)

하지만 이제는 서블릿을 직접 만드는 방식은 거의 쓰지 않고 스프링 MVC가 제공하는 여러 기능을 이용해서(@Controller라든가 @GetMapping이라든가 등등) 훨씬 편하게 요청 url과 그 때 실행되어야할 메소드를 매핑을 한다.

이렇게 개발자에게 편의를 주는 추상화 계층(MVC 프레임워크)을 제공하는 것을 SA(Service Abstraction)이라고 한다.

예시 2 - spring-web -> spring-webflux로 의존성 변경

그럼 PSA란 무엇일까?
PSA란 추상화 계층을 제공함으로써 현재 기술과 다른 기술을 사용하더라도 기존 코드를 수정하지 않도록(경우에 따라 약간의 수정이 필요할 수는 있다.) 해주는 것을 말한다.

예를 들어, spring-web 기반으로 spring 프로젝트를 실행하고 있었다고 하자.
그런데 spring-webflux 기반으로 바꾸고 싶다면?
설정 파일에 가서 기존 spring-web 의존성을 지우고 spring-webflux 의존성만 추가해주면 기존 자바 코드를 거의 고치지 않고도 webflux로 변경할 수 있다. (webflux에서는 ModelAndView를 쓸 수 없어서 ModelAndView가 들어간 코드 부분은 수정을 해주어야한다.)

이렇게 추상화 계층을 제공하여 코드의 변경 없이 여러 기술로 변경할 수 있기 때문에 Portable Service Abstraction이라고 한다.

예시 3 - @Transactional 어노테이션

@Transactional 어노테이션도 Portable Service Abstraction의 예시이다.

JPA, JDBC 등 여러 DB 접근 방식에 따라 구현체가 달라지겠지만, @Transactional 어노테이션은 여러 구현체에 대해서 트랜잭션 처리가 가능하다.

AOP(Aspect Oriented Programming)

AOP는 Aspect Oriented Programming의 약자이다.

나중에 스프링 코어 중급편 강의를 들으면 더 많은 걸 이해할 수 있겠지만, 일단은 간단하게 적어보려고 한다.

AOP는 아래 3가지 방식으로 구현이 가능하다고 한다.

  • CGLIB -> default
  • JDK Dynamic Proxy
  • Aspectj 방식

위에서 설명했던 @Transactional도 AOP의 예시이다.

여기서 주의할 점은 CGLIB 방식이 디폴트지만 이 방법은 프록시를 클래스로 처리하는 방식이기 때문에 private 메소드에 aop가 적용이 안된다고 한다.
예를 들어 private 메소드 위에 @Transactional을 붙여도 적용이 안된다는 것이다.

private 메소드에도 aop를 적용하고 싶다면 aspectj 방싱을 이용해야한다고 한다. 이는 컴파일 시에 바이트코드 안에 aop 코드를 끼우는 방식으로 동작하기 때문에 private 메소드에도 걸 수 있다고 한다.
-> 이거는 강의도 듣고, 프로젝트도 하면서 알아봐야겠다..!

profile
블로그 이전하려고 합니다! 👉 https://onfonf.tistory.com 🍀

0개의 댓글