본문 바로가기
Develop/Spring˙Spring Boot

Spring Triangle - POJO, IoC, AOP, PSA

by 독서왕뼝아리 2023. 9. 6.

POJO

Plain Old Java Object

오래된 방식의 자바 오브젝트

 

클래스나 인터페이스를 상속 받지 않고, 메소드가 추가된 클래스가 아닌 getter, setter 같은 기본적인 기능만 가진 자바 객체를 말한다.

우리는 사람들이 자기네 시스템에 보통의 객체를 사용하는 것을 왜 그렇게 반대하는지 궁금하였는데,
간단한 객체는 폼 나는 명칭이 없기 때문에 그랬던 것이라고 결론지었다.
그래서
적당한 이름을 하나 만들어 붙였더니, 아글쎄, 다들 좋아하더라고.

- 마틴 파울러

그렇다고 합니다... POJO는 엄청난 개념이 아니라 적당한 명칭 정도로만 이해하면 됩니다.

 

 

IoC

제어의 역전 Inversion of Control

 

제어의 역전이 뭐임!

사실 제어의 역전은 스프링만의 특징이 아니다. 프레임워크의 흔한 특징이이다

 

뭘 역전한다는 건데?

가장 일반적인 의미로 사용자의 인터페이스를 제어한다. (’이름을 입력하세요’ 같은!)

 

프로그래머가 객체 생성주기를 제어하는 것이 아니라

프레임워크, 컨테이너에서 제어를 수행하는 것을 의미한다.

→ 모듈 간 느슨한 결합, 다양한 컨트롤 가능, 유지보수 용이!

 

너무 추상적이어서 혼란을 빚잖아!

그래서 나온 게 DI❗

IoC는 디자인 패턴, DI는 구현 방법!

 

 

DI

의존성 주입 Dependency Injection

(추후 따로 다룰 예정)

 

 

AOP

관점 지향 프로그래밍 Aspect Oriented Programming

프로그래밍 패러다임으로 공통 관심사를 분리하여 모듈화를 이끌어 내는 것

 

 

관통 된다니! OOP와 충돌하는 개념 아닌가요?

아닙니다

오히려 AOP는 OOP를 발전시키는 개념입니다!!!!!

 

OOP는 Core concern를 모듈화, AOP는 Crosscut Concern을 모듈화 하는 패러다임

aspect는 트랜잭션 관리 같은 각 객체를 공통 관심을 모듈화

 

 

간단한 예시

메소드 수행시간을 측정하고 싶다 → 로직에 처음과 마지막에 시간을 측정하기 위한 코드 삽입하자 → 하지만 메소드가 100,000 개라면??????

⇒ 수행 시간을 측정하는 Aspect로 관리하라

 

⭐ AOP 용어 정리
Aspect : AOP의 기본 모듈(한 개 이상의 Pointcut과 Advice로 조합)
Join Point : 애플리케이션 실행 흐름의 특정 포인트 (클래스 초기화, 메소드 호출 등), AOP를 적용할 수 있는 모든 지점
Advice : 특정 Join Point에서 가져온 부가기능, aspect를 언제 적용할 것인지 정의 (around, before, after 등)
Pointcut : Advice를 적용할 Join Point를 선별하는 기능, AspectJ 표현식으로 지정됨
Target : 부가 기능 부여 대상, Advice를 받는 객체
Weaving : Pointcut에 의해 결정된 타겟에 Adivce를 삽입하는 과정

*Advisor : 스프링에서만 사용하는 용어, 하나의 Advice와 하나의 Pointcut으로 구성된 Aspect

Spring에서 AspectJ, @Aspect 기능으로 AOP 프로그래밍을 지원한다

Spring에서 쉽게 AOP 패러다임을 찾아보자 → @Transactional

 

 

PSA

서비스 추상화 Portable Service Abstraction

추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것

 

추상화 개념에 portable은 무슨 의미일까요?

Spring PSA 개념으로 추상화 되어 있기 때문이다. 구현 로직을 수정하지 않고 서비스를 변경할 수 있다!

덕분에 코드는 견고해지고 유연하게 대처 가능하게 된다

 

Transactional을 예시로 살펴봅시다

DB에 접근할 때 트랜잭션을 수행해야 함

프로그래밍 언어가 Low level로 내려갈수록 commit, rollback 등의 연산을 “직접” 처리해 주어야 함

 

개발자가 직접 처리하나요?

아니죠 프레임워크가 해줍니다

 

JDBC를 썼다가 ORM으로 바꿀 건데 로직을 고쳐야 되나요?

스프링은 PSA 특성이 있기 때문에 로직을 고칠 필요가 없습니다!!!!!

 

Mysql을 쓰든 Oracle을 쓰든 JDBC로 직접 접근하거나 ORM을 써도 어떤 경우라도!!!!!!!!!

@Transactional 사용 가능하게 만들어 주는 것!!!

PSA로 AOP를 구현했다고 보면 됩니다

 

@Transactional은 PlatformTransactionManager에

TransactionManager를 DI 받아서 사용된다고 보면 된다!

 

 

 

PlatformTransactionManager 인터페이스 하위로 다양한 TransactionManager가 구현되어 있음

이 외에도 Tomcat과 Netty 의존성만 변경해서 사용 가능

혹은......... 직접 구현해도 됨