Spring Boot’ta Entity-DTO (Data Transfer Object) maplemesi ve MapStruct Kullanımı?
Java tabanlı Spring Boot uygulamaları geliştirirken, genellikle veri transferi işlemleriyle karşılaşırız. Bu işlemler, veritabanından veri çekme, kullanıcıya sunma veya dış kaynaklarla etkileşimde bulunma gibi farklı senaryolarda gerçekleşebilir. Bu gibi durumlarda kendi kodumuzu dış dünyanın etkilerinden korumak için genellikle birden fazla nesne katmanı oluştururuz (Entity, DTO, vb..). Örneğin, bir client uygulamanın bir sunucudan veri alması veya sunucuya veri göndermesi gerektiğinde, DTO’lar veri taşıma işlemini etkin ve düzenli bir şekilde gerçekleştirmeye yardımcı olur.
Peki Bu DTO Nedir?
DTO (Data Transfer Object), veri transferi amacıyla kullanılan bir tasarım desenidir ve genellikle yazılım uygulamalarının farklı katmanları veya bileşenleri arasında veri taşımak için kullanılır. Entity sınıflarımızı apiler aracılığıyla dış dünyaya açmak bir güvenlik açığıdır. Entity sınıflarını controller ve servis katmanında kullanmamız bir takım hatalara neden olabilir. Bu nedenle DTO nesneleri API tabanlı geliştirmelerimizin olmazsa olmazlarındandır.
Örnek olarak aşağıda ki gibi bir Customer modelimiz (entity) var.
Burada şimdi client uygulamamızda geri döndürmek istediğimiz fieldlar id, firstname, lastname ve email alanları olsun bununla ilgili bir DTO oluşturalım.
Artık oluşturualan bu DTO’yu service sınıfımızda saveCustomer metodunda dönüşümü kullanabiliriz.
İşte tam burada gördüğünüz olay convert işlemidir yani Entity-DTO dönüşümüdür. Burada manuel bir dönüşüm yaptık.
Şimdi bu Entity-DTO maplemesini MapStruct kullanarak yapalım.
İlk olarak, projemize MapStruct bağımlılığını eklemeliyiz. Bu bağımlılığı projemize Maven veya Gradle gibi bir bağımlılık yöneticisi kullanarak ekleyebiliriz. Örneğin, Maven kullanıyorsak, pom.xml dosyamızda şu bağımlılığı ekleyebiliriz:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
Dönüşüm yapmak istediğimiz Entity ve DTO sınıflarını oluşturalım:
@Entity
public class Customer extends BaseModel {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private UUID id; //@Id ve @GeneratedValue ile işaretlenmiş, bu nesnenin veritabanında otomatik olarak oluşturulmasını ve bir kimlik değeri atanmasını sağlar.
private String customerName;
private String address;
private String state;
private String city;
private int zipCode;
@OneToOne(fetch = FetchType.LAZY) //@OneToOne ilişkisi ile işaretlenmiştir, bu da bir müşterinin yalnızca bir siparişi olduğu anlamına gelir.
@JoinColumn(name="order_id", referencedColumnName="id") //@JoinColumn ile siparişin id alanı ile order_id alanı arasında bir eşleşme yapılmıştır.
private Order order;
}
Şimdi DTO kısmını oluşturayım.
@Data
public class CustomerDTO extends BaseDTO<UUID>{
private String customerName;
private String address;
private String state;
private String city;
private int zipCode;
}
Entity sınıfı ile DTO sınıfı arasındaki dönüşümü tanımlamak için MapStruct tarafından kullanılacak bir mapper arayüzü oluşturalım. Bu arayüz, MapStruct tarafından otomatik olarak uygulanacak dönüşüm metotlarını içermelidir.
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface CustomerMapper {
CustomerMapper INSTANCE Mappers.getMapper(CustomerMapper.class);
@Mapping(target = "id", ignore = true) // Bu satır, id alanının dönüşümde göz ardı edilmesini sağlar.
CustomerDTO entityToDto(Customer customer);
}
Artık MapStruct tarafından otomatik olarak oluşturulan CustomerMapper gibi bir sınıfımız var. Bu sınıf, entity ve DTO arasındaki dönüşümü gerçekleştirecektir.
Dönüşümü kullanmak için, CustomerMapper’ı doğrudan çağırabiliriz.
Customer entity = new Customer();
entity.setCustomerName("Doğan");
entity.setAddress("Ankara");
CustomerMapper mapper = new CustomerMapper();
CustomerDTO dto = mapper.entityToDto(entity);
System.out.println(dto.getCustomerName()); // “Doğan”
System.out.println(dto.getAddress()); // "Ankara”
Bu şekilde, MapStruct kullanarak Entity-DTO dönüşümünü daha kolaya indirmiş olduk.
MapStruct, dönüşüm kurallarını otomatik olarak oluşturdu ve böylece kod tekrarını en aza indirdi.
Referans Kaynaklar
https://latestsoftwaredevelopers.com/blogDetay/259/dto-nedir-ne-ie-yarar-