SpringMVC ve MongoDB 2: MongoDB ve SpringData

SpringMVC ve MongoDB

Daha önceki yazılarda Rest servislerinin nasıl geliştirilebileceği üzerine konuşmuştuk. Bu sefer RDB yerine NoSQL, JPA yerine Spring Data ve Jersey yerine de SpringMVC kullanacağız. Ek olarak en temel halindeki rest servis mimarisini değil daha gelişmiş bir Rest servis mimarisini kullanacağız. Fakat bu servis mimarisi Hateoas kadar gelişmiş olmayacak. Gelişmişlik açısından Hateoas’ın bir tık altını hedef alacağız. Ayrıca uygulamamızı cloud servislere deploy edeceğiz. Cloud Servis sağlayıcısı olarak heroku kullanacağız. Projenin paket yönetimi yine maven yönetecek, test ve canlı ortamımızda servlet container olarak Jetty kullanacağız.

Yazı dizisinin özeti aşağıdaki gibidir.

SprinMVC ve MongoDB 2: MongoDB ve SpringData ile DAO Katmanı

Ayarlamalarımızı yaptığımıza göre sıra modellerimizi oluşturmaya ve DAO katmanını yazmaya geldi. DAO katmanını yazmak derken öyle büyük şeyler gelmesin aklınıza, sağoulsun SpringData bizim için herşeyi düşünmüş. Biz sadece bir Interface yazacağız, spring bizim için içerisini dolduracak. Nasıl olacağını birazdan daha ayrıntılı anlatacağım. spring-mongo-heroku

Modelleri oluşturmaya geçmeden önce, favori IDE’nize geçebilirsiniz. Ben örneklerde Intellij 14 kullanacağım. Intellij’e maven projesini import ettiğinizde spring ayarlarımızı falan tanıyacaktır. Fakat daha önceden java klasörü olmadığı için, src/main’in altına java klasörü eklediğinde bunun kaynak kodu klasörü olduğunu anlamayacaktır. Bunun için project structure’dan bu klasörün kaynak kodu klasörü olduğunu belirtmeniz gerekiyor. İleride testlerimizi ve test resourcelarımızı belirtirken de benzer yolla tanımlamalar yapmamız gerekecek.

 SpringData ile Modeller

Kaynak kodu klasörümüzü belirledikten sonra sırada paketimizi ve ilk modellerimizi oluşturmak var. src/main/java altına com.bahadirakin.model diyerek, modellerimizin tutulacağı paketi oluşturuyoruz. Örneğimizde bir model olacak ama yine de ayrı paketlerde tutmamız okunurluğu arttıracaktır. Hatta büyük projelerde, modeller ve dao’larında sadece kendine ait paketleri değil kendilerine ait modülleride olmalıdır.

Sonradan model paketimizin altına User sınıfı oluşturup içeriğini aşağıdaki gibi yapıyoruz.

User.java

Burada dikkat etmenizi istediğim noktalar aşağıdaki gibidir:

  • @Id: Id alanı olarak String bir değer kullanıyoruz. MongoDB kendi collection’ları içerisinde Id alanlarını string olarak tutuyor.
  • @Index: Burada hangi alan için index oluşturup oluşturmayacağımızı belirliyoruz. Indexler bu alanlar üzerinden veritabanı okumalarımızı hızlandıracaktır. Ayrıca burada verdiğimiz unique=true değeri, bu alanın tekil olup olmadığını belirliyor.

Bunlar haricinde JPA yazarken kullandığımız modellerden bir farkı yok gördüğünüz gibi. SpringMVC kısmını yazarken eklememiz gereken başka annotasyonlar olursa bu sınıfa tekrardan döneceğiz.

SpringData’da DAO Katmanı

Modelimizi oluşturduğumuza göre DAO katmanını yazmaya başlayabiliriz. Bunun için öncelikle src/main/java klasörünün altına com.bahadirakin.dao isminde bir paket oluşturuyoruz. Daha sonra bu paketin altına UserRepository isminde bir Interface yaratıyoruz. Interface’in içeriği aşağıdaki gibi olacak.

UserRepository.java

Burada dikkat edilmesi gereken kısımlara değinecek olursak;

  • com.bahadirakin.dao paketindeki tüm Repository nesneleri, MongoRepository’den (ya da en azından CRUDRepository’den) türemelidir.
  • com.bahadirakin.dao paketinde repository olduğu xml ayarları yapılırken belirtilecektir. Aksi halde sistem hangi repository’leri çekeceğini bilemez.
  • Buradan kullanılan metod isimlerinin belirli bir standardı vardır. Bu standarda uyulmalıdır. Standardın detayına http://docs.spring.io/spring-data/data-mongodb/docs/current-SNAPSHOT/reference/html/#repositories.query-methods.query-creation adresinden bakılabilir.
  • Temel Crud operasyonlarını MongoRepository sınıfı bana doğrudan sağladığından bu operasyonları yazmadım. Sadece örnek olması açısından bir iki method yazdım.

SpringData ve MongoDB Erisim Ayarları

DAO’larımızı tanımladığımıza göre sıra SpringData ile ilgili ayarlarımızı yapmaya geldi. Bunun için src/main/resources klasörüne springDataContext.xml isminde bir dosya oluşturup içerisini aşağıdaki gibi yapıyoruz.

springDataContext.xml

Burada da dikkat edilmesi gereken kısımlara değineyim.

  • property-placeholder: Bu tag sayesinde ben properties dosyasından okuduğum değerleri spring içerisinde kullanabiliyorum. Aynı tanımı farklı yerlerde bir kaç kere farklı properties dosyaları ile yapmak mümkün. Buradaki tanım aynı zamanda sistem genelinde aynı parametrei sağladığımda da properties dosyasındakini ezmeme olanak sağlıyor. Yani çok rahatlıkla test sırasında properties dosyasının içerisindeki veritabanını ve production sırasında ise Procfile içerisinde verdiğim sistem değişkenini kullanabilirim.
  • ${…}: Property-placeholder tanımlamalarımı dolar sembolü içerisinde belirtiyorum. Böylelikle sistem gidip ilgili değeri properties dosyasından okuyor.

Şimdi ise springDataContext.xml içerisinde kullandığım mongodb.properties dosyasını oluşturalım. Bu dosyayı yine src/main/resources altında oluşturuyoruz.

mongodb.properties

Eğer buradaki bilgilerden emin değilseniz, projeyi oluştururken kullandığımız komutu çalıştırıp öğrenebilirsiniz. Bunun için öncelikle heroku sistemine login olmalısınız (heroku login). Ardından mongodb parametresini sorgulamalısınız (heroku config | grep MONGOLAB_URI). Burada çıkan URL’in formatini bizim properties dosyasına uyarlayacak olursak aşağıdaki gibi bir url elde emiş oluyoruz.

mongodb://${mongodb.username}:${mongodb.password}@${mongodb.hostaddress}:${mongodb.port}/${mongodb.database}’dir.

Son olarak yeni eklediğimi springDataContext.xml dosyasını applicationContext.xml dosyası içerisine import ediyoruz. Son durumda applicationContext.xml dosyası aşağıdaki gibi oluyor.

applicationContext.xml

 DAO Testleri ve Fongo

Kurulumumuzu tamamladık. Şimdi sırada kurulumumuzu test etmek var. Bunun için öncelikle src/test/java klasör yolunu oluşturup Intellij 14 içerisinde test kaynak kodu dizini olarak belirtiyoruz. Sonra src/test/resources klasörünü yaratıp bunu da Intellij 14 içerisinde Test Resources klasörü olarak belirtiyoruz. Ardından src/test/java klasörünün içerisine com.bahadirakin.dao paketini oluşturup, UserRepositoryTest sınıfı yaratıyoruz. Test edeceğimiz iki adet metod var. Bu iki metodu aşağıdaki gibi test ediyoruz.

UserRepositoryTest.java

Testlerimizin çalışması için bir mongodb veritabanına ihtiyaç var. Fakat sadece testlerin çalıştırılması için mongodb veritabanı kullanmak biraz fazla kaçacaktır. Bunun yerine Fongo denilen kütüphaneyi kullanıyoruz. Kütüphane bağımlılıklarını proje oluştururken belirlemiştik. Şimdi sadece testte kullanacağımız context dosyasını yaratıyoruz. Bunun için src/test/resources dizinin altına springDataContext-test.xml dosyasını oluşturuyorup içeriğini aşağıdaki gibi yapıyoruz.

springDataContext-test.xml

Son

Testlerimizi çalıştırdığımızda yeni yazdığımız metodların düzgün çalıştığını görüyoruz. Herşey düzgün çalıştığına göre bir sonraki bölüme geçebiliriz.

Arzu ederseniz projenin son halinin kaynak kodlarına Git adresi üzerinden erişebilirsiniz.

End of Line