DTO Nedir? (Data Transfer Object) Neden Kullanılır? DTO vs Entity (2025)
DTO (Data Transfer Object), katmanlar (UI ↔ Service ↔ Database) veya farklı sistemler (microservice’ler) arasında sadece gerekli alanları taşımak için kullanılan sade veri nesnesidir.
Amaç: Veriyi güvenli, hafif ve düzenli şekilde taşımak. Spring Boot ile API geliştiren ekiplerde DTO kullanımı neredeyse standarttır.
1. DTO Nedir?
DTO, uygulamanın dış dünyaya (frontend, başka servisler, mobil uygulamalar) gönderdiği veya dış dünyadan aldığı veriyi temsil eden taşıma nesnesidir. Genellikle iş mantığı içermez; sadece alanlar ve getter/setter (ya da immutable yapı) barındırır.
2. DTO Ne Demek?
DTO = Data Transfer Object → Türkçe karşılığıyla Veri Transfer Nesnesi.
3. Neden DTO Kullanırız?
Yazılım geliştirmede DTO kullanılmasının temel nedeni veri transferini kontrollü ve güvenli hale getirmektir. Örneğin bir client uygulama sunucudan veri alacak ya da sunucuya veri gönderecekse DTO’lar bu taşıma işlemini düzenli yapar.
3.1 Entity’yi API ile dış dünyaya açmak güvenlik riskidir
Entity sınıflarını doğrudan API response olarak döndürmek şu problemlere yol açabilir:
- Hassas veriler sızabilir: şifre, rol, internal notlar gibi alanlar istemeden dışarı çıkabilir.
- Gereksiz alanlar taşınır:
createdAt,createdBy,updatedBygibi log alanları client için gereksiz olabilir. - İç modeliniz görünür olur: veritabanı yapınıza dair ipucu verir.
3.2 API sözleşmesini (contract) korur
Entity modelinize zamanla yeni alan eklediğinizi düşünün. Entity’yi doğrudan döndürüyorsanız, client olan tüm uygulamalarda değişiklik gerekebilir. DTO kullanırsanız API sözleşmesini daha stabil tutarsınız.
3.3 Katmanlar arası bağımlılığı azaltır
Sistemler genellikle katmanlıdır (Database, Service, Presentation). DTO’lar, veritabanı varlıklarının (entity) üst katmanlara “sızmasını” engeller ve katmanlar arasındaki sıkı bağımlılığı azaltır. Bu da değişiklikleri daha yönetilebilir kılar.
4. DTO vs Entity: Aradaki Fark Nedir?
| Özellik | Entity | DTO |
|---|---|---|
| Amaç | Veritabanı tablosunu temsil eder | Veri transferi yapar |
| İçerik | Tüm alanlar (hassas + teknik) | Sadece dışarı açılacak alanlar |
| Güvenlik | Riskli olabilir | Daha güvenli |
| Performans | Gereksiz veri taşıyabilir | Daha hafif payload |
| Bağımlılık | DB değişince API kırılabilir | API daha stabil kalır |
5. DTO Kullanım Alanları
- REST / GraphQL API request & response
- Microservice’ler arası iletişim
- Frontend (Angular/React/Vue) ile veri alışverişi
- Batch işler ve entegrasyonlar
6. Spring Boot’ta DTO Örneği (Customer)
Diyelim ki Customer entity’nizde çok sayıda alan var ama client’a sadece id, firstname, lastname ve email dönmek istiyorsunuz. İşte bu noktada DTO kullanırız.
6.1 Entity (örnek)
public class Customer {
private Long id;
private String firstname;
private String lastname;
private String email;
private String fatherName;
private String motherName;
private String address;
private String phone;
private String createdBy;
private String updatedBy;
// getters/setters
}
6.2 DTO (client’a döndüğünüz sade model)
public class CustomerDto {
private Long id;
private String firstname;
private String lastname;
private String email;
// getters/setters
}
Buradaki amaç: client uygulamalara hangi alanları göstermek istediğinizi kontrol etmektir. Hepsini taşımak istemeyebilirsiniz.
7. Entity → DTO Dönüşümü (Manuel vs MapStruct)
7.1 Manuel dönüşüm (küçük projelerde olur, büyüdükçe zorlaşır)
public CustomerDto toDto(Customer c) {
CustomerDto dto = new CustomerDto();
dto.setId(c.getId());
dto.setFirstname(c.getFirstname());
dto.setLastname(c.getLastname());
dto.setEmail(c.getEmail());
return dto;
}
Manuel dönüşüm büyük projelerde sürdürülemez hale gelebilir. Bu yüzden dönüşüm için kütüphaneler tercih edilir.
7.2 MapStruct ile otomatik dönüşüm (sık önerilen yaklaşım)
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface CustomerMapper {
CustomerDto toDto(Customer customer);
Customer toEntity(CustomerDto dto);
}
7.3 Controller’da sadece DTO döndürmek
@RestController
@RequestMapping("/api/customers")
public class CustomerController {
private final CustomerService service;
private final CustomerMapper mapper;
public CustomerController(CustomerService service, CustomerMapper mapper) {
this.service = service;
this.mapper = mapper;
}
@GetMapping("/{id}")
public CustomerDto getCustomer(@PathVariable Long id) {
Customer entity = service.findById(id);
return mapper.toDto(entity);
}
}
Özetle: Client tarafı çok alan gönderse bile siz response’ta sadece istediğiniz alanları döndürürsünüz. Tam kontrol DTO’dadır.
Not: Entity–DTO dönüşümü için ModelMapper, MapStruct, Dozer, Orika gibi araçlar da kullanılabilir.
8. DTO Best Practices (2025)
- DTO’yu mümkün olduğunca minimal tutun.
- Entity’yi API’den asla doğrudan döndürmeyin.
- Immutable yaklaşımı tercih edin (Java
recordveya@Builder). - Validasyonları DTO’da yapın (
@NotBlank,@Emailgibi). - Gerekiyorsa versiyonlayın:
CustomerDtoV1,CustomerDtoV2.
9. DTO Kullanmaya Gerek Olmayan Durumlar
- Küçük, tek katmanlı script’ler
- Proof of Concept (PoC)
- Çok basit internal uygulamalar (dış dünyaya API açılmıyorsa)
10. Sık Sorulan Sorular (FAQ)
DTO nedir?
DTO, katmanlar veya sistemler arasında sadece gerekli alanları taşıyan sade veri nesnesidir.
DTO ile Entity arasındaki fark nedir?
Entity veritabanını temsil eder; DTO ise API’de taşınacak alanları seçerek güvenli ve stabil bir sözleşme sağlar.
Her projede DTO kullanmalı mıyım?
Dış dünyaya API açan, büyüme ihtimali olan projelerde DTO kullanmak genellikle doğru yaklaşımdır.
En iyi DTO dönüşüm kütüphanesi hangisi?
Java + Spring projelerinde MapStruct, performans ve tip güvenliği nedeniyle sık tercih edilir.