스프링의 정수는 엔터프라이즈 서비스 기능을 POJO에 제공하는 것
- 스프링의 주요 기술인 Ioc/DI, AOP와 PSA(Portable Service Abstraction)는 애플리케이션을 POJO로 개발할 수 있게 해주는 가능 기술이라고 불린다
POJO란
- Plain Old Java Object의 약자
- 직역하면 평범한 오래된 자바 객체다
POJO의 조건
- 특정 규약에 종속되지 않는다.
- 객체지향 설계의 자유로운 적용이 가능한 오브젝트여야만 POJO라고 불릴 수 있다.
- 특정 환경에 종속되지 않는다
- 환경에 독립적이어야 한다.
- 특히 비즈니스 로직을 담고 있는 POJO 클래스는 웹이라는 환경정보나 웹 기술을 담고 있는 클래스나 인터페이스를 사용해서는 안된다.
- 설령 나중에 웹 컨트롤러와 연결돼서 사용될 것이 뻔하도 할지라도
- 비즈니스 로직을 담은 코드에 HttpServletRequest나 HttpSession, 캐시와 관련된 API가 등장하거나 웹 프레임워ㅏ크의 클래스를 직접 이용하는 부분이 있다면 그것은 진정한 POJO라고 볼 수 없다.
진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다
POJO의 장점
- 특정한 기술과 환겨엥 종속디지 않는 오브젝트는 그만큼 깔끔한 코드가 될 수 있다.
- POJO로 개발된 코드는 자동화된 테스트에 매우 유리하다.
- 객체지향적인 설계를 자유롭게 적용할 수 있다.
POJO 프레임워크
- POJO 프로그래밍이 가능하도록 기술적인 기반을 제공하는 프레임워크
- 스프링 프레임워크와 하이버네이트 등
POJO를 가능하게 하는 스프링의 기술
- Ioc/DI
- AOP
- PSA
제어의 역전(Ioc) / 의존관계 주입(DI)
- 왜 두개의 오브젝트를 분리해서 만들고, 인터페이스를 두고 느슨하게 연결한 뒤, 실제 사용할 대상은 DI를 통해 외부에서 지정하는 걸까?
- 이렇게 DI 방식으로 하는 것이 직접 사용할 오브젝트를 new 키워드로 생성해서 사용하는 강한 결합을 쓰는 방법보다 나은 점은 무엇일까?
= 유연한 확장이 가능하게 하기 위해
- A->B라는 의존관계가 있을 떄 확장은 B가 자유롭게 변경될 수 있음을 의미
- 이는 B가 변경되어도 A는 아무 영향이 없고 그대로 유지 가능
B 관점에선 유연한 확장이고, A 관점에서는 변경 없이 재사용이 가능함 - 개방 폐쇄 원칙(OCP)라는 객체지향 설계 원칙으로 설명할 수 있음
애스펙트 지향 프로그래밍(AOP)
- 객체지향 기술만으로는 애플리케이션의 요구조건과 기술적인 난해함을 모두 해결하는데 한계가 있음
- 이를 도와주는 보조적인 프로그래밍 기술이 AOP
- 스프링의 AOP는 스프링이 POJO 프로그래밍을 지원하려는 그 핵심 목적을 위해 중요한 역할을 하고 있음
포터블 서비스 추상화(PSA)
- POJO로 개발된 코드는 특정 환경이나 구현 방식에 종속적이지 않아야 함
- 환경과 세부 기술의 변화에 관계없이 일관된 방식으로 기술에 접근 할 수 있게 해주는게 PSA
- 단순히 구체적인 기술에 종속되지 않게 하기 위해서 말고 테스트가 어렵게 만들어진 API나 설정을 통해 주요 기느을 외부에서 제어하게 만들고 싶을 때도 이용할 수 있음