‘PO’는 Java로 생성하는 순수한 객체를 의미,
POJO = 객체지향 프로그래밍,
POJO 프로그래밍이란 순수 Java 객체가 다른 기술이나 환경에 종속되지 않도록 하기 위한 프로그래밍 기법이다.
POJO 프로그래밍으로 작성한 코드라고 하기위해서는 2가지 원칙이 존재한다
1.Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
2.특정 환경에 종속적이지 않아야 한다.
POJO 프로그래밍 코드를 작성하기 위해서 Spring에서는 세가지 기술을 지원
< IoC/DI, AOP, PSA >
IoC(Inversion of Control)
Inversion = 반전
애플리케이션 흐름의 주도권이 뒤바뀐 것
일반적인 애플리케이션의 제어 흐름은 main() 메서드가 호출 되고 난 다음에 System 클래스를 통해서 static 멤버 변수인 out의 println()을 호출하고 애플리케이션은 끝이난다
하지만 IoC는 예를 들어 웹에서 동작하는 애플리케이션의 경우 클라이언트가 외부에서 접속해서 사용하는 서비스이기 때문에 main() 메서드가 종료되지 않아야 함으로 main() 메서드가 존재하지 않는다,
서블릿 컨테이너의 경우, 클라이언트의 요청이 들어올 때마다 서블릿 컨테이너 내의 컨테이너 로직(service() 메서드)이 서블릿을 직접 실행시켜 주기 때문에 main() 메서드가 필요없고 서블릿 컨테이너가 서블릿을 제어하고 있기 때문에 애플리케이션의 주도권은 서블릿 컨테이너에게 있다
DI(Dependency Injection)
A 클래스가 B 클래스의 기능을 사용 할 때, ‘A클래스는 B클래스에 의존한다’라고 할수있다.
// 객체지향에서 배운 포함이 생각...
new 키워드를 사용해서 의존 객체를 생성할 때, 클래스들 간에 강하게 결합(Tight Coupling)
의존성 주입을 하더라도 의존성 주입의 혜택을 보기 위해서는 클래스들 간의 강한 결합은 피하는 것이 좋다
어떤 클래스가 인터페이스 같이 일반화된 구성 요소에 의존하고 있을 때, 클래스들 간에 느슨하게 결합(Loose Coupling)
AOP(Aspect Oriented Programming)
Aspect는 애플리케이션의 공통 관심사를 의미
애플리케이션의 공통 관심사는 비즈니스 로직을 제외한 애플리케이션 전반에 걸쳐서 사용되는 공통 기능들을 의미
애플리케이션 전반에 걸쳐서 사용되는 공통 기능(로깅, 보안, 트랜잭션, 모니터링, 트레이싱)
➡️ 비즈니스 로직이란 업무에 필요한 데이터처리를 수행하는 응용프로그램의 일부를 말한다. 데이터 입력, 수정, 조회 및 보고서 처리 등을 수행
AOP를 애플리케이션에 적용해서 다음과 같은 이점을 누릴 수 있다.
코드의 간결성 유지
객체 지향 설계 원칙에 맞는 코드 구현
코드의 재사용
트랜잭션(Transaction)이란 ‘데이터를 처리하는 하나의 작업 단위
PSA(Portable Service Abstraction)
클라이언트가 추상화 된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것이 바로 일관된 서비스 추상화(PSA)의 기본 개념이다.
애플리케이션에서 특정 서비스를 이용할 때, 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA(일관된 서비스 추상화)라고 한다.
PSA가 필요한 주된 이유는 어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지함으로써 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위함이다.