SpringMVC ve MongoDB 4: SpringMVC ile Rest Servisleri

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 4: SpringMVC ile Rest Servisleri

Modellerimizi tanımladık. Ardından SpringData ile DAO katmanımızı geliştirdik. Sonra DAO katmanımızı kullanan servislerimizi yazdık. Şimdi ise son halkadayız. Artık SpringMVC ile Rest servislerimizi geliştirebiliriz.  spring-mongo-heroku

Rest servislerimizi geliştirmeden önce ne tür bir servis geliştireceğimizi anlatmak istiyorum. Rest servisi diyince insanların aklına hemen JSON gönderip JSON okyacakları servisler geliyor. Bunu yaparkende genelde, json içerisinde data ve error diye iki alan kullanılır. Data alanında DTO nesneleri gönderilirken error alanındada servis durumu gönderilir. Hemen hemen GET ve POST haricinde başka bir metod kullanılmaz. Bu en temel haliyle SOAP servislerine benzemektedir. Buna rest servislerinin en ilkel hali diyebiliriz.

Bildiğiniz üzere rest servisleri tamamen HTTP’ye bağımlıdır. Bu sebepten data ve error gibi iki alan göndermek yerine doğrudan data gönderip error ile ilgili bilgileri HTTP durum kodlarına bırakmak daha iyidir. Örneğin, id ile kullanıcı bilgisinin sorgulanacağı bir servis mi geliştirdiniz bu servisiniz “error”:”Kullanıcı Bulunamadı” şeklinde bir mesaj ile HTTP Durum kodu 200 (OK) döneceğine, hiç bir veri dönmeyip doğrudan HTTP Durum kodu 404 (NOT_FOUND) dönse çok daha net olacaktır. İşte servislerinizi HTTP durum kodlarına göre geliştirdiğinizde, mimarinizi bir adım (ufak bir adım) ileri çekmiş oluyorsunuz. Biz servislerimizi bu şekilde geliştireceğiz. Eğer daha ileri çekmek isterseniz Hateoas mimarisini incelemenizi tavsiye ederim.

 Rest Servisi – Yani Controller

Kısaca mimarimizi özetlediğimize göre rest servislerimizi yazmaya geçebiliriz. Bunun için src/main/java klasörünün altına com.bahadirakin.mvc isminde paketimizi yaratıyoruz. Daha sonra bu paketin altına UserController isminde bir sınıf yaratıyoruz ve içerisini aşağıdaki gibi yapıyoruz.

UserController.java

Burada dikkat etmenizi istediğim kısımlar ise aşağıdaki gibidir:

  • Sınıf başındaki RequestMapping sınıfa ilişkin pathi belirlemek için kullanılmaktadır.
  • Eğer başka path vermeden sadece request metodu belirtilirse, ana pathin üzerinden kullanılacak demektir.
  • Ana dizine gönderilen işlemler genelde tüm kullanıcılar üzerinde yapılacak işlemlerdir. Yeni kullanıcı yaratma ya da kullanıcı listesini almak gibi…
  • Kullanıcı bazında yapılacak işlemlerde id kullanılmıştır. Normal şartlarda bu güvenlik açıklarına sebebiyet verecektir. Fakat tutorial olduğundan, konuyu basitleştirmek için bu açıklar gözardı edilmiştir. Eğer güvenlikle ilgili işlemler yapmak istiyorsanız SpringSercurity ve Oauth projelerini incelemenizi tavsiye ederim.
  • Her metod için olabildiğince farklı HTTP durum kodları kullanılmaya çalışılmıştır.

Spring MVC Ayalarları Nasıl Yapılır?

Springin bir kütüphanesini kullanırız da ayar yapmadan olur mu? Şimdi spring MVC için ayarların nasıl yapılacağına bakalım. Öncelikle web.xml dosyasının aşağıdaki gibi güncellenmesi gerekmektedir.

web.xml

web.xml dosyasında applicationContext.xml dosyasını iki kere veriyoruz gibi duruyor, fakat merak etmeyin bir kere yüklenecektir. Eğer bunu parametre olarak vermezseniz varsayılan olarak WEB-INF altından okumaya kalkacaktır.

Sonrasında applicationContext.xml dosyası aşağıdaki gibi güncellenmelidir.

applicationContext.xml

Ayarlarımızı yaptıktan sonra uygulamamızı mvn clean install jetty:run diyerek başlatabiliriz. Daha sonra Postman ya da benzeri bir araç ile servislerinizi tek tek test edebilirsiniz. Hatta projenizi commitleyip, git push heroku master diyerek herokuya da deploy edebilirsiniz. Ama isterseniz gelin Test caselerini yazalım.

Spring MVC Testleri ve JsonPath

Spring MVC’nin en sevdiğim özelliklerinden biri kolay test yazılması. Üzerine birde JsonPath kullanarak json nesneleri üzerinde assert yapmak işinizi oldukça kolaylaştıracaktır. Önce src/test/java içerisine, com.bahadirakin.mvc isminde paketimizi yaratıyoruz. Daha sonra paket içerisine UserControllerTest ismindeki sınıfımızı yaratıyoruz.

UserControllerTest.java

Burada dikkatinizi çekmek istediğim nokatlar şu şekildedir:

  • Diğer servis testlerimizin aksine @InjectMock annotasyonunu kullandık. Çünkü ilk servis tesetlerinde interface üzerinden test ederken burada doğrudan sınıf üzerinden test yapıyoruz. İlk servis testlerimizde UserService yerine UserServiceImpl kullansaydık, @InjectMock annotasyonunu yine kullanabilecektik.
  • Her testimizden önce mockları initialize etmenin yanı sıra, MockMvc sınıfınıda tekrardan oluşturuyoruz. Mock MVC sınıfı bize sahte requestler gönderip alma konusunda büyük kolaylıklar sağlıyor.
  • Hamcrest kütüphanesinide çeşitli vesilelerle kullanıyoruz. Bunun yanı sıra Mockito, SpringTest ve JsonPath kullanıyoruz.

Songitcat

Projemizi başarıyla tamamladık. Artık son commitlerinizi yapıp git push heroku master komutuyla projenizi heroku ortamına gönderebilirsiniz.

Projenin kaynak kodlarına Git adresi üzerinden erişebilirsiniz.

Bu yazı dizisini ileride tekrar kullanacağız. AngularJS ile ya da Android ile Rest servislerinin nasıl tüketileceği ile ilgili yazılar yazmayı planlıyorum. Bu yazılarda bu projeyi template olarak kullanacağımız gibi doğrudan heroku adresinden tüketeceğiz de…

End of Line