IoC/DI, AOP, PSA

5w31892p·2022년 12월 22일
0

Spring

목록 보기
8/30

:: OOP(Object Oriented Programing) - 객체지향 프로그래밍

캡! 상추다

  1. 캡슐화 - 정보은닉
  2. 상속
  3. 추상화
  4. 다형성

:: 스프링 삼각형

  • 스프링을 지배하는 근원적인 요소
  • 스프링의 3대 특징
  • IcO/DI, AOP, PSA
  • POJO에 세가지 유형의 진동을 줌으로써 거대한 프레임 완성

IoC/DI
의존 역전/의존성 주입은 @Autowired나 XML 설정을 통해서 강합 결합을 느슨한 결합으로 변경해주며, 코드를 유연하게 해준다.

AOP
관점 지향 프로그래밍으로서 공통된 로직을 추출하여 메소드의 다양한 시점에 실행할 수 있게 해줄수 있으며, 코드를 줄여주고, 개발자가 공통 로직을 배제하고 핵심 관심사에 집중할 수 있도록 해준다.

PSA
Portable Service Abstraction으로 일관성 있는 서비스 추상화이다.
서비스 추상화의 대표적인 예를 JDBC로 들수 있으며, 어떠한 데이터 베이스를 사용하더라도 일관성있는 방식으로 제어할 수 있도록 공통의 인터페이스를 제공하는 것이 서비스 추상화라고 한다.

:: IoC / DI

:: DI (Dependency Injection)

  • 의존성 주입
  • 객체를 직접 생성하는 것이 아닌 외부에서 생성 후 주입 시켜주는 방식
  • 모듈간의 결합도 낮아지고, 유연성이 높아짐

Spring에서는 객체Bean이라고 부르는데,
프로젝트 실행될 때 사용자가 Bean으로 관리하는 객체들의 생성과 소멸에 관련된 작업을
자동적으로 수행해주는데 객체가 생성되는 곳Bean컨테이너라고 부름

:: IoC (Inversion of Control)

  • 제어의 역전
  • 말 그대로 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아닌 외부에서 결정되는 것을 의미
  • 객체의 의존성 역전시켜 객체 간의 결합도 줄이고 유연한 코드 작성할 수 있게 함
  • 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있음
  • 스프링이 모든 의존성 객체를 스프링이 실행될 때마다 만들어주고 필요한 곳에 주입
  • Bean들은 싱글턴 패턴의 특징을 가짐
  • 제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에서 맡겨 작업을 처리

스프링 객체 만들어지고 실행되는 순서

  1. 객체 생성
  2. 의존성 객체 주입
    (스스로가 만드는 것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입)
  3. 의존성 객체 메소드 호출
기존 객체 만들어지고 실행되는 순서

1. 객체 생성
2. 의존성 객체 생성 (내부 클래스에서 생성)
3. 의존성 객체 메소드 호출

::AOP (Aspect Oriented Programming)

  • 관점 지향 프로그래밍
  • OOP로 독립적으로 분리하기 어려운 부가 기능을 모듈화하는 방식
  • 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나눠보고 그 관점 기준으로 각각 모듈화 하겠다는 것
  • 모듈화 -> 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것
  • 각 다른 부분에서 반복해서 쓰는 코드 -> 흩어진 관심사(Crosscutting Concerns)
  • 흩어진 관심사를 Aspect로 모듈화 후 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP 취지

:: AOP 주요 개념

  • Aspect : 흩어진 관심사 모듈화, 주로 부가기능 모듈화
  • Target : Aspect 적용 (class, method...)
  • Advice : 실제 어떤 일을 해야할지에 대한 것, 실질적인 부가기능 담은 구현체
  • JointPoint : Advice 적용될 위치, 끼어들 수 있는 지점. 메서디 진입 지점, 생성자 호출 지점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용 가능
  • PointCut : JointPoint의 상세한 스펙 정의, 구체적으로 Advice가 실행될 지점을 정할 수 있음

:: 스프링 AOP 특징

  • 프록시 패턴 기반의 AOP 구현체
  • 프록시 객체 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서
  • 스프링 Bean에만 AOP 적용
  • 모든 AOP 기능 제공 X
  • IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제 (중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가..)에 대한 해결책 지원 하는 것이 목적

:: PSA (Portable Service Abstraction)

Portable- 휴대용 
JDBC Driver 의 종류를 비즈니스 로직의 수정없이 언제든지 변경할 수 있는 것
  
Service Abstraction- 서비스 추상화
특정 서비스가 추상화되어있다는 것은 서비스의 내용을 모르더라도 해당 서비스를 이용할 수 있다는 것
  • 잘 만든 인터페이스
  • 휴대용 서비스 추상화
  • 확장에는 열려있고 수정에는 닫혀있어야 한다는 OCP 에 대표적인 예시
  • 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것
  • 즉, 추상화 된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것
  • 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것
  • 접근 방식을 일관되게 유지함으로 사용 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항 반영
  • 하나의 추상화로 여러 서비스를 묶어둔 것
  • 애플리케이션의 요구 사항 변경에 유연한 대처 가능
  • POJO 원칙에 따라 잘 만들어진 인터페이스

:: POJO (Plain Old Java Object)

  • 특정 기술에 종속되지 않는 순수한 자바 객체
  • 즉, 다른 클래스나 인터페이스를 상속/implements 받아 메서드가 추가된 클래스가 아닌 일반적으로 우리가 알고 있는 getter, setter 같이 기본적인 기능만 가진 자바 객체

진정한 POJO란?

..(중략)
진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고
필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다.

                                                토비의 스프링

0개의 댓글