개발자 취업준비/springboot

PSA(이식 가능한 서비스 추상화)

naspeciallist 2025. 1. 21. 21:43


이 글은 스프링부트3 백엔드 개발자 되기 책을 바탕으로 공부한 내용을 정리한 게시글 입니다.

 

Spring을 이해하는데 있어서 가장 중요한 3가지 핵심특징을 뽑으라고 하면 IoC/DI, AOP, PSA를 뽑을 수 있습니다.

 

Spring 프레임워크는 애플리케이션을 구성하는 틀을 제공해 줄 뿐만 아니라 애플리케이션 코드를 어떻게 작성해야 하는지 에 대한 기준도 제공해 주는데 이를 일반적으로 프로그래밍 모델이라고 부르며 Spring에서는 3가지 핵심 프로그래밍 모델을 지원하며 이에 맞춰 개발할 것을 권장하고 있습니다.

이 3가지 프로그래밍 모델 중에 이번글에서는 서비스 추상화(PSA)에 대해서 알아 보겠습니다.

 

1. PSA (Portable Service Abstraction)란?

 스프링 프레임워크의 핵심 개념 중 하나로, PSA 는 특정 기술이나 환경에 의존하지 않고 다양한 서비스에 대해 일관된 추상화를 제공하는 기능입니다. 이를 통해 개발자는 구체적인 기술이나 구현 세부사항에 얽매이지 않고 애플리케이션을 설계하고 개발할 수 있습니다.

 예를 들어 MyBatis나 JPA 등 세부 기술에 종속적인 에러들을 추상화하여 기술에 종속적이지 않은 에러들로 처리할 수 있도록 도와줍니다.

스프링을 자세히 공부하다 보면 추상화를 위해 프록시(Proxy) 패턴과 같은 디자인 패턴이 매우 자주 사용됨을 파악할 수 있습니다.

 

출처: https://mangkyu.tistory.com/156 [MangKyu's Diary:티스토리]

 

2. PSA의 목적

  1. 플랫폼 독립성 보장
    스프링은 특정 플랫폼이나 기술에 종속되지 않도록 설계되었습니다. PSA는 다양한 기술 스택을 유연하게 선택할 수 있도록 돕습니다.
  2. 기술 교체 용이성
    PSA를 통해 구현된 코드는 특정 기술에 의존하지 않기 때문에, 필요에 따라 기술 스택을 교체해도 코드의 변화가 최소화됩니다.
  3. 추상화와 단순화
    PSA는 복잡한 기술 스펙이나 API를 숨기고 일관된 인터페이스를 제공합니다. 이는 개발자의 생산성을 높이고 유지보수를 간편하게 만듭니다.

 

3. 스프링에서의 PSA 예시

 

1. 데이터 액세스 추상화 (DAO)
스프링의 JdbcTemplate은 복잡한 JDBC 코드를 사용하지 않아도 데이터베이스 작업을 쉽게 처리할 수 있게 도와줍니다.

@Repository
public class UserRepository {
    private final JdbcTemplate jdbcTemplate;

    public UserRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public List<User> findAll() {
        return jdbcTemplate.query("SELECT * FROM users", 
                                  new BeanPropertyRowMapper<>(User.class));
    }
}

 

2. 트랜잭션 관리
스프링은 트랜잭션 관리 방법 (JDBC, JPA, Hibernate 등)을 일관된 방식으로 제공해줍니다. 이렇게 하면 간단한 어노테이션만으로 트랜잭션을 설정할 수 있습니다.

@Service
public class UserService {
    private final UserRepository userRepository;

    @Transactional
    public void createUser(User user) {
        userRepository.save(user); // 트랜잭션이 자동으로 관리됩니다.
    }
}

 

3. AOP (Aspect-Oriented Programming)
스프링은 횡단 관심사(로깅, 성능측정 등)를 추상화해 핵심 비즈니스 로직과 분리합니다.

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example..*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Method called: " + joinPoint.getSignature());
    }
}

 

4. 메시징 및 이벤트 처리
RabbitMQ, Kafka 같은 메시징 시스템도 스프링에서 쉽게 사용할 수 있습니다.

@Component
public class MessageListener {

    @RabbitListener(queues = "exampleQueue")
    public void handleMessage(String message) {
        System.out.println("Received message: " + message);
    }
}

 

5. Web과 Servlet 추상화
스프링 MVC는 Servlet API를 직접 다루지 않아도 쉽게 웹 애플리케이션을 개발할 수 있게 합니다.

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(Model model) {
        model.addAttribute("message", "Welcome to Spring!");
        return "home"; // home.html로 반환
    }
}

 

PSA는 스프링의 핵심 기능으로 특정 기술에 의존하지 않고도 일관된 방식으로 다양한 기능을 사용 할 수 있게 도와주는 추상화 도구 입니다. 이를 이용하면 개발자들은 복잡한 작업을 간단하게 처리할  수 있도록 기술 세부사항을 숨기고, 핵심로직에만 집중 할 수 있습니다. 기술 변경 시에도 코드 수정이 최소화 되며 이 덕분에 유지보수성과 생산성이 크게 향상됩니다.