Java 및 Aurora DSQL을 사용한 서버리스 애플리케이션 - 파트 5: identity columns 및 sequence objects 지원 추가
Source: Dev.to
Introduction
최근 AWS는 Aurora DSQL에서 identity columns와 sequence objects에 대한 지원을 추가했습니다. 이를 통해 개발자는 익숙한 SQL 패턴을 사용하여 데이터베이스에서 자동 증가형 정수 기반 ID를 직접 생성할 수 있습니다.
많은 워크로드에서 짧은 숫자 ID가 UUID(시간 순서가 지정된 UUIDv7조차도)보다 선호됩니다. 숫자 ID는 구두로 전달하기가 더 쉽고(예: 주문 번호) 36자 문자열 형태의 UUID보다 더 컴팩트합니다.
이 새로운 기능은 기존 PostgreSQL 애플리케이션의 마이그레이션을 간소화하고 데이터베이스에서 관리되는 정수 식별자를 사용하는 새로운 워크로드를 지원합니다. 이제 개발자는 애플리케이션 코드나 미들웨어에 커스텀 ID 생성 로직을 구현하지 않고도 주문 번호, 계정 ID, 운영 레퍼런스와 같은 컴팩트하고 사람이 읽기 쉬운 ID를 생성할 수 있습니다.
Aurora DSQL에서 identity columns와 sequence objects에 대한 지원은 Aurora DSQL이 제공되는 모든 리전에서 사용할 수 있습니다. 자세한 내용은 sequences와 identity columns에 대한 Aurora DSQL 문서를 참조하세요.
샘플 애플리케이션에서 시퀀스 사용하기
아래는 Aurora DSQL과 함께 PostgreSQL 시퀀스(product_id)를 사용하는 방법을 보여주는 두 개의 최소 Java 25 예제입니다. 두 애플리케이션 모두 배포에 AWS SAM을 사용하고 연결 풀링에 HikariCP를 사용합니다.
시퀀스 생성
CREATE SEQUENCE product_id CACHE 1;
1️⃣ 순수 JDBC 예제 (프레임워크 없음)
이 예제는 순수 JDBC를 사용합니다(Sprint, Hibernate 없음). 제품 ID는 product_id 시퀀스에서 다음 값을 선택하여 생성됩니다.
public int createProduct(Product product) throws Exception {
try (var pst1 = this.generateProductId(con);
var rs = pst1.executeQuery()) {
if (rs.next()) {
var id = rs.getInt("nextval");
// assign id to product, insert product row, etc.
}
// ...
}
}
private PreparedStatement generateProductId(Connection con) throws SQLException {
return con.prepareStatement("SELECT nextval('product_id')");
}
2️⃣ Hibernate ORM 예제
이 버전에서는 엔티티가 JPA 어노테이션으로 매핑되어 동일한 product_id 시퀀스를 사용합니다.
@Entity
@Table(name = "products")
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@SequenceGenerator(sequenceName = "product_id", allocationSize = 1)
private int id;
// other fields, getters, setters...
}
DAO는 SessionFactory를 사용하여 Product 엔티티를 영속화하고 조회합니다:
public class ProductDao {
private static final SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
public int createProduct(Product product) throws Exception {
var session = sessionFactory.openSession();
var transaction = session.beginTransaction();
session.persist(product);
transaction.commit();
return product.getId();
}
public Optional getProductById(int id) throws Exception {
var session = sessionFactory.openSession();
return Optional.ofNullable(session.find(Product.class, id));
}
}
다음 단계
- 이 시리즈의 이전 파트에서 제공된 샘플 애플리케이션을 업데이트하여 시퀀스 지원을 포함합니다.
- Java 런타임(관리형)과 GraalVM 네이티브 이미지로 실행되는 Lambda 함수의 성능을 벤치마크합니다.
- 결과를 원래 DynamoDB 기반 예제와 비교합니다.