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.