AWS: DynamoDB Java API

DynamoDB’nin ne olduğuna, özelliklerine ve ücretlendirmesine daha önce şu yazımda değinmiştim. Şimdi ise Java kullanarak DynamoDB ile nasıl haberleşebileceğimize değinmek istiyorum.

DyanmoDB’nin Java API’si hemen hemen her ihtiyacı gidermeye yönelik. Temel de Java API’si diye bir şey yok aslında. DynamoDB tamamen HTTP üzerinden konuşacak şekilde tasarlanmış, zaten kendi dokümantasyonunda da Low Level API olarak bu konuya değinmiş. Çok kritik bir durum olmadıkça kimsenin bu API ile ilgileneceğini sanmıyorum. Bu sebepten ben AWS SDK’sının sağladığı Java API’lerine değineceğim.

Java API’lerine diyorum, çünkü birden fazla Java API’si mevcut.aws

  • Low Level Java API: HTTP isteklerinin bir level üstü gibi düşünebilirsiniz. HTTP talebini doldurmak yerine Request-Response kelimeleri ile biten java nesnelerini doldurup SDK üzerinden gönderiyorsunuz. Sonra gelen veriyi kendiniz Map edip kullanıyorsunuz. Yani JDBC ve JPA kavramlarını metafor olarak kullanacak olursak, Low Level Java API’si JDBC’ye denk geliyor.
  • High Level Java API: JPA ya da ORM tadındaki Java API’si. Veritabanınızı belirten modelinizi DynamoDB özelindeki annotasyonlar ile veritabanınıza map ediyorsunuz. Temel CRUD operasyonlarını kendi sağlıyor. Siz özel sorgular yazmak isterseniz Hibernate’in Criteria API’sine benzer bir API üzerinden taleplerinizi gönderiyorsunuz.

Ben bu yazıda High Level Java API’yı üzerinde duracağım. Eğer uygulamanız çok yüksek TPS değerlerinde çalışmayacaksa, size önerimde bu API’sini kullanmanız. Aksi halde her tablonuz için ayrı Mapper sınıfları yazıp, sorgulama sonuçlarınızı iki de bir dönüştürmeniz ve üzerine bunların bir de testlerini yazmanız gerekiyor. Bir sürü keyifsiz iş. Fakat belirtmeden de geçmeyeyim. High Level Java API’si kullanarak, seçimli yükleme yapamıyoruz. Yani bana sadece seçtiğim kolonları getir diyemiyorsunuz. Eğer tüm satıra ihtiyacınız yoksa bu DynamoDB kullanım maaliyetinizi arttırabilir.

Hazırlık

Projemizi Maven ve Java 8 kullanarak geliştireceğiz. Sırasıyla Maven ayarlarını ve AWS yetkilendirmesini yaptıktan sonra veritabanımızı yaratacağız. Geliştireceğimiz uygulama basit bir kullanıcı servisi olacak. Buna uygun veritabanını yarattıktan sonra uygulamamızı geliştirmeye başlayacağız.

Maven ve Bağımlılıklar

Basit bir konsol uygulaması yazacağımız için istediğiniz archetype’ı kullanabilirsiniz. Ben maven-archetype-quickstart‘ı kullanarak oluşturuyorum. Daha sonrasında projeye aşağıdaki bağımlılığı eklemeniz yeterli olacaktır.

AWS Yetkilendirmesi

Şimdi ise yetkilendirmeyi yapalım. Doğrudan AWS bilgilerinizi kullanarak da servise bağlanabilirsiniz. Fakat hemen hemen hiç bir AWS servisini ana yetkiyle kullanmamanızı öneririm. Kullanacağınız her servis için ayrı kullanıcılar yaratıp yetkilendirmelerini ayrı ayrı yapın. Kısaca DynamoDB için nasıl ayrı bir kullanıcı oluşturacağınızı ve yetkilendireceğinizi anlatacağım. Bu işlemler ek bir ücrete tabi değil ondan gönül rahatlıyla yapabilirsiniz.

  • AWS Console üzerinden IAM (Identity and Access Management) servisine gidin.
  • Sol taraftaki menuden Users’a tıklayın
  • Üst taraftaki mavi butona, Create New Users, tıklayın
  • Beğendiğiniz bir kullanıcı adı girin (dynamodb_bhdrkn).
  • Generate Access Key For Each User seçeneği seçili kalsın, sonrasında Create’e tıklayın.
  • Burada isterseniz Show Credentials diyerek, isterseniz Download Credentials diyerek kullanıcı erişim bilgilerini kaydedin. Bu bilgileri java uygulamasını geliştirirken kullanacağız.
  • Sonrasında, Close’a tıklayın. Bu sizi kullanıcıların listelendiği sayfaya götürecek. Burada biraz beklerseniz, yeni yarattığınız kullanıcıları görebilirsiniz.
  • Kullanıcınıza (dynamodb_bhdrkn) tıklayın. Açılan sayfada Permissions sekmesine gelin ve Attach Policy’e tıklayın.
  • Yeni açılan ekrandaki kutucuğa DynamoDB yazıp filtreleyin. Gelen listeden AmazonDynamoDBFullAccess i seçin ve attach policy’e tıklayın.

AmazonDynamoDBFullAccess üzerinde full yetkiye sahip bir kullanıcı yarattık. Şimdi uygulamamıza geri dönüp Credential bilgilerini uygulamaya ekleyelim. Biz basit ve taşınabilir olması için properties dosyasında okuyacağız. Bunun için src/main/resources altına aws.properties dosyasını yaratıp içerisini aşağıdaki gibi dolduruyorsunuz.

aws.properties

Veritabanının Yaratılması

Son olarak veritabanımızı yaratalım. Bu işlemi uygulama içerisinden de yapmak mümkün fakat uygulama kısmını basitleştirmek adına veritabanını web üzerinden yaratalım. Bunun için aşağıdaki adımları izliyoruz:

  • AWS Console üzerinden DynamoDB servisine gidin.
  • Açılan sayfadan Create Table butonuna tıklıyoruz.
  • Table Name olarak Users giriyoruz.
  • Partition Key olarak username giriyoruz. Eğer partition key neydi, hash key neydi diye hafızanısı tazelemek isterseniz bu yazıdan faydalanabilirsiniz.
  • Use Default Settings seçeneiğini seçili bırakıp tablomuzu yaratıyoruz. Bu seçenek RCU ve WCU değerleri olarak 5’i kullanıyor. Sadece bir tutorial yapacağımız için bu değerler bize fazlasıyla yeter.

Burada dikkatinizi çekmek istediğim diğer bir nokta ise, sadece Partition Key’i belirtmiş olmamız. Bu DynamoDB’nin şemasız bir yapısı olduğundan kaynaklanıyor.

Uygulamanın Geliştirilmesi

Daha öncede belirttiğim gibi basit bir kullanıcı uygulaması yazacağız. Uygulama da değil aslında sadece DAO kısmını yazacağız.

Modelin Geliştirilmesi

Giriş kısmında belirttiğim gibi ORM benzeri High Level Java API kullanacağız. Bu sebepten veritabanımıza karşılık gelen modelimizi yaratalım ve gerekli annotasyonlarını ekleyelim.

Eğer daha önce bir ORM aracı (PA olur Hibernate olur) kullandıysanız, yukarıdaki sınıfın Entity’lere çok benzediğini sadece annotasyonların adlarının değiştiğini göreceksiniz. Fakat daha önce kullanmamış olanlar için, kullandığımız annotasyonlara değinmek istiyorum.

  • @DynamoDBTable(tableName = “Users”): Bu model nesnesinin “Users” isimli veritabanıyla ilişkili olduğunu belirtiyor. Bu annotasyon bulunmazsa DynamoDB hata verecektir.
  • @DynamoDBHashKey(attributeName = “username”): Bu annotasyonu, PartitionKey‘imizi belirtmek için kullanıyoruz. Tahmin edersiniz ki attributeName de veritabanında kullanılacak kolon adına denk geliyor.
  • @DynamoDBAttribute(attributeName = “password”): Bu annotasyonu ise sıradan kolonları belirtmek için kullanıyoruz.

Tabi tüm annotasyonlar bu kadar değil. Tüm annotasyon listesine DynamoDB’nin dokümantasyonundan ulaşabilirsiniz.

DAO Katmanı

Sırada DAO katmanımız var. Arayüz üzerinden başlayacak olursak:

Basit bir arayüzümüz olacak. Amacım temel işlemleri gösterebilecek bir arayüz yazmak. Dikkatinizi çekmek istediğim nokta, Update ve Save gibi iki ayrı işlem yerine Put diye tek bir işlem kullanacak olmam. Bunun sebebi DynamoDB’nin yapısından kaynaklanıyor. Bize iki farklı işlem sunmuyor.

Şimdi de bu arayüzün nasıl uygulandığına bakalım:

Burada dikkatinizi çekmek istediğim noktalar:

  • DynamoDBMapper: Nesne tabanlı işlemlerimizi, Low Level Java-API’sine çeviren katmandır. JPA jargonundaki EntityManager olarak düşünebilirsiniz.
  • Scan: findByEmail metoduna bakacak olursanız, scan diye bir işlem kullandığımı göreceksiniz. DynamoDB temelinde iki türlü sorgulama yapmanıza olanak sağlıyor. Birincisi Query, PartitionKey ( ve eğer varsa/isterseniz SortKey) kullanarak sorgulama yapmanıza olanak sağlıyor. İkincisi ise Scan, bunda ise PartitionKey kullanmanıza gerek yok. Tahmin edersiniz ki PartitionKey ile yaptığınız sorgulamlar çok daha performanslı çalışıyor.

Uygulama

DynamoDB’nin lokalde nasıl test edileceği apayrı bir konu olduğundan bu yazıda değinmeyeceğim. Bunun yerine bir konsol uygulaması ile her bir metodu test etmeye çalışacağız.

Sonoctobiwan

Yularıdaki adımlardan sonra uygulamanızın sorunsuz bir şekilde çalışması gerekiyor. Uygulamanın tamamına aşağıdaki adresten ulaşabilirsiniz.