[Spring] PSA (Portable Service Abstraction)

2025. 8. 27. 16:46·Spring

PSA (Portable Service Abstraction) 

환경 변화와 무관하게 일관된 기술 접근을 가능하게 하는 추상화 계층이다. Spring의 핵심 철학인 POJO(Plain Old Java Object) 원칙을 따르며, 특정 기술에 종속되지 않는 방식으로 서비스 접근을 제공한다. 즉, 잘 설계된 인터페이스를 중심으로 구현체를 교체할 수 있도록 해준다. 

 

2025.09.16 - [Java] - [Java] POJO(Plain Old Java Object)

PSA의 특징 

  • 일관성 : 코드 변경 없이 다른 기술로 교체 가능 
  • 확장성 : 새로운 기술 도입 시에도 인터페이스 유지 
  • 유지보수성 : 환경 변경에 따른 코드 수정 최소화 
  • 테스트 용이성 : 실제 기술 대신 메모리나 Mock 구현체로 손쉽게 대체

Spring에서 제공하는 대표적인 PSA 

1) Spring Data JPA

Spring Data JPA는 JPA(Java Persistence API)를 사용하여 데이터베이스 접근을 쉽게 할 수 있도록 추상화한 모듈이다. 이는 PSA 개념을 사용하여 다양한 데이터베이스와 ORM 프레임워크에 대해 일관된 인터페이스를 제공한다. 

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

예를 들어, 데이터베이스가 MySQL에서 MariaDB로 변경되더라도, Spring Data JPA를 사용하면 데이터베이스 접근 코드의 변경 없이 동일한 기능을 수행할 수 있다. 데이터베이스 변경 시, 아래와 같이 JPA 설정만 변경하면 된다. 

# MySQL 설정 예시
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db
    username: root
    password: 0000
  jpa:
    hibernate:
      ddl-auto: update

# MariaDB 설정 예시
spring:
  datasource:
    url: jdbc:mariadb://localhost:3306/db
    username: root
    password: 0000
  jpa:
    hibernate:
      ddl-auto: update

 

2) Spring Web MVC

Spring Web MVC를 사용하면 서블릿을 간편하게 개발할 수 있다. 뒤에 Spring이 제공해주는 여러 기능들이 숨겨져 있다. 그래서 우리는 서블릿을 low level로 개발하지 않아도 된다. 개발자는 직접 HttpServlet을 상속받고 `doGet()`, `doPost()` 메서드를 직접 구현하지 않아도 된다. 

 

또한, Spring Web MVC는 코드를 거의 변경하지 않고도 톰캣 외의 다른 서버 환경으로 쉽게 전환할 수 있다. 예를 들어 `spring-boot-starter-web` 의존성 대신 `spring-boot-starter-webflux` 의존성으로 변경하면 톰캣 대신 Netty 기반으로 애플리케이션을 실행할 수 있다. 

// 톰캣 사용
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

// Netty 사용
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'io.projectreactor.netty:reactor-netty'
}

 

3) 트랜잭션 추상화 (Transaction Abstraction) 

low level로 트랜잭션 처리를 하려면 `setAutoCommit()` 과 `commit()`, `rollback()` 을 명시적으로 호출해야 한다. 그러나 Spring이 제공하는 `@Transactional`  어노테이션을 사용하면 단순하게 메서드에 어노테이션을 붙여줌으로써 트랜잭션 처리가 간단하게 이루어진다. 이 또한 PSA로 다양한 기술 스택으로 구현체를 바꿀 수 있다.  기존 코드를 변경하지 않은 채로 트랜잭션을 실제로 처리하는 구현체를 사용 기술에 따라 바꿔 끼울 수 있는 것이다. 

 

구조 

  • 인터페이스 : `PlatformTransactionManager` 
  • 구현체 예 : 
    • `DataSourceTransactionManager` (JDBC 기반) 
    • `JpaTransactionManager` (JPA, Hibernate 기반) 
    • `JtaTransactionManager` (분산 트랜잭션)

 

어떻게 단일 어노테이션으로만 트랜잭션 처리가 가능한 것일까 ?

일단 개발자는 `@Transactional` 어노테이션만 붙인다. 그럼 스프링이 UserService를 대신 실행하는 대신 프록시 객체를 만든다. 이 프록시가 메서드 실행 전/후를 감시하면서 트랜잭션을 시작하거나 끝낸다. 프록시는 내부적으로 `PlatformTransactionManager` 라는 공통 인터페이스를 호출한다. 그리고 그 인터페이스 뒤에는 JDBC, JPA, Hibernate, JTA 등 구현체가 연결돼 있다. 

 

4) 데이터 접근 추상화 (Data Access Abstraction) 

JDBC, JPA, MongoDB, MyBatis 등 데이터 저장소에 접근하는 기술은 다양하다. 그런데 각 기술은 코드 작성 방식이 다 달라서 기술을 배우면 기존 코드를 거의 새로 짜야 한다. Spring은 Repository 인터페이스 계층을 PSA로 제공해서, 개발자는 동일한 메서드 이름과 규칙으로 DB 작업을 수행할 수 있다. 

 

구조 

  • 인터페이스 : `CrudRepository<T, ID>` , `JpaRepository<T, ID>` , `MongoRepository<T, ID>` 
  • 구현체 예 : Hibernate(JPA), MongoDB, Cassandra, Redis 등 

 

5) 캐시 추상화 (Cache Abstraction) 

캐시는 DB나 외부 API 호출을 줄이기 위해 자주 사용되는데, 구현체는 다양하다. 그런데 캐시 기술마다 설정 방식, API 호출 방식이 다 다르다. Spring은 `CacheManager` 라는 추상 인터페이스를 PSA로 제공한다. 개발자는 `@Cacheable` , `@CachePut` , `@CacheEvit` 같은 어노테이션만 사용하면 된다. 

 

구조 

  • 인터페이스 : `CacheManager` 
  • 구현체 예 : JCacheManager, ConcurrentMapCacheManager, EhCacheManager 등 

 

참고 

 

[Spring] Spring의 특징 - PSA (일관된 서비스 추상화)

PSA (Portable Service Abstraction)

velog.io

 

'Spring' 카테고리의 다른 글

[Spring] DTO class를 record로 사용하는 이유  (0) 2025.08.29
[Spring] 연관관계  (0) 2025.08.29
[Spring] @Transactional 개념과 사용  (0) 2025.08.19
[Spring] 프록시(Proxy)  (0) 2025.08.13
[Spring] AOP(Aspect Oriented Programming)  (0) 2025.08.11
'Spring' 카테고리의 다른 글
  • [Spring] DTO class를 record로 사용하는 이유
  • [Spring] 연관관계
  • [Spring] @Transactional 개념과 사용
  • [Spring] 프록시(Proxy)
erika0915
erika0915
백엔드 개발자가 되고 싶어요 .
  • erika0915
    erikoding
    erika0915
  • 전체
    오늘
    어제
    • 분류 전체보기 (78)
      • 프로젝트 (13)
        • 끼니콩 (3)
        • 덕메랑 (3)
        • handDoc (7)
        • Haeil (0)
      • Java (9)
        • 클린코더스 (0)
      • Spring (30)
      • Redis (3)
      • CS (7)
        • 운영체제 (3)
        • 컴퓨터구조 (0)
        • 네트워크 (4)
      • DevOps (2)
      • 코딩테스트 (0)
      • Tech (14)
        • TDD (1)
        • 정리 (5)
        • 우테코 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    깃
    코드레빗
    깃허브
    redis
    promtail
    Spring
    레디스
    파인튜닝
    TDD
    github
    자바
    OS
    CoolSMS
    coderabbit
    MongoDB
    스프링
    운영체제
    스프링부트
    AI
    네트워크
    Network
    STT
    몽고디비
    지라
    도커
    git
    jira
    docker
    java
    springboot
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
erika0915
[Spring] PSA (Portable Service Abstraction)

티스토리툴바