서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA(일관된 서비스 추상화)라고 한다.
PSA는 환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하는 추상화 구조이다.
다시 말해 하나의 추상화로 여러 서비스를 묶어둔 것을 Spring에서 PSA라고 한다.
어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지함으로써 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위함
PSA를 통해서 애플리케이션의 요구 사항 변경에 유연하게 대처할 수 있다.
JDBC Template은 Spring에서 제공하는 JDBC 추상화 라이브러리다. 이를 사용하면, 복잡한 JDBC 코드를 작성하지 않아도 간단하게 DB에 접근할 수 있다.
예를 들어, 데이터베이스에 저장된 모든 사용자 정보를 가져와 출력하는 코드를 작성한다고 가정해보자. JDBC Template을 사용하면 아래와 같이 간단하게 구현할 수 있다.
public List<User> getAllUsers() {
return jdbcTemplate.query(
"SELECT * FROM users",
(rs, rowNum) -> new User(
rs.getLong("id"),
rs.getString("name"),
rs.getString("email")
)
);
}
JPA(Java Persistence API)는 객체 관계 매핑 기술로, 데이터베이스와 객체 지향 프로그래밍 간의 불일치를 해결하기 위한 기술이다. Spring에서는 JPA를 사용하기 위해 Spring Data JPA를 제공한다.
예를 들어, 사용자 정보를 저장하는 User 엔티티 클래스와 UserRepository 인터페이스를 생성하고, 해당 인터페이스를 구현한 클래스를 작성한다고 가정해보자. Spring Data JPA를 사용하면 아래와 같이 간단하게 구현할 수 있다.
public interface UserRepository extends JpaRepository<User, Long> {
}
AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍 기술로, 핵심 로직과 공통 로직을 분리하여 코드의 재사용성과 유지보수성을 높인다. Spring에서는 AOP를 지원하기 위해 Spring AOP를 제공한다.
예를 들어, 사용자 정보를 가져오기 전에 로그를 출력하는 코드를 작성한다고 가정해보자. Spring AOP를 사용하면 아래와 같이 간단하게 구현할 수 있다.
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.UserRepository.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
}
Spring PSA를 사용하면 다양한 기술에 대한 지식 없이도 해당 기술을 쉽게 사용할 수 있다. 이번 포스팅에서는 JDBC Template, JPA, AOP를 예제와 함께 설명하였다. Spring을 사용하는 개발자라면, PSA를 적극적으로 활용하여 개발 생산성을 높이는 것이 좋다.