Mustafa KESER
4 min readJun 8, 2023

Data Transfer Object (DTO) Nedir ve Nasıl kullanılır?

Data Transfer Object (DTO), veri transferi için kullanılan bir tasarım desenidir. DTO’lar, nesnelerin verilerini bir yerden başka bir yere aktarmak için kullanılır. Genellikle bir veritabanından veri çekilirken veya bir web hizmetine veri gönderilirken DTO’lar kullanılır.

DTO’lar, verileri taşımak için basit veri yapılarından oluşur. Veriler, DTO içerisindeki alanlar veya özellikler olarak temsil edilir ve sadece veri aktarımı amacıyla kullanılır. DTO’lar genellikle seri hale getirilebilir (serialization) ve ağ üzerinde iletilirken kullanılır.

DTO’lar, veritabanı nesneleri veya servisler arasında taşınacak verileri kolayca temsil etmek için kullanışlıdır. DTO’lar, verilerin tutarlılığını sağlamak, gereksiz veri aktarımını önlemek ve veri bütünlüğünü korumak için kullanılabilir. Ayrıca, farklı uygulama katmanları arasında sınırlı bağımlılık oluşturarak sistemlerin daha modüler ve bakımı daha kolay hale gelmesini sağlar.

Neden Kullanılır?

DTO (Data Transfer Object), veri aktarımı için kullanılan bir tasarım desenidir ve Spring Boot gibi bir framework içerisinde kullanımı oldukça yaygındır. Spring Boot’ta DTO’ları kullanmanın bazı nedenleri şunlardır:

1. Veri transferinde soyutlama: DTO’lar, veritabanından alınan verilerin API’ler veya kullanıcı arabirimleri gibi farklı katmanlara aktarılması sırasında kullanılabilir. Bu sayede veri transferinde bir soyutlama katmanı oluşturulur ve veri yapısının detaylarından bağımsız olarak veri aktarımı sağlanır.

2. Veri tutarlılığı: DTO’lar, veritabanından veya diğer kaynaklardan alınan verileri belirli bir yapıya dönüştürerek, uygulama katmanları arasında tutarlı bir veri formatı sağlar. Bu şekilde veri aktarımı sırasında hatalı veya eksik veri aktarımının önüne geçilir.

3. Veri kontrolü ve güvenlik: DTO’lar, gelen verinin doğruluğunu kontrol etmek ve güvenlik kontrollerini yapmak için kullanılabilir. Örneğin, gelen verinin belirli bir formatı veya değeri sağlaması gerekiyorsa, DTO içinde bu kontroller yapılabilir ve hatalı veri girişi engellenebilir.

4. Nesne dönüşümü: DTO’lar, farklı veri modelleri veya nesneler arasında veri dönüşümü sağlamak için kullanılabilir. Özellikle farklı katmanlar arasında veri dönüşümü gerektiğinde DTO’lar kullanılarak veri modelinin uygun formata dönüştürülmesi sağlanır.

5. API uyumluluğu: Spring Boot ile API geliştirirken, gelen veya gönderilen verinin API sözleşmesine uygun olması önemlidir. DTO’lar, API’lerin kullanımını kolaylaştırır ve veri transferini API sözleşmesiyle uyumlu hale getirir.

DTO’lar, veri transferini düzenlemek, veri yapılarını kontrol etmek ve farklı katmanlar arasında veri dönüşümü sağlamak gibi avantajlar sunar. Bu nedenlerle Spring Boot projelerinde yaygın olarak kullanılır.

POJO (Plain Old Java Object) ve DTO (Data Transfer Object) arasında dönüşüm yapmak için çeşitli yöntemler kullanılabilir.

POJO ve DTO arasında dönüşüm yapmanın birkaç yolunu açıklayalım:

A — POJO ve DTO sınıfları arası dönüşüm

-- DTO sınıfı oluşturalım ve POJO sınıfının alanlarına karşılık gelen alanları ekleyelim.

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String ad;
private String soyad;
}
@AllArgsConstructor
@NoArgsConstructor
@Data
public class PersonDTO {

private String ad;
private String soyad;
}

- POJO sınıfından DTO sınıfını oluşturmak için bir method yazalım, POJO sınıfının her bir alanının değerini DTO sınıfının ilgili setter alanına setleyelim.

// POJO'dan DTO'ya dönüşüm örneği:
public PersonDTO personToPersonDTO(Person person){
PersonDTO personDTO = new PersonDTO();
personDTO.setAd(person.getAd());
personDTO.setSoyad(person.getSoyad());

return personDTO;
}

- DTO sınıfından POJO sınıfını oluşturmak için bir method yazalım, DTO sınıfının her bir alanının değerini POJO sınıfının ilgili setter alanına setleyelim.

// DTO'dan POJO'ya Dönüşüm:
public Person personDtoToPerson(PersonDTO personDTO){
Person person = new Person();
person.setAd(personDTO.getAd());
person.setSoyad(personDTO.getSoyad());

return person;
}

B — @Builder anotasyonu kullanarak POJO to DTO dönüşümü:

@Builder, Lombok kütüphanesi tarafından sağlanan bir özelliktir ve nesne oluşturma sürecini kolaylaştıran bir şekilde kullanılır. @Builder ile POJO sınıfınızı tek satırda (chaining) bir DTO sınıfına dönüştürebilirsiniz.

@Builder kullanımı için aşağıdaki adımları takip edelim:

1. İlgili POJO ve DTO sınıfına, Lombok tarafından sağlanan @Builder anotasyonunu ekleyelim.

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String ad;
private String soyad;
}
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class PersonDTO {
private String ad;
private String soyad;
}

2. @Builder anotasyonunu ekledikten sonra, builder deseni otomatik olarak oluşturulur. Builder deseni, nesne oluşturma sürecini kolaylaştıran metodları içerir.

// POJO to DTO:
public PersonDTO personToPersonDTO (Person person){

return PersonDTO.builder()
.ad(person.getAd())
.soyad(person.getSoyad())
.build();
}


// DTO to POJO:
public Person personDtoToPerson(PersonDTO personDTO){

return Person.builder()
.ad(personDTO.getAd())
.soyad(personDTO.getSoyad())
.build();
}

Yukarıdaki örnekte builder() metodu ile builder nesnesi alındıktan sonra, nesne alanları setter metotları gibi zincirleme şeklinde belirlenebilir. Son olarak build() metodu ile nesne oluşturulur.

@Builder, nesne oluşturma sürecini okunabilir ve sade bir şekilde gerçekleştirir. Özellikle çok sayıda alanı olan sınıflar için kod yazımını azaltır ve okunabilirliği artırır.

C- Third Party uygulamalar ile POJO to DTO dönüşümü:

Dönüşüm işlemlerini nesne kopyalama kütüphaneleri veya dönüşüm araçları da kullanabilir.

POJO ve DTO dönüşümlerinde yardımcı olabilecek bazı nesne kopyalama kütüphaneleri veya dönüşüm araçları aşağıda listelenmiştir:

1. MapStruct: MapStruct, Java arayüzleri ve derleme zamanında oluşturulan kod kullanarak POJO ve DTO arasında performanslı dönüşümler gerçekleştiren bir kütüphanedir. Özellikle büyük projelerde performans gereksinimleri olan dönüşüm işlemleri için tercih edilebilir.

2. ModelMapper: ModelMapper, Java sınıfları arasında dönüşüm yapmak için popüler bir kütüphanedir. Alan isimlerini otomatik olarak eşleştirir ve dönüşüm işlemlerini kolaylaştırır. Ayrıca, derin kopyalama ve dönüşüm konfigürasyonu gibi gelişmiş özellikleri destekler.

3. Dozer: Dozer, POJO ve DTO arasında dönüşüm yapmak için kullanılan bir diğer popüler kütüphanedir. Alan eşleştirme konfigürasyonu sağlar ve özel dönüşüm senaryolarını destekler. Dozer, karmaşık nesneleri kopyalamak için kullanılabilir.

Bu kütüphaneler, POJO ve DTO arasında dönüşüm yapmayı kolaylaştıran farklı yaklaşımlar sunar. Kullanacağınız kütüphane veya araç, proje gereksinimlerinize, performans hedeflerinize ve tercihlerinize bağlı olarak değişebilir. Her bir kütüphane kendi dokümantasyonuna sahiptir ve bu dokümantasyonlardan daha fazla bilgi edinebilirsiniz.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

No responses yet

Write a response