Spring

Spring POJO (Portable Service Abstraction)

sehunbang 2024. 4. 26. 17:29

 

POJO (Plain Old Java Object)

POJO란 Plain Old Java Object의 약자로, 이를 직역하면 순수한 오래된 자바 객체이다.

즉, Java로 생성하는 순수한 객체를 뜻한다.

https://siyoon210.tistory.com/120

 

POJO - (Plain Old Java Object)란 뭘까?

POJO 자바나 스프링 프레임워크를 조금이라도 공부 해본 개발자 (혹은 학생)이라면 POJO 라는 단어를 한번쯤 듣게됩니다. POJO의 정의는 사실 그렇게 어렵지 않습니다. 아래 내용은 위키 백과에 나

siyoon210.tistory.com

 

 

PSA(Portable Service Abstraction) 서비스를 압축하다

Java Spring의 PSA(Portable Service Abstraction)는 여러 서비스를 추상화하고 표준화하는 계층적인 추상화 레이어를 제공하는 핵심 개념입니다.

 

PSA를 사용하면 애플리케이션 개발자는 서비스 구현의 세부 사항을 신경 쓰지 않고도 애플리케이션을 개발할 수 있습니다. 이를 통해 애플리케이션의 유연성과 확장성이 향상되며, 서비스 구현이 변경되더라도 애플리케이션의 수정을 최소화할 수 있습니다.

PSA는 주로 다음과 같은 서비스 추상화를 제공합니다:

 

  1. 데이터 액세스 추상화(Data Access Abstraction): 다양한 데이터베이스 기술을 사용하여 데이터 액세스를 처리할 수 있도록 추상화된 인터페이스를 제공합니다. JDBC, JPA, MongoDB 등의 데이터베이스 기술을 사용할 수 있습니다.
  2. 트랜잭션 추상화(Transaction Abstraction): 다양한 트랜잭션 관리자를 사용하여 트랜잭션을 추상화하고 관리할 수 있습니다. JTA, JDBC 등을 사용할 수 있습니다.
  3. 이메일 추상화(Email Abstraction): 다양한 이메일 서비스를 통합하여 이메일 전송 작업을 추상화합니다. JavaMail, SendGrid, AWS SES 등을 지원합니다.
  4. 원격 서비스 호출 추상화(Remote Service Invocation Abstraction): 다양한 프로토콜과 기술을 사용하여 원격 서비스 호출을 추상화합니다. RMI, HTTP, JMS 등을 지원합니다.

이러한 PSA를 사용하면 애플리케이션은 실제 서비스 구현과 독립적으로 작성될 수 있으며, 서비스 구현의 변경에 유연하게 대응할 수 있습니다. Java Spring의 PSA는 개발자에게 일관된 인터페이스를 제공하여 애플리케이션의 유지 보수성과 테스트 용이성을 향상시킬 수 있는 강력한 기능입니다.

 

 

AOP ( 관점(Aspect)지향 프로그래밍 )

AOP는 관점(Aspect)지향 프로그래밍으로, 관점을 기준으로 다양한 기능을 분리하여 보는 프로그래밍이다. 관점(Aspect)이란, 부가 기능과 그 적용처를 정의하고 합쳐서 모듈로 만든 것이다.

👉 AOP의 목적

OOP 와 이름이 비슷하여 상반된 개념 같지만,

관점지향 프로그래밍은 객체지향 프로그래밍을 보완하기 위해 쓰인다.

 

기존 객체(Object) 지향은 목적에 따라 클래스를 만들고 객체를 만들었다.

따라서 핵심 비즈니스 로직이든, 부가 기능의 로직이든 하나의 객체로 분리하는데 그침,

그래서 이 기능들을 어떻게 바라보고 나눠쓸지에 대한 정의가 부족하다는 단점이 있다.

 

보통 비즈니스 웹 애플리케이션이라면 사업에 핵심적인 핵심 비즈니스 로직이 있고,

애플리케이션 전체를 관통하는 부가 기능 로직이 있다.

이를 횡단 관심사(cross-cutting concerns)라고 한다. (종류는 로깅, 보안, 트랜젝션이 있다.)

https://sehuncodingjournal.tistory.com/50

 

Spring AOP

Spring AOP 란? 스프링 프레임워크에서 제공하는 기능 관점 지향 프로그래밍을 지원하는 기술입니다. 로깅, 보안, 트랜잭션 관리 등과 같은 공통적인 관심사를 모듈화 하여 코드 중복을 줄이고 유

sehuncodingjournal.tistory.com

AOP의 주요 구성 요소

  • Aspect
    • 공통 기능
    • 어드바이스 + 포인트컷을 모듈화한 애플리케이션의 횡단 기능
  • Join Point
    • 애플리케이션 실행 흐름에서의 특정 포인트 (ex. 래스 초기화, 메서드 호출, 예외 발생 등)
    • 한 마디로 AOP를 적용할 수 있는 모든 지점 (스프링에서는 메서드 실행 지점으로 제한)
  • Advice
    • 조인포인트에서 실행되는 코드 즉 부가기능 그 자체
    • 에스팩트를 언제 핵심 코드에 적용할지 정의

Type설명

Before 조인포인트 실행 이전에 실행, 일반적으로 리턴타입 void
After returning 조인포인트 완료후 실행 (ex. 메서드가 예외없이 실행될 때)
After Throwing 메서드가 예외를 던지는 경우 실행
After (finally) 조인포인트의 동작과 관계없이 실행
Around 메서드 호출 전후에 수행(조인포인트 실행 여부 선택, 반환 값 변환, 예외 변환, try~catch~finally 구문 처리 가능 등), 가장 강력한 어드바이스이다.

 

  • Pointcut
    • 조인포인트 중 어드바이스가 적용될 지점을 선별하는 기능
    • 주로 AspectJ 표현식으로 지정
  • Target
    • 핵심 기능을 담은 모듈 (=부가 기능 부여 대상)
    • 어드바이스를 받는 객체이고, 포인트컷으로 결정된다
  • Advisor
    • 스프링 AOP에서만 쓰는 용어로, 하나의 어드바이스와 하나의 포인트컷으로 구성된 에스팩트를 특별하게 지칭하는 말이다

https://velog.io/@kai6666/Spring-Spring-AOP-%EA%B0%9C%EB%85%90

 

[Spring] Spring AOP 개념

AOP는 관점(Aspect)지향 프로그래밍으로, 관점을 기준으로 다양한 기능을 분리하여 보는 프로그래밍이다. 관점(Aspect)이란, 부가 기능과 그 적용처를 정의하고 합쳐서 모듈로 만든 것이다.OOP와 이름

velog.io

 

IOC / DI

느슨한 결합(Loose Coupling)을 촉진하고 코드의 유연성과 테스트 용이성을 향상시키는 데 사용되는 개념입니다.

 

IOC와 DI는 객체 지향 프로그래밍에서 중요한 디자인 패턴으로, 코드의 결합도를 낮추고 유연성을 높이는 데 기여합니다.

 

왜냐하면 이러한 패턴을 통해 개발자는 객체 간의 의존성 관리를 보다 효율적으로 할 수 있기 때문입니다.

 

제어의 역전(IOC)이란?

https://f-lab.kr/insight/understanding-spring-ioc-di?gad_source=1&gclid=Cj0KCQjwir2xBhC_ARIsAMTXk863hmzMnw309C9KoYluSXKWTZEIwnJlvYjDi64UtDfdAnnNrCAPk2gaAschEALw_wcB

 

스프링 프레임워크의 핵심 개념: IOC와 DI 이해하기

스프링 프레임워크의 핵심 개념인 제어의 역전(IOC)과 의존성 주입(DI)에 대해 소개하고, 이 개념들이 왜 중요한지, 스프링이 어떻게 이를 구현하는지에 대해 설명합니다.

f-lab.kr

 

제어의 역전(IOC)은 프로그램의 흐름을 개발자가 아닌 프레임워크가 관리하는 것을 의미합니다. 이는 객체의 생성과 생명주기 관리를 프레임워크가 담당하게 함으로써, 개발자는 비즈니스 로직에 더 집중할 수 있게 됩니다.

 

 

스프링에서는 애플리케이션 컨텍스트(Application Context)가 이러한 역할을 담당합니다. 애플리케이션 컨텍스트는 빈(Bean)이라고 하는 객체들의 생성, 설정, 관리를 담당합니다.

 

장점 : 

코드의 재사용성과 유지보수성을 향상시키며, 개발자가 객체 간의 의존성을 직접 관리하지 않아도 되게 합니다. 그리고 테스트 가 용이해 집니다.

 

유연성: IoC를 사용하면 애플리케이션의 변경이 쉬워집니다. 새로운 기능을 추가하거나 수정할 때 코드 변경을 최소화할 수 있습니다.

 

테스트 용이성: IoC를 통해 의존성을 주입할 수 있기 때문에 테스트가 용이해집니다. 이는 코드를 테스트하고 디버깅하는 데 도움이 됩니다

 

유지보수성: 의존성이 외부에서 주입되기 때문에 코드의 의존성이 명확해지고, 유지보수가 쉬워집니다.

 

단점 :

 

런타임 오류 위험: 잘못된 의존성 주입이 발생할 경우 런타임 오류가 발생할 수 있습니다. 이를 방지하기 위해 정확한 구성이 필요합니다.

 

성능 오버헤드: 프레임워크나 컨테이너의 관리로 인해 일부 성능 오버헤드가 발생할 수 있습니다. 그러나 일반적으로 이는 큰 문제가 되지 않습니다.

 

 

 

DI

객체 간의 의존성외부에서 주입하는 방식을 말합니다. 이는 객체가 필요로 하는 의존 객체를 직접 생성하지 않고, 외부(예: 스프링 컨테이너)에서 생성된 객체를 주입받아 사용합니다.

 

스프링에서는 @Autowired 어노테이션을 통해 의존성 주입을 쉽게 구현할 수 있습니다.

이를 통해 개발자는 객체 간의 결합도를 낮추고, 코드의 유연성을 높일 수 있습니다.

(왜냐하면 DI를 통해 객체는 필요한 의존성만을 제공받으므로, 코드의 변경에 더 유연하게 대응할 수 있기 때문입니다.)

 

DI는 단위 테스트를 용이하게 만듭니다. 왜냐하면 테스트 시에 실제 객체 대신 모의 객체(Mock Object)를 주입할 수 있기 때문입니다.

 

의존성 (Dependency): 한 객체가 다른 객체에 의존하는 관계를 의미합니다. 일반적으로 클래스 A가 클래스 B를 사용할 때, 클래스 A는 클래스 B에 의존하게 됩니다.

의존성 주입 (Dependency Injection): DI는 클래스의 의존성을 외부에서 주입하는 것을 의미합니다. 즉, 객체가 직접 필요한 의존성을 생성하거나 참조하지 않고, 외부에서 이를 제공받습니다. 이를 통해 객체 간의 결합도를 낮추고, 유연성을 높이며 테스트 용이성을 개선할 수 있습니다.

 

DI는 보통 세 가지 방식으로 이루어집니다:

  • 생성자 주입 (Constructor Injection): 의존성을 클래스의 생성자를 통해 주입하는 방식입니다. 객체가 생성될 때 생성자를 통해 의존성을 전달받습니다.
  • 설정 메서드 주입 (Setter Injection): 의존성을 객체의 설정 메서드(setter method)를 통해 주입하는 방식입니다. 객체가 생성된 후에 의존성을 설정합니다.
  • 인터페이스 주입 (Interface Injection): 의존성을 특정 인터페이스를 구현한 클래스로 주입하는 방식입니다. 이 방식은 일반적으로 사용되지 않습니다.