SprinMVC ve MongoDB 3: Servis Katmanı

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 3: Servis Katmanıspring-mongo-heroku

DAO Katmanımızı yazdığımıza göre şimdi servis katmanımızı geliştirebiliriz. Basit bir uygulamamız olduğundan servis katmanımız da sorun olmayacaktır.

Servis Katmanı Nasıl Olmalı?

Öncelikle src/main/java altına com.bahadirakin.service ismindeki paketimizi yaratıyoruz. Sonra buraya ilk ve tek servis arayüzümüzü yani UserService interface’imizi yaratıyoruz

UserService.java

Burada DAO katmanından yukarı taşımak istediğimiz tüm metodları taşıyoruz. Eğer bir validasyon ya da exception handling yapılacaksa burada yapılabilir. DAO katmanımız sadece Interface olduğundan exception handling’e çok yer tanımıyor. Fakat üst servislerden ya da rest servislere göndereceğimiz exceptionları yine burada tanımlıyoruz. Interface’imizi tanımlamamız bittikten sonra implementasyonunu yazmaya geçebiliriz. Bunun için yine aynı paketin altına UserServiceImpl isminde bir sınıf yaratıyoruz. (Normal şartlarda arayüz başka pakette, implementasyon başka pakette olmasında yarar vardır.)

UserServiceImpl.java

Burada dikkat etmenizi istediğim kısımlar

  • Service annotasyonu kullanıldı ama herhangibir transaction bilgisi bildirilmedi. Bunun sebebi nosql veritabanı kullanmamızdır.
  • Servisleriniz sadece veriyi çekip göstermek için değil, validasyon da exception handling te burada yapılıyor. Örnek basit olduğundan gereksiz bir katman gibi gözükebilir ama iş mantığınız bu katmanda yer alacak. Örneğin “şifremi unuttum” işlemi için hem veritabanı işlemi hem mail gönderim işlemi yapılmalı.

Şimdi ise bu paketin tarandığına emin olmak için applicationContext.xml’i güncellememiz gerekiyor.

applicationContext.xml

Güncellememizi yaptığımıza göre testlerimizi yazmaya geçebiliriz.

Mockito ile Servis Testleri

Servis testlerimiz sırasında veritabanı ayağa kaldırmak her ne kadar Fongo kullansak bile maliyetli olacaktır. Bu sebepten başka bir yapı kullanacağız. DAO bağımlılıklarımızı mocklayarak devam edeceğiz. Mocklama işlemi için Mockito kullanacağız. Mockito bağımlılığımızı projemizi ayarlarken vermiştik.

Bunun için src/test/java dizinin altına com.bahadirakin.service isminde paket yaratıyoruz. Daha sorna bu paketin altına UserServiceTest isminde java sınıfımızı yaratıyoruz.

UserServiceTest.java

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

  • Biz UserService sınıfını test ediyoruz. Bu sebepten onun bağımlı olduğu diğer tüm sınıfları mockluyoruz. Mockladığımız sınıfları da gördüğünüz gibi @Mock annotasyonuyla belirtiyoruz.
  • Mock annotasyonuyla belirtilen sınıfların oluşması için MockitoAnnotations.initMocks(this); metodunun çağırılması gerekmektedir.
  • Biz springten bağımsız olarak test yazdığımız için mockladıklarımızı otomatik olarak inject edemiyoruz. Bu sebepten kendimiz yaratıyoruz ve yaratırken parametre olarak mockladığımız nesneyi aktarıyoruz.

Son

Basit olması açısından sadece authentication kısmının unit testlerini yazdım. Arzu ederseniz diğer kısımların unit testlerini siz tamamlayabilirsiniz.

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

 End Of Line