공부해봅시당
[쉽게 배우자! Spring Triangle 3] PSA에 대해서 쉽게 이해해보자 본문
Spring은 Spring Triangle이라고 부르는 핵심 3대요소를 제공해준다
이는 각각 IoC, AOP, PSA를 일컫는다
오늘은 PSA에 대해 알아보자
PSA(Portable Service Abstraction)을 [비디오 게임 콘솔]이라는 비유로 이해해보자
각 게임마다 전용 게임기가 필요한 경우: PSA가 적용되지 않은 경우
각 게임마다 전용 게임기가 필요하다면 다양한 게임을 즐기고 싶을 때, 방은 게임기로 가득 차게 될 것이다
PlayStation용 게임, Xbox용 게임, Nintendo Switch용 게임 등을 하려면, 각각의 게임기를 구매하고 설정해야 한다
이렇게 되면 비용도 많이 들고, 각기 다른 게임기를 배우고 관리해야 하는 번거로움도 있다
하나의 게임 콘솔에서 모든 종류의 게임을 플레이할 수 있는 경우: PSA가 적용된 경우
이제 여기에 "마법의 비디오 게임 콘솔"이 등장한다고 상상해 보자
이 콘솔은 모든 종류의 게임을 단 하나의 콘솔에서 플레이할 수 있게 해주는 놀라운 기능이 있다
PlayStation 게임이든, Xbox 게임이든, Nintendo Switch 게임이든 상관없이, 이 마법의 콘솔 하나로 모두 즐길 수 있다
게임을 선택할 때, 다양한 게임기에 대해 걱정할 필요가 없으며, 게임 플레이에만 집중할 수 있다
정리하면
각 게임마다 전용 게임기가 필요한 경우는 비용 문제와 관리 문제가 있었고,
하나의 게임 콘솔에서 모든 종류의 게임을 플레이할 수 있는 경우는 게임 플레이에만 집중할 수 있었다
PSA는 바로 이 "마법의 비디오 게임 콘솔"과 같은 역할을 한다
개발자가 다양한 기술이나 서비스를 사용할 때 각각의 기술마다 다른 방법을 배우고 적용해야 하는 대신,
스프링 프레임워크가 제공하는 PSA를 통해 일관된 방식으로 이를 다룰 수 있다
예를 들어, 데이터를 다루는 방법, 웹 애플리케이션을 만드는 방법, 보안을 관리하는 방법 등을
스프링이 제공하는 추상화된 방식을 통해 쉽게 접근하고 사용할 수 있게 된다
이로 인해 개발자는 새로운 기술을 빠르게 배우고 적용할 수 있으며,
기술의 복잡성에 대해 걱정할 필요 없이 자신의 애플리케이션 개발에 더 집중할 수 있다
PSA를 개발자스럽게 다시 설명하면?
PSA란 환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하는 추상화 구조를 말함
이는 POJO 원칙을 철저히 따른 Spring의 기능으로
Spring에서 동작할 수 있는 Library들은 POJO원칙을 지키게끔
PSA형태의 추상화가 되어있음을 의미
"잘 만든 인터페이스 하나가 열 클래스 부럽지 않다"
PSA = 잘 만든 인터페이스
PSA가 적용된 코드라면 나의 코드가 바뀌지 않고,
다른 기술로 간편하게 바꿀 수 있도록 확장성이 좋고,
기술에 특화되어 있지 않는 코드를 의미
Spring은 Spring Web MVC, Spring Transaction, Spring Cache 등의 다양한 PSA를 제공함
PSA (Portable Service Abstraction)
스프링 프레임워크의 핵심 개념 중 하나로, 개발자가 다양한 기술과 서비스를 일관된 방식으로 사용할 수 있게 해주는 추상화 계층을 의미합니다. 이 추상화를 통해, 개발자는 특정 기술의 구현 세부 사항에 대해 걱정하지 않고도, 애플리케이션 로직에 집중할 수 있습니다. 스프링 프레임워크는 이러한 개념을 여러 스프링 프로젝트와 모듈을 통해 구현하고 있습니다.
PSA의 목적
기술의 복잡성 감소
개발자가 다양한 기술을 사용할 때 발생할 수 있는 복잡성을 줄여줌
휴대성 및 교체 가능성
애플리케이션 로직을 변경하지 않고도, 기술 구현을 쉽게 교체할 수 있게 해줌
예를 들어, 데이터 액세스 기술이나 메시징 시스템을 바꿔야 할 때 유용
일관된 프로그래밍 모델 제공
다양한 서비스와 기술에 대해 일관된 방식의 접근을 제공함으로써, 학습 곡선을 낮추고 개발 효율성을 높일 수 있음
PSA의 예시
Spring Web MVC
웹 애플리케이션 개발을 위한 모델-뷰-컨트롤러(MVC) 프레임워크
이는 서블릿 API 위에 구축된 추상화를 제공하여, 개발자가 웹 애플리케이션을 더 쉽게 개발할 수 있도록 도움을 줌
Spring Data
다양한 데이터 저장소 기술(JPA, MongoDB, Redis 등)에 대한 일관된 데이터 액세스 방식을 제공
개발자는 Spring Data의 추상화를 사용하여, 구체적인 데이터 저장소 기술을 쉽게 교체할 수 있음
Spring Security
보안과 관련된 다양한 기능(인증, 권한 부여 등)을 추상화하여 제공
이를 통해 개발자는 애플리케이션의 보안 요구 사항을 쉽게 구현할 수 있음
Spring Transaction Management
선언적 트랜잭션 관리를 통해, 코드 기반의 트랜잭션 관리 대신 애너테이션이나 XML 구성을 사용하여 트랜잭션을 관리할 수 있도록 함
이는 다양한 트랜잭션 관리 API(JTA, JDBC, Hibernate 등)에 대한 추상화를 제공
PSA의 장점
유연성
PSA를 통해 개발된 애플리케이션은 특정 기술에 대한 의존성이 낮아져, 기술 스택의 변화에 유연하게 대응할 수 있음
효율성
일관된 접근 방식을 통해 개발자는 새로운 기술을 더 빠르게 배우고, 애플리케이션 개발에 있어 생산성을 높일 수 있음
유지보수성
기술 구현의 세부 사항이 추상화 뒤에 숨겨져 있기 때문에, 애플리케이션의 유지보수가 용이해짐
PSA의 단점
성능 오버헤드
PSA 사용 시 추가적인 추상화 계층으로 인해 성능이 약간 저하될 수 있음
유연성 제한
추상화된 인터페이스는 때때로 기술의 고유 기능을 완전히 활용하지 못할 수 있음
학습 곡선
PSA 및 스프링 프레임워크 자체의 추상화 원리와 작동 방식을 학습해야 함
오버 엔지니어링 위험
간단한 요구 사항에 대해 과도하게 복잡한 솔루션을 도입할 위험이 있음
디버깅 어려움
추상화된 계층 때문에 문제를 진단하고 디버깅하는 것이 더 어려울 수 있음
코드로 확인해보자
스프링 프레임워크에서 자주 사용되는 PSA 중 하나는 스프링의 트랜잭션 관리
먼저 PSA를 적용하지 않았을 때의 상황을 살펴본 후, PSA를 적용한 상황을 통해 PSA의 이점을 확인해보자
JDBC를 사용한 수동 트랜잭션 관리: PSA가 적용되지 않은 경우
스프링의 @Transactional 어노테이션을 사용하지 않고, JDBC를 직접 사용하여 트랜잭션을 관리하는 방법
스프링의 추상화 없이 Java의 JDBC API를 사용하여 데이터베이스 연결, 트랜잭션 시작, 커밋 및 롤백을 직접 처리
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class MyJdbcService {
public void performDatabaseOperation() {
Connection conn = null;
try {
// 데이터베이스 연결
conn = DriverManager.getConnection("jdbc:yourdb://localhost/yourdb", "username", "password");
// 트랜잭션 시작
conn.setAutoCommit(false);
// 데이터베이스 작업 수행 (예: 삽입)
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO your_table (column1, column2) VALUES (?, ?)");
pstmt.setString(1, "value1");
pstmt.setString(2, "value2");
pstmt.executeUpdate();
// 추가 작업 수행...
// 트랜잭션 커밋
conn.commit();
} catch (SQLException e) {
// 오류 발생 시 트랜잭션 롤백
if (conn != null) {
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
// 자원 정리
if (conn != null) {
try {
conn.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
}
이 코드에서는 스프링의 @Transactional 어노테이션을 사용하는 대신,
JDBC API를 직접 사용하여 데이터베이스 연결을 열고, 트랜잭션을 시작하며,
SQL 쿼리를 실행하고, 성공 시 커밋하거나 실패 시 롤백하는 과정을 모두 수동으로 처리하고 있음
따라서 아래 2가지 문제가 발생함
1. 복잡성
개발자는 데이터베이스 연결 관리, 트랜잭션의 명시적 시작과 종료, 예외 처리 및 자원 정리 등의 복잡한 작업을 직접 처리해야 함
2. 기술 의존성
이 코드는 JDBC API에 직접 의존하고 있으며, 다른 데이터베이스 액세스 기술로 전환하고자 할 때 코드를 크게 변경해야 함
PSA를 사용하는 스프링의 접근 방식과 비교했을 때,
직접적인 접근 방식은 더 많은 세부 관리가 필요하며, 기술에 대한 의존도가 높아짐
PSA는 이러한 복잡성을 추상화하여 개발자가 보다 쉽고 일관된 방식으로 다양한 기술을 사용할 수 있도록 도와줌
선언적 트랜잭션 관리: PSA가 적용된 경우
스프링 트랜잭션 관리는 다양한 트랜잭션 관리 API (JDBC, JPA, Hibernate 등) 위에 위치한 추상화 계층을 제공하여,
개발자가 특정 기술에 종속되지 않고 선언적 트랜잭션 관리를 할 수 있게 해줌
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class MyService {
private final MyRepository repository;
public MyService(MyRepository repository) {
this.repository = repository;
}
@Transactional
public void performServiceOperation() {
// 여기서 수행하는 모든 데이터베이스 작업은 단일 트랜잭션으로 관리됩니다.
repository.save(new Entity());
// 추가 로직...
}
}
이 코드에서 @Transactional 어노테이션은 메소드가 트랜잭션 범위 내에서 실행되어야 함을 스프링에게 알려줌
스프링은 이 어노테이션을 보고, 해당 메소드를 실행할 때 트랜잭션을 시작하고,
메소드 실행이 성공적으로 완료되면 트랜잭션을 커밋하며, 예외가 발생하면 롤백함
이러한 방식으로, 개발자는 데이터베이스 작업을 수행하는 코드를 작성할 때 트랜잭션 관리의 복잡한 세부 사항을 신경 쓸 필요 없이,
비즈니스 로직에만 집중할 수 있음
또한, @Transactional 어노테이션을 사용하는 것만으로도
다양한 종류의 데이터베이스 기술(JDBC, JPA 등)에 대해 동일한 방식으로 트랜잭션을 관리할 수 있게 되므로,
PSA의 장점인 기술의 휴대성과 교체 가능성을 실제로 경험할 수 있음
개발자가 기술의 복잡성으로부터 추상화되어 일관된 방식으로 기술을 사용할 수 있게 해주는 방법을 확인할 수 있음
참조
https://dev-coco.tistory.com/83
[Spring] PSA(Portable Service Abstraction)란?
Spring은 Spring Triangle이라고 부르는 핵심 3대요소를 제공해준다. 이는 각각 IoC , AOP , PSA를 일컫는다. [Spring] POJO(Plain Old Java Object)란? [Spring] IoC 컨테이너 (Inversion of Control) 란? [Spring] 스프링 빈을 등
dev-coco.tistory.com