1. PSA(Portable Service Abstraction)

 1) Pablo Picasso 의 추상화 기법

  • 파블로 피카소의 작품 'The Bull is a series of eleven lithographs created' 이다
  • 다국적 기업인 Apple의 업무 프로세스에 기본이 되는 그림이기도 하다
  • 황소의 특성을 살려 본질만을 남기려 한 작품이다

  • 객체지향 프로그램밍에서는 클래스의 본질적인 특성만을 추출해서 일반화하는 작업을 추상화(Abstraction)라고 한다
  • Java에서 추상화를 표현할 수 있는 방법에는 추상 클래스와 인터페이스가 있다

 2) 일반화(추상화)의 예

  • 어린 아이의 특성을 일반화하여 코드로 작성해 보면 아래와 같다

  • 위의 추상 클래스에 구체적인 메서드를 작성해 본다

  • Child 클래스를 실행시켜 본다

  • 클라이언트(ChildManageApplication 클래스의 main() 메서드)는
  • NewBornBaby, Infant, Toddler 를 사용할 때 구체화 클래스의 객체를 자신의 타입에 할당하지 않고, (1) ~ (3)과 같이 Child 클래스 변수에 할당을 해서 접근을 한다
  • 클라이언트는 Child라는 추상클래스만 찾아서 하위의 기능 클래스를 사용할 수 있다
  • 클라이언트가 추상황 된 상위클래스만을 일관되게 바라보며 하위 클래스의 기능을 사용할 수 있는 것이 일관된 서비스 추상화이며, PSA의 기본 개념이다

서버를 이용하는 클라이언트 외에 코드 내에서 어떤 클래스의 기능을 사용하는 측을 클라이언트라고 부른다

 

2. 서비스에 적용하는 일관된 서비스 추상화 (PSA)기법

  • 서비스 추상화는 추상화의 개념을 애플리케이션에 자용하는 서비스에 적용하는 기법이다

  • DbClient에서 어떤 JdbcConnector 구현체를 사용하더라도 Connection을 얻는 방식은 getConnection() 메서드를 사용해야 하기 때문에 동일하다
    - 일관된 방식으로 서비스의 기능을 사용할 수 있다
  • 애플리케이션에서 특정 서비스를 이용할 때, 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA(일관된 서비스 추상화)라고 한다

 1) PSA(일관된 서비스 추상화) 코드 예제

  • DbClient 클래스의 (1)에서 SQLiteJdbcConnector 구현체의 객체를 생성해서 JdbcConnector 인터페이스 타입의 변수에 할당(업캐스팅)하고 있다
  • DbClient 클래스의 (2)에서 실제로 데이터를 데이터베이스에 저장하는 기능을 하는 DataProcessor 클래스의 생성자로 JdbcConnector 객체를 전달하고 있다(의존성 주입).

  • 상기와 같이 작성 후 실행을 시키면 error가 발생한다

  • JdbcConnector 메서드에 아래 코드를 삽입시켜 부면 해결된다
import java.sql.Connection;
  • 에러없이 실행된다

  • 다른 애플리케이션에서 SQLite 데이터베이스를 사용하는 것이 아니라 Oracle 데이터베이스를 사용해야 한다면, JdbcConnector 서비스 모듈을 그대로 가져와서 (1)의 new SQLiteJdbcConnector()를 new OracleJdbcConnector()로 바꿔서 사용하면 된다

3. PSA 필요성

  • 어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지하여 애플리케이션에서 사용하는 기술의 변경 시 최소 작업을 통해 변경 사항을 반영한다
  • PSA를 통해서 애플리케이션의 요구 사항 변경에 유연하게 대처할 수 있다
  • PSA는 트랜잭션 서비스, 메일 서비스, Spring Data 서비스 등에 적용된다

'Spring Framework' 카테고리의 다른 글

Spring Framework - Architecture  (0) 2022.06.26
Spring Framework - AOP  (0) 2022.06.22
Spring Framework - DI - Spring Container  (0) 2022.06.19
Spring Framework - IoC / DI - 기초  (0) 2022.06.17
Spring Framework 특징  (0) 2022.06.15

+ Recent posts