POJO,PSA,AOP
📖 POJO의 등장
스프링이 탄생하기 전에 자바 엔터프라이즈 시장은 EJB(Enterprise Java Bean)가 독점하고 있었다.
변수, 예외처리, 상속까지 EJB에 의존하는 문제점이 존재했다.
EJB같이 복잡하고 제한적인 기술보다 자바의 단순 오프젝트를 이용해 비즈니스 로직을 구현하는 것이 낫다는 생각 아래 POJO가 등장하게 되었다.
POJO(Plain Old Java Object)는 간단한 오래된 자바 오브젝트를 뜻한다.
즉, 다른 환경에 종속되지 않고 필요에 따라 재사용이 가능한 자바 오브젝트를 뜻한다.
또한 POJO를 지키기 위해 PSA, IoC, AOP 의 개념이 Spring에 추가되었다.
🔹PSA (Portable Service Abstraction)
PSA는 Spring Framework의 핵심 개념 중 하나로, 특정 기술에 의존하지 않고 공통된 인터페이스를 통해 다양한 구현체를 사용할 수 있도록 추상화한 계층을 제공한다. 이를 통해 개발자는 구현체에 종속되지 않고도 비즈니스 로직을 개발할 수 있으며, 기술 변경 시에도 코드 변경없이 손쉽게 대체할 수 있다.
*특정 기술 : JDBC, 트랜잭션, 캐시, 서블릿 등
*Portable은 환경에 종속되지 않고 쉽게 교체 가능하다 라는 의미로 이해해야 한다.
✅Spring의 대표적인 PSA 사례
1️⃣Spring Web MVC
Spring 안에는 Servlet을 통해 개발을 할 수 있게 많은 기능을 제공한다.
Servlet을 사용하려면 클래스에 HttpServlet을 상속받고 doGet(), doPost()등 오버라이딩하여 사용해야 한다.
하지만, Spring에서는 @Controller, @GetMapping, @PostMapping 등 annotation을 통해 요청을 매핑할 수 있다.
그 이유는 뒷단에 Spring이 제공해주는 여러 기능들이 숨겨져 있기 때문이다.
즉, HttpServlet을 상속받고 doGet(), doPost()를 구현하는 등의 작업을 하지 않아도 되는 것이다.
2️⃣Spring Transaction
Low level로 트랜잭션을 처리하려면 setAutoCommit(), commit(), rollback()을 명시적으로 호출해야 한다.
하지만 Spring이 제공하는 @Transactional 을 사용하면 단순하게 메소드에 annotaion을 붙여줌으로써 트랜잭션 처리가 이루어진다.
3️⃣Spring cache
Cache도 마찬가지로 JCacheManager, ConcurrentMapCacheManager와 같은 여러가지 구현체를 사용할 수 있다.
Spring에서는 @Cacheable annotation을 통해 필요에 따라 바꿔쓸 수 있다.
Spring은 특정 기술에 직접적 영향을 받지 않게끔 객체를 POJO 기반으로 한번씩 더 추상화한 Layer를 갖고 있으며
이를 통해 일관성있는 Service Abstraction(서비스 추상화)를 만들어 낸다.
덕분에 코드는 더 견고해지고 기술이 바뀌어도 유연하게 대처할 수 있다.
🔹AOP (Aspect Oriented Programming)
AOP(관전 지향 프로그래밍)는 객체 지향 프로그래밍(OOP)의 한계를 보완하기 위해 등장한 프로그래밍 패러다임이다.
OOP는 프로그램을 모듈화하여 중복을 줄이고 재사용성을 높이는 장점이 있지만, 시스템이 커지면서 문제가 발생한다.
- 여러 모듈에서 반복적으로 사용되는 코드(ex.로깅, 보안, 트랜잭션 처리 등)가 흩어져 존재하게 된다.
- 이러한 코드들은 비즈니스 로직과 섞여 있어 유지보수가 어려워진다.
이러한 공통적인 기능이 여러 모듈에 걸쳐 존재하는 현상을 횡단 관심사(Cross-cutting Concerns)라고 한다.
AOP의 목적은 이러한 횡단 관심사를 하나의 모듈(Aspect)로 분리하여 중앙에서 일괄처리할 수 있게 해주는 것이다.
- 핵심 비즈니스 로직과 부가적인 관심사를 분리할 수 있고
- 코드 중복 제거, 유지보수 용이성, 가독성 향상 등의 이점을 얻을 수 있다.
참고 : https://dev-coco.tistory.com/83
https://github.com/devSquad-study/2023-CS-Study/blob/main/Spring/spring_psa_ioc_aop_pojo.md