Spring Boot 2— Data MongoDB
Selamlar, yazı dizimin ilkine hoşgeldiniz. Elimden geldiğince edindiğim bilgileri aktarmaya çalışacağım. Detaylara boğulmadan az ve öz olmasına dikkat edeceğim.
Öncelikle Spring Data MongoDB nedir onu açıklayalım. Spring ekosisteminde bulunan bu paket MongoDB ile entegrasyonu sağlar. Kısaca çok kolay bir şekilde Mongo connectionları oluşturup bunlar üzerinde neredeyse hiç kod yazmadan CRUD operasyonları yapmamızı sağlıyor.
Şimdi ufak bir proje oluşturalım ve bu kolaylığı test edelim. Tabi bunun için bazı kurulumların yapılmış olması gerekiyor. Aşağıda bunları bulabilirsiniz;
- Mongo
- Gradle
Gerekli kurulumlar yapıldıktan sonra bir gradle projesi oluşturalım ve spring boot’un 2.0.5 release’ini classpathe ekleyelim ayrıca spring boot’un starter data mongodb paketini de dependencylere ekleyelim.
group 'com.medium.mongo.case1'
version '1.0-SNAPSHOT'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.5.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
sourceCompatibility = 1.8
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-mongodb")
}
Daha sonrasında MongoDB’de collection içerisindeki bir dökümana karşılık gelecek objeyi yazıyorum. Hibernate ya da JPA kullananlar bunu Entity olarak düşünebilirler. ID annotation’ı her döküman için oluşan unique değeri belirtiyor.
public class Customer {
@Id
public String id;
public String firstName;
public String lastName;
public Customer() {}
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
Şimdi Customer objelerine database üzerinden erişmek için bir repository oluşturmam gerekiyor. Bunun için Data MongoDB paketinde bulunan MongoRepository interface’ini kullanıyorum. Bu interface benim için CRUD fonksiyonlarını yazmadan dökümanlara erişebilmemi sağlıyor. Aynı zamanda içerisinde yazacağım abstract metodlarla da implementasyonunu yazmadan çok basit bir şekilde custom queryler oluşturmamı sağlıyor.
public interface CustomerRepository
extends MongoRepository<Customer, String> {
Customer findCustomerByFirstName(String firstName);
}
Burada MongoRepositorynin birinci parametresi döküman objemizi gösteriyor, ikinci parametresi ise dökümanın unique idsinin tipini gösteriyor.
Custom fonksiyonumuzun implemantasyonu yazmayacağız. Data MongoDB paketi bizim için bunu yapacaktır. Burada dikkat edilmesi gereken nokta fonksiyonun isimlendirilmesidir.
@SpringBootApplication
public class MainApplication implements CommandLineRunner {
@Autowired
private CustomerRepository customerRepository;
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
@Override
public void run(String... args) {
customerRepository.deleteAll();
customerRepository.save(new Customer("Antonio","Banderas"));
customerRepository.save(new Customer("Robert", "Downey Jr."));
System.err.println("Customers found with findAll():");
// Fetching all customers in the database
List<Customer> customerList = customerRepository.findAll();
customerList.forEach(System.out::println);
System.err.println("Customer found with findByFirstName('Robert'):");
Customer customer = customerRepository.findCustomerByFirstName("Robert");
System.out.println(customer);
}
}
MainApplication classımızda da CommandLineRunner kullanarak önce proje ayağa kalktığında yapılacak işlemleri veriyoruz. Öncelikle görüldüğü üzere MongoRepository’nin default metodlarını kullanarak bütün dökümanları siliyoruz. Daha sonrasında 2 tane döküman insert ediyoruz. Yine default metodlardan findAll Kullanarak bütün dökümanları alıp ekrana basıyoruz ve son olarak da yazdığımız custom fonksiyonu deniyoruz.
Tüm bunları yaptık fakat hala Mongo konfigurasyonu yapmadık. Yine Data MongoDB’nin bize sağladığı faydalardan bir tanesini aşağıda paylaşıyorum. application.yml file’ına yazdığımız bir kaç parametre ile bütün gerekli konfigurasyonları yapabiliyoruz. Buraya tabiki authentication ile alakalı bilgiler de girilebilir.
spring:
data:
mongodb:
host: localhost
port: 27017
database: medium
Görüldüğü üzere çok az kod yazarak bir çok işi gerçekleştirebiliyoruz. Bunun daha manuel şekilde dökümanlar için codecler ve queryler yazarak mongo driver üzerinden yapılması için ciddi manada çok fazla kod yazılması gerekiyor. Ee ne demiş atalarımız,
En temiz kod yazılmayan koddur.
Mutlu kodlamalar,
Murat