{"id":32220,"date":"2025-10-19T05:40:43","date_gmt":"2025-10-19T02:40:43","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32220"},"modified":"2025-10-19T05:40:43","modified_gmt":"2025-10-19T02:40:43","slug":"dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/","title":{"rendered":"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131"},"content":{"rendered":"<p><body><\/p>\n<h2>DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131<\/h2>\n<p>Veri, modern yaz\u0131l\u0131m uygulamalar\u0131n\u0131n kalbinde yer al\u0131r ve bu verilere eri\u015fim, i\u015fleme ve y\u00f6netme \u015feklimiz uygulaman\u0131n genel performans\u0131, s\u00fcrd\u00fcr\u00fclebilirli\u011fi ve esnekli\u011fi \u00fczerinde do\u011frudan bir etkiye sahiptir. Yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan en yayg\u0131n zorluklardan biri, uygulama mant\u0131\u011f\u0131 ile veri depolama mekanizmalar\u0131 aras\u0131ndaki s\u0131k\u0131 ba\u011f\u0131ml\u0131l\u0131kt\u0131r. Bu ba\u011f\u0131ml\u0131l\u0131k, veri kayna\u011f\u0131 de\u011fi\u015fti\u011finde veya veri eri\u015fim y\u00f6ntemleri g\u00fcncellendi\u011finde t\u00fcm uygulaman\u0131n etkilenebilmesine yol a\u00e7ar. \u0130\u015fte tam bu noktada, Data Access Object (DAO) tasar\u0131m deseni devreye girerek bu soruna zarif ve etkili bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p>DAO deseni, uygulama katman\u0131n\u0131 veri eri\u015fim mant\u0131\u011f\u0131ndan soyutlayarak, veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftiren bile\u015fenleri ayr\u0131 bir katmana ta\u015f\u0131r. Bu sayede, i\u015f mant\u0131\u011f\u0131 veri kayna\u011f\u0131n\u0131n detaylar\u0131ndan haberdar olmak zorunda kalmaz, bu da uygulaman\u0131n daha mod\u00fcler, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar. Bu makalede, DAO deseninin ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu, temel bile\u015fenlerini, avantajlar\u0131n\u0131, dezavantajlar\u0131n\u0131 ve modern yaz\u0131l\u0131m geli\u015ftirmedeki yerini derinlemesine inceleyece\u011fiz.<\/p>\n<h3>DAO Deseni Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>DAO (Data Access Object), bir uygulama ile kal\u0131c\u0131 depolama mekanizmas\u0131 (genellikle bir veritaban\u0131) aras\u0131nda soyut bir aray\u00fcz sa\u011flayan bir tasar\u0131m desenidir. Bu desenin temel amac\u0131, uygulaman\u0131n i\u015f mant\u0131\u011f\u0131n\u0131 (business logic) veri eri\u015fim mant\u0131\u011f\u0131ndan ay\u0131rmakt\u0131r. Bir ba\u015fka deyi\u015fle, DAO deseni, uygulaman\u0131n veri depolama, alma, g\u00fcncelleme ve silme (CRUD \u2013 Create, Read, Update, Delete) gibi temel veri i\u015flemlerini nas\u0131l ger\u00e7ekle\u015ftirdi\u011fini soyutlar.<\/p>\n<p>Peki, bu soyutlama neden bu kadar \u00f6nemlidir?<br \/>\nYaz\u0131l\u0131m uygulamalar\u0131 genellikle bir veya daha fazla veri kayna\u011f\u0131yla etkile\u015fime girer. Bu veri kaynaklar\u0131 ili\u015fkisel veritabanlar\u0131 (MySQL, PostgreSQL, Oracle), NoSQL veritabanlar\u0131 (MongoDB, Cassandra), XML dosyalar\u0131, d\u00fcz metin dosyalar\u0131 veya hatta uzak web servisleri olabilir. Uygulama i\u00e7inde do\u011frudan veri eri\u015fim kodlar\u0131 yaz\u0131ld\u0131\u011f\u0131nda, \u00f6rne\u011fin i\u015f mant\u0131\u011f\u0131 katman\u0131nda SQL sorgular\u0131 veya JDBC\/JPA API \u00e7a\u011fr\u0131lar\u0131 kullan\u0131ld\u0131\u011f\u0131nda, a\u015fa\u011f\u0131daki sorunlar ortaya \u00e7\u0131kar:<\/p>\n<p>*   <strong>S\u0131k\u0131 Ba\u011f\u0131ml\u0131l\u0131k (Tight Coupling):<\/strong> \u0130\u015f mant\u0131\u011f\u0131, belirli bir veritaban\u0131 teknolojisine veya eri\u015fim y\u00f6ntemine s\u0131k\u0131ca ba\u011flan\u0131r. Veritaban\u0131 teknolojisi de\u011fi\u015fti\u011finde (\u00f6rne\u011fin, MySQL&#8217;den PostgreSQL&#8217;e ge\u00e7i\u015f), i\u015f mant\u0131\u011f\u0131 katman\u0131ndaki t\u00fcm kodlar\u0131n yeniden yaz\u0131lmas\u0131 veya uyarlanmas\u0131 gerekir.<br \/>\n*   <strong>D\u00fc\u015f\u00fck S\u00fcrd\u00fcr\u00fclebilirlik (Low Maintainability):<\/strong> Veri eri\u015fim kodlar\u0131 uygulaman\u0131n farkl\u0131 yerlerine da\u011f\u0131ld\u0131\u011f\u0131nda, veri eri\u015fimle ilgili bir de\u011fi\u015fiklik yap\u0131lmas\u0131 gerekti\u011finde (\u00f6rne\u011fin, bir tablonun ad\u0131 de\u011fi\u015fti\u011finde), bu de\u011fi\u015fikliklerin uygulaman\u0131n her yerinde takip edilmesi ve g\u00fcncellenmesi zorla\u015f\u0131r.<br \/>\n*   <strong>D\u00fc\u015f\u00fck Test Edilebilirlik (Low Testability):<\/strong> \u0130\u015f mant\u0131\u011f\u0131n\u0131 test etmek i\u00e7in ger\u00e7ek bir veritaban\u0131 ba\u011flant\u0131s\u0131 kurmak ve test verileri haz\u0131rlamak gerekir. Bu, birim testlerini yava\u015flat\u0131r ve karma\u015f\u0131kla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Kod Tekrar\u0131 (Code Duplication):<\/strong> Ayn\u0131 veri eri\u015fim mant\u0131\u011f\u0131 farkl\u0131 yerlerde tekrar tekrar yaz\u0131labilir.<br \/>\n*   <strong>Esneklik Eksikli\u011fi (Lack of Flexibility):<\/strong> Uygulama, farkl\u0131 veri kaynaklar\u0131n\u0131 ayn\u0131 anda veya gelecekte kolayca destekleyemez.<\/p>\n<p>DAO deseni, bu sorunlar\u0131 \u00e7\u00f6zerek uygulamalar\u0131n daha sa\u011flam, esnek ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. Veri eri\u015fim katman\u0131n\u0131 soyutlayarak, i\u015f mant\u0131\u011f\u0131 katman\u0131 sadece DAO aray\u00fczleriyle etkile\u015fime girer ve veri eri\u015fiminin detaylar\u0131n\u0131 bilmek zorunda kalmaz.<\/p>\n<h3>DAO Deseninin Temel Bile\u015fenleri<\/h3>\n<p>DAO deseni genellikle \u00fc\u00e7 ana bile\u015fenden olu\u015fur:<\/p>\n<h4>H3.1. Veri Nesnesi (Data Transfer Object &#8211; DTO \/ Entity)<\/h4>\n<p>Veritaban\u0131ndaki bir tabloyu veya bir veri yap\u0131s\u0131n\u0131 temsil eden basit bir Java (veya ilgili programlama dilindeki) s\u0131n\u0131f\u0131d\u0131r. Bu nesneler genellikle yaln\u0131zca veri alanlar\u0131 (alanlar), yap\u0131c\u0131 metotlar (constructor) ve getter\/setter metotlar\u0131 i\u00e7erir. \u0130\u015f mant\u0131\u011f\u0131 i\u00e7ermezler. \u00d6rne\u011fin, bir <code>Kullanici<\/code> tablosu i\u00e7in <code>Kullanici<\/code> ad\u0131nda bir DTO\/Entity s\u0131n\u0131f\u0131 olabilir:<\/p>\n<pre><code class=\"language-java\">public class Kullanici {\n    private Long id;\n    private String ad;\n    private String soyad;\n    private String email;\n\n    \/\/ Constructor, getter ve setter metotlar\u0131\n    public Kullanici() {}\n\n    public Kullanici(Long id, String ad, String soyad, String email) {\n        this.id = id;\n        this.ad = ad;\n        this.soyad = soyad;\n        this.email = email;\n    }\n\n    public Long getId() { return id; }\n    public void setId(Long id) { this.id = id; }\n    public String getAd() { return ad; }\n    public void setAd(String ad) { this.ad = ad; }\n    public String getSoyad() { return soyad; }\n    public void setSoyad(String soyad) { this.soyad = soyad; }\n    public String getEmail() { return email; }\n    public void setEmail(String email) { this.email = email; }\n\n    @Override\n    public String toString() {\n        return \"Kullanici{\" +\n               \"id=\" + id +\n               \", ad='\" + ad + '\\'' +\n               \", soyad='\" + soyad + '\\'' +\n               \", email='\" + email + '\\'' +\n               '}';\n    }\n}<\/code><\/pre>\n<h4>H3.2. DAO Aray\u00fcz\u00fc (DAO Interface)<\/h4>\n<p>Bu, belirli bir veri nesnesi i\u00e7in ger\u00e7ekle\u015ftirilebilecek standart veri eri\u015fim i\u015flemlerini tan\u0131mlayan bir aray\u00fczd\u00fcr. \u0130\u015f mant\u0131\u011f\u0131 katman\u0131 bu aray\u00fcz\u00fc kullanarak veri eri\u015fimi sa\u011flar ve uygulaman\u0131n hangi somut DAO uygulamas\u0131n\u0131 kulland\u0131\u011f\u0131n\u0131 bilmez. Aray\u00fcz, CRUD operasyonlar\u0131n\u0131 ve di\u011fer \u00f6zel sorgular\u0131 tan\u0131mlar.<\/p>\n<pre><code class=\"language-java\">import java.util.List;\nimport java.util.Optional;\n\npublic interface KullaniciDAO {\n    Optional<Kullanici> getById(Long id);\n    List<Kullanici> getAll();\n    void save(Kullanici kullanici); \/\/ Ekleme veya g\u00fcncelleme\n    void update(Kullanici kullanici);\n    void delete(Long id);\n    Optional<Kullanici> getByEmail(String email); \/\/ \u00d6zel sorgu\n}<\/code><\/pre>\n<h4>H3.3. DAO Uygulamas\u0131 (DAO Implementation)<\/h4>\n<p>Bu s\u0131n\u0131f, DAO aray\u00fcz\u00fcn\u00fc uygular ve belirli bir veri kayna\u011f\u0131na (\u00f6rne\u011fin, JDBC, JPA, Hibernate, MongoDB s\u00fcr\u00fcc\u00fcs\u00fc) \u00f6zg\u00fc veri eri\u015fim mant\u0131\u011f\u0131n\u0131 i\u00e7erir. Veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 y\u00f6netir, SQL sorgular\u0131n\u0131 (veya NoSQL komutlar\u0131n\u0131) y\u00fcr\u00fct\u00fcr ve sonu\u00e7lar\u0131 DTO\/Entity nesnelerine e\u015fler.<\/p>\n<pre><code class=\"language-java\">import java.sql.*;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\n\npublic class KullaniciDAOImpl implements KullaniciDAO {\n    private Connection connection; \/\/ Veritaban\u0131 ba\u011flant\u0131s\u0131\n\n    public KullaniciDAOImpl(Connection connection) {\n        this.connection = connection;\n    }\n\n    @Override\n    public Optional<Kullanici> getById(Long id) {\n        String sql = \"SELECT id, ad, soyad, email FROM kullanicilar WHERE id = ?\";\n        try (PreparedStatement statement = connection.prepareStatement(sql)) {\n            statement.setLong(1, id);\n            ResultSet rs = statement.executeQuery();\n            if (rs.next()) {\n                return Optional.of(mapResultSetToKullanici(rs));\n            }\n        } catch (SQLException e) {\n            e.printStackTrace(); \/\/ Hata y\u00f6netimi\n        }\n        return Optional.empty();\n    }\n\n    @Override\n    public List<Kullanici> getAll() {\n        List<Kullanici> kullanicilar = new ArrayList<>();\n        String sql = \"SELECT id, ad, soyad, email FROM kullanicilar\";\n        try (Statement statement = connection.createStatement();\n             ResultSet rs = statement.executeQuery(sql)) {\n            while (rs.next()) {\n                kullanicilar.add(mapResultSetToKullanici(rs));\n            }\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n        return kullanicilar;\n    }\n\n    @Override\n    public void save(Kullanici kullanici) {\n        String sql = \"INSERT INTO kullanicilar (ad, soyad, email) VALUES (?, ?, ?)\";\n        try (PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {\n            statement.setString(1, kullanici.getAd());\n            statement.setString(2, kullanici.getSoyad());\n            statement.setString(3, kullanici.getEmail());\n            statement.executeUpdate();\n\n            ResultSet generatedKeys = statement.getGeneratedKeys();\n            if (generatedKeys.next()) {\n                kullanici.setId(generatedKeys.getLong(1)); \/\/ Olu\u015fturulan ID'yi set et\n            }\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void update(Kullanici kullanici) {\n        String sql = \"UPDATE kullanicilar SET ad = ?, soyad = ?, email = ? WHERE id = ?\";\n        try (PreparedStatement statement = connection.prepareStatement(sql)) {\n            statement.setString(1, kullanici.getAd());\n            statement.setString(2, kullanici.getSoyad());\n            statement.setString(3, kullanici.getEmail());\n            statement.setLong(4, kullanici.getId());\n            statement.executeUpdate();\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void delete(Long id) {\n        String sql = \"DELETE FROM kullanicilar WHERE id = ?\";\n        try (PreparedStatement statement = connection.prepareStatement(sql)) {\n            statement.setLong(1, id);\n            statement.executeUpdate();\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public Optional<Kullanici> getByEmail(String email) {\n        String sql = \"SELECT id, ad, soyad, email FROM kullanicilar WHERE email = ?\";\n        try (PreparedStatement statement = connection.prepareStatement(sql)) {\n            statement.setString(1, email);\n            ResultSet rs = statement.executeQuery();\n            if (rs.next()) {\n                return Optional.of(mapResultSetToKullanici(rs));\n            }\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n        return Optional.empty();\n    }\n\n    private Kullanici mapResultSetToKullanici(ResultSet rs) throws SQLException {\n        return new Kullanici(\n                rs.getLong(\"id\"),\n                rs.getString(\"ad\"),\n                rs.getString(\"soyad\"),\n                rs.getString(\"email\")\n        );\n    }\n}<\/code><\/pre>\n<h4>H3.4. DAO Fabrikas\u0131 (DAO Factory &#8211; Opsiyonel)<\/h4>\n<p>B\u00fcy\u00fck uygulamalarda, farkl\u0131 veri kaynaklar\u0131 i\u00e7in farkl\u0131 DAO uygulamalar\u0131 olabilir (\u00f6rne\u011fin, <code>JdbcKullaniciDAO<\/code>, <code>JpaKullaniciDAO<\/code>, <code>MongoKullaniciDAO<\/code>). Bu durumda, istemci kodunun somut DAO s\u0131n\u0131flar\u0131n\u0131 do\u011frudan \u00f6rneklemesini \u00f6nlemek i\u00e7in bir DAO Fabrikas\u0131 deseni kullan\u0131labilir. Bu fabrika, istemcinin veri kayna\u011f\u0131n\u0131n t\u00fcr\u00fcne g\u00f6re uygun DAO uygulamas\u0131n\u0131 almas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-java\">public abstract class DAOFactory {\n    public static final int JDBC = 1;\n    public static final int JPA = 2;\n    \/\/ ... di\u011fer veri kaynaklar\u0131\n\n    public abstract KullaniciDAO getKullaniciDAO();\n    \/\/ Di\u011fer DAO'lar i\u00e7in abstract metotlar\n\n    public static DAOFactory getDAOFactory(int whichFactory) {\n        switch (whichFactory) {\n            case JDBC:\n                \/\/ Ger\u00e7ek bir uygulamada, burada bir ba\u011flant\u0131 havuzu veya DI \u00e7er\u00e7evesi kullan\u0131l\u0131r.\n                try {\n                    Connection conn = DriverManager.getConnection(\"jdbc:mysql:\/\/localhost:3306\/mydb\", \"user\", \"password\");\n                    return new JdbcDAOFactory(conn); \/\/ JDBC ba\u011flant\u0131s\u0131 alan bir fabrika\n                } catch (SQLException e) {\n                    e.printStackTrace();\n                    return null;\n                }\n            case JPA:\n                \/\/ JPA EntityManagerFactory gibi bir yap\u0131 d\u00f6nd\u00fcr\u00fcl\u00fcr\n                return new JpaDAOFactory();\n            default:\n                return null;\n        }\n    }\n}\n\n\/\/ \u00d6rnek bir JDBC DAO Fabrikas\u0131\nclass JdbcDAOFactory extends DAOFactory {\n    private Connection connection;\n\n    public JdbcDAOFactory(Connection connection) {\n        this.connection = connection;\n    }\n\n    @Override\n    public KullaniciDAO getKullaniciDAO() {\n        return new KullaniciDAOImpl(connection);\n    }\n}\n\n\/\/ \u00d6rnek bir JPA DAO Fabrikas\u0131 (basitle\u015ftirilmi\u015f)\nclass JpaDAOFactory extends DAOFactory {\n    \/\/ EntityManagerFactory vb. y\u00f6netimi burada olur\n    @Override\n    public KullaniciDAO getKullaniciDAO() {\n        \/\/ return new JpaKullaniciDAOImpl(entityManager);\n        return null; \/\/ Ger\u00e7ek bir JPA implementasyonu burada olurdu\n    }\n}<\/code><\/pre>\n<h3>DAO Deseninin Avantajlar\u0131<\/h3>\n<p>DAO deseni, yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerine bir dizi \u00f6nemli avantaj sunar:<\/p>\n<p>*   <strong>Veri Kayna\u011f\u0131 Ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131 (Data Source Independence):<\/strong> \u0130\u015f mant\u0131\u011f\u0131, belirli bir veritaban\u0131 veya veri depolama teknolojisinin detaylar\u0131ndan tamamen ayr\u0131l\u0131r. Bu, veri kayna\u011f\u0131n\u0131 de\u011fi\u015ftirmeyi (\u00f6rne\u011fin, Oracle&#8217;dan PostgreSQL&#8217;e ge\u00e7i\u015f) veya farkl\u0131 veri kaynaklar\u0131n\u0131 ayn\u0131 anda kullanmay\u0131 son derece kolayla\u015ft\u0131r\u0131r. Sadece DAO uygulamas\u0131n\u0131 de\u011fi\u015ftirmeniz yeterlidir.<br \/>\n*   <strong>Geli\u015fmi\u015f S\u00fcrd\u00fcr\u00fclebilirlik (Improved Maintainability):<\/strong> Veri eri\u015fim mant\u0131\u011f\u0131 tek bir yerde topland\u0131\u011f\u0131 i\u00e7in, veritaban\u0131 \u015femas\u0131 veya sorgular de\u011fi\u015fti\u011finde, sadece ilgili DAO s\u0131n\u0131flar\u0131n\u0131n g\u00fcncellenmesi yeterlidir. Bu, kod taban\u0131n\u0131 y\u00f6netmeyi ve hatalar\u0131 d\u00fczeltmeyi kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Y\u00fcksek Test Edilebilirlik (High Testability):<\/strong> \u0130\u015f mant\u0131\u011f\u0131 katman\u0131, ger\u00e7ek bir veritaban\u0131 ba\u011flant\u0131s\u0131 gerektirmeden, DAO aray\u00fczlerinin sahte (mock) uygulamalar\u0131yla test edilebilir. Bu, birim testlerini h\u0131zland\u0131r\u0131r ve basitle\u015ftirir, test kapsam\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>Kod Yeniden Kullan\u0131m\u0131 (Code Reusability):<\/strong> DAO s\u0131n\u0131flar\u0131, uygulaman\u0131n farkl\u0131 b\u00f6l\u00fcmleri taraf\u0131ndan yeniden kullan\u0131labilir, bu da kod tekrar\u0131n\u0131 azalt\u0131r.<br \/>\n*   <strong>Geli\u015fmi\u015f Mod\u00fclerlik (Improved Modularity):<\/strong> Uygulama, i\u015f mant\u0131\u011f\u0131, servis katman\u0131 ve veri eri\u015fim katman\u0131 gibi daha belirgin ve ayr\u0131k mod\u00fcllere b\u00f6l\u00fcn\u00fcr. Bu, uygulaman\u0131n anla\u015f\u0131lmas\u0131n\u0131 ve geli\u015ftirilmesini kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Standardizasyon (Standardization):<\/strong> Veri eri\u015fim operasyonlar\u0131 i\u00e7in tutarl\u0131 bir aray\u00fcz ve yap\u0131 sa\u011flar, bu da farkl\u0131 geli\u015ftiricilerin ayn\u0131 desen \u00fczerinde \u00e7al\u0131\u015fmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>DAO Deseninin Dezavantajlar\u0131 ve Dikkat Edilmesi Gerekenler<\/h3>\n<p>Her tasar\u0131m deseninde oldu\u011fu gibi, DAO deseninin de baz\u0131 potansiyel dezavantajlar\u0131 ve dikkat edilmesi gereken noktalar\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Artan Karma\u015f\u0131kl\u0131k (Increased Complexity):<\/strong> \u00d6zellikle k\u00fc\u00e7\u00fck ve basit uygulamalar i\u00e7in, DAO deseni ek aray\u00fczler ve s\u0131n\u0131flar gerektirdi\u011finden, ba\u015flang\u0131\u00e7ta kod taban\u0131n\u0131 daha karma\u015f\u0131k hale getirebilir. Bu, &#8220;a\u015f\u0131r\u0131 m\u00fchendislik&#8221; (over-engineering) riskini ta\u015f\u0131r.<br \/>\n*   <strong>Tekrarlayan Kod (Boilerplate Code):<\/strong> \u00d6zellikle her varl\u0131k (entity) i\u00e7in CRUD operasyonlar\u0131n\u0131 el ile yazmak, \u00e7ok fazla tekrarlayan kod (boilerplate code) \u00fcretilmesine neden olabilir. Bu durum, jenerikler (generics) veya ORM (Object-Relational Mapping) ara\u00e7lar\u0131 (Hibernate, JPA) ile hafifletilebilir.<br \/>\n*   <strong>Performans Ek Y\u00fck\u00fc (Performance Overhead):<\/strong> \u00c7o\u011fu durumda ihmal edilebilir olsa da, ek katmanlar ve soyutlamalar teorik olarak \u00e7ok k\u00fc\u00e7\u00fck bir performans ek y\u00fck\u00fc getirebilir. Ancak bu, genellikle elde edilen mimari avantajlara de\u011ferdir.<br \/>\n*   <strong>\u0130\u015flem Y\u00f6netimi (Transaction Management):<\/strong> Birden fazla DAO operasyonunun tek bir atomik i\u015flem i\u00e7inde ger\u00e7ekle\u015ftirilmesi gerekti\u011finde (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n olu\u015fturulmas\u0131 ve ard\u0131ndan bir adresin atanmas\u0131), i\u015flem y\u00f6netimi (transaction management) daha dikkatli bir \u015fekilde ele al\u0131nmal\u0131d\u0131r. Genellikle bu, DAO katman\u0131n\u0131n \u00fczerinde bir hizmet katman\u0131 (Service Layer) taraf\u0131ndan y\u00f6netilir.<\/p>\n<h3>En \u0130yi Uygulamalar ve Uygulama Stratejileri<\/h3>\n<p>DAO desenini etkili bir \u015fekilde kullanmak i\u00e7in baz\u0131 en iyi uygulamalar ve stratejiler mevcuttur:<\/p>\n<h4>H3.1. Jenerikler Kullan\u0131m\u0131<\/h4>\n<p>Tekrarlayan CRUD operasyonlar\u0131n\u0131 azaltmak i\u00e7in jenerik (generic) DAO aray\u00fczleri ve s\u0131n\u0131flar\u0131 olu\u015fturulabilir. Bu, her varl\u0131k i\u00e7in ayr\u0131 ayr\u0131 <code>save()<\/code>, <code>findById()<\/code>, <code>findAll()<\/code> gibi metotlar\u0131 yazmaktan kurtar\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ Jenerik DAO Aray\u00fcz\u00fc\npublic interface GenericDAO<T, ID> {\n    Optional<T> findById(ID id);\n    List<T> findAll();\n    void save(T entity);\n    void update(T entity);\n    void delete(ID id);\n}\n\n\/\/ Kullanici DAO Aray\u00fcz\u00fc (Jenerik aray\u00fcz\u00fc geni\u015fletir)\npublic interface KullaniciDAO extends GenericDAO<Kullanici, Long> {\n    Optional<Kullanici> findByEmail(String email);\n}\n\n\/\/ Jenerik DAO Uygulamas\u0131 (\u00d6rnek)\npublic abstract class AbstractJdbcDAO<T, ID> implements GenericDAO<T, ID> {\n    protected Connection connection;\n    protected Class<T> entityClass;\n    protected String tableName;\n\n    public AbstractJdbcDAO(Connection connection, Class<T> entityClass, String tableName) {\n        this.connection = connection;\n        this.entityClass = entityClass;\n        this.tableName = tableName;\n    }\n\n    \/\/ findById, findAll, save, update, delete metotlar\u0131n\u0131 burada jenerik olarak uygulay\u0131n\n    \/\/ Bu metotlar, ResultSet'i T nesnesine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in soyut bir metot kullanabilir.\n    protected abstract T mapResultSetToEntity(ResultSet rs) throws SQLException;\n    protected abstract PreparedStatement prepareStatementForSave(PreparedStatement ps, T entity) throws SQLException;\n    protected abstract PreparedStatement prepareStatementForUpdate(PreparedStatement ps, T entity) throws SQLException;\n}\n\n\/\/ Kullanici DAO Uygulamas\u0131 (Jenerik implementasyonu geni\u015fletir)\npublic class KullaniciJdbcDAOImpl extends AbstractJdbcDAO<Kullanici, Long> implements KullaniciDAO {\n    public KullaniciJdbcDAOImpl(Connection connection) {\n        super(connection, Kullanici.class, \"kullanicilar\");\n    }\n\n    @Override\n    protected Kullanici mapResultSetToEntity(ResultSet rs) throws SQLException {\n        return new Kullanici(\n                rs.getLong(\"id\"),\n                rs.getString(\"ad\"),\n                rs.getString(\"soyad\"),\n                rs.getString(\"email\")\n        );\n    }\n\n    @Override\n    protected PreparedStatement prepareStatementForSave(PreparedStatement ps, Kullanici entity) throws SQLException {\n        ps.setString(1, entity.getAd());\n        ps.setString(2, entity.getSoyad());\n        ps.setString(3, entity.getEmail());\n        return ps;\n    }\n\n    @Override\n    protected PreparedStatement prepareStatementForUpdate(PreparedStatement ps, Kullanici entity) throws SQLException {\n        ps.setString(1, entity.getAd());\n        ps.setString(2, entity.getSoyad());\n        ps.setString(3, entity.getEmail());\n        ps.setLong(4, entity.getId());\n        return ps;\n    }\n\n    @Override\n    public Optional<Kullanici> findByEmail(String email) {\n        String sql = \"SELECT id, ad, soyad, email FROM \" + tableName + \" WHERE email = ?\";\n        try (PreparedStatement statement = connection.prepareStatement(sql)) {\n            statement.setString(1, email);\n            ResultSet rs = statement.executeQuery();\n            if (rs.next()) {\n                return Optional.of(mapResultSetToEntity(rs));\n            }\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n        return Optional.empty();\n    }\n    \/\/ Di\u011fer jenerik metotlar\u0131n somut implementasyonlar\u0131\n    \/\/ \u00d6rne\u011fin, findById, findAll, delete metotlar\u0131 AbstractJdbcDAO i\u00e7inde genel olarak yaz\u0131labilir.\n}<\/code><\/pre>\n<h4>H3.2. Modern \u00c7er\u00e7eveler ve Repository Deseni<\/h4>\n<p>Spring Data JPA gibi modern \u00e7er\u00e7eveler, DAO deseninin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r. Bu \u00e7er\u00e7eveler, &#8220;Repository&#8221; deseni ad\u0131 alt\u0131nda DAO i\u015flevselli\u011fini otomatik olarak sa\u011flarlar. Geli\u015ftiricilerin sadece bir aray\u00fcz tan\u0131mlamas\u0131 ve belirli adland\u0131rma kurallar\u0131na uymas\u0131 yeterlidir; \u00e7er\u00e7eve, \u00e7al\u0131\u015fma zaman\u0131nda bu aray\u00fcz i\u00e7in bir uygulama olu\u015fturur.<\/p>\n<pre><code class=\"language-java\">\/\/ Spring Data JPA \u00f6rne\u011fi\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport java.util.Optional;\n\npublic interface KullaniciRepository extends JpaRepository<Kullanici, Long> {\n    Optional<Kullanici> findByEmail(String email); \/\/ Metot ad\u0131ndan sorgu olu\u015fturulur\n    List<Kullanici> findByAdAndSoyad(String ad, String soyad);\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>KullaniciRepository<\/code> aray\u00fcz\u00fc, <code>JpaRepository<\/code>&#8216;den devrald\u0131\u011f\u0131 i\u00e7in <code>save<\/code>, <code>findById<\/code>, <code>findAll<\/code>, <code>delete<\/code> gibi temel CRUD metotlar\u0131na otomatik olarak sahip olur. Ayr\u0131ca, <code>findByEmail<\/code> gibi \u00f6zel sorgular, metot isimlendirme kurallar\u0131 takip edilerek do\u011frudan aray\u00fcze eklenebilir. Bu, DAO deseninin sa\u011flad\u0131\u011f\u0131 t\u00fcm avantajlar\u0131 korurken, tekrarlayan kod miktar\u0131n\u0131 s\u0131f\u0131ra indirir.<\/p>\n<h4>H3.3. Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection)<\/h4>\n<p>DAO nesnelerinin yarat\u0131lmas\u0131 ve y\u00f6netilmesi i\u00e7in Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (DI) \u00e7er\u00e7eveleri (Spring, Guice vb.) kullan\u0131lmal\u0131d\u0131r. Bu, DAO ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n i\u015f mant\u0131\u011f\u0131 katman\u0131na &#8220;enjekte edilmesini&#8221; sa\u011flayarak, kodun daha esnek ve test edilebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-java\">\/\/ Spring Framework ile ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu\n@Service\npublic class KullaniciService {\n    private final KullaniciDAO kullaniciDAO; \/\/ Aray\u00fcze ba\u011f\u0131ml\u0131l\u0131k\n\n    @Autowired \/\/ Spring, uygun DAO uygulamas\u0131n\u0131 enjekte eder\n    public KullaniciService(KullaniciDAO kullaniciDAO) {\n        this.kullaniciDAO = kullaniciDAO;\n    }\n\n    public Kullanici kullaniciOlustur(Kullanici kullanici) {\n        kullaniciDAO.save(kullanici);\n        return kullanici;\n    }\n\n    public List<Kullanici> tumKullanicilariGetir() {\n        return kullaniciDAO.getAll();\n    }\n\n    \/\/ ... di\u011fer i\u015f mant\u0131\u011f\u0131 metotlar\u0131\n}<\/code><\/pre>\n<h4>H3.4. Hata Y\u00f6netimi<\/h4>\n<p>DAO katman\u0131nda meydana gelen veritaban\u0131 hatalar\u0131 (\u00f6rne\u011fin, ba\u011flant\u0131 sorunlar\u0131, benzersizlik k\u0131s\u0131tlamas\u0131 ihlalleri) uygun \u015fekilde ele al\u0131nmal\u0131 ve daha y\u00fcksek katmanlara anlaml\u0131 istisnalar (exceptions) olarak yay\u0131lmal\u0131d\u0131r. Bu, uygulaman\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h4>H3.5. \u0130\u015flem Y\u00f6netimi (Transaction Management)<\/h4>\n<p>Birden fazla DAO operasyonunun tek bir veritaban\u0131 i\u015flemi (transaction) i\u00e7inde y\u00fcr\u00fct\u00fclmesi gereken senaryolarda, i\u015flem y\u00f6netimi genellikle DAO katman\u0131n\u0131n \u00fczerinde, yani hizmet katman\u0131nda yap\u0131lmal\u0131d\u0131r. Bu, hizmet katman\u0131n\u0131n birden fazla DAO&#8217;yu koordine edebilmesini ve t\u00fcm operasyonlar\u0131n atomik olarak ger\u00e7ekle\u015fmesini sa\u011flar. Spring gibi \u00e7er\u00e7eveler, <code>@Transactional<\/code> anotasyonu ile i\u015flem y\u00f6netimini basitle\u015ftirir.<\/p>\n<pre><code class=\"language-java\">@Service\npublic class SiparisService {\n    @Autowired\n    private SiparisDAO siparisDAO;\n    @Autowired\n    private UrunDAO urunDAO;\n\n    @Transactional \/\/ T\u00fcm metot bir i\u015flem i\u00e7inde \u00e7al\u0131\u015f\u0131r\n    public void siparisOlustur(Siparis siparis, List<Urun> urunler) {\n        siparisDAO.save(siparis);\n        for (Urun urun : urunler) {\n            urunDAO.stokGuncelle(urun, -1); \/\/ Stok azalt\n        }\n        \/\/ E\u011fer herhangi bir i\u015flem ba\u015far\u0131s\u0131z olursa, t\u00fcm\u00fc geri al\u0131n\u0131r (rollback).\n    }\n}<\/code><\/pre>\n<h3>DAO ve Repository Deseni Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/h3>\n<p>DAO ve Repository desenleri, veri eri\u015fim katman\u0131n\u0131 soyutlama konusunda benzer hedeflere sahip olsalar da, aralar\u0131nda ince farklar bulunur:<\/p>\n<p>*   <strong>DAO (Data Access Object):<\/strong> Daha \u00e7ok d\u00fc\u015f\u00fck seviyeli, depolama mekanizmas\u0131na \u00f6zg\u00fc veri eri\u015fim operasyonlar\u0131n\u0131 soyutlar. Genellikle CRUD operasyonlar\u0131n\u0131 ve ham SQL\/NoSQL komutlar\u0131n\u0131 kapsar. Veritaban\u0131 tablolar\u0131yla veya koleksiyonlar\u0131yla do\u011frudan e\u015fle\u015fme e\u011filimindedir.<br \/>\n*   <strong>Repository (Depo):<\/strong> Daha y\u00fcksek seviyeli, bir &#8220;koleksiyon benzeri&#8221; aray\u00fcz sa\u011flar. Veri depolama detaylar\u0131n\u0131 daha da soyutlar ve istemciye, kal\u0131c\u0131 nesneleri bir bellek i\u00e7i koleksiyonmu\u015f gibi davranma imkan\u0131 sunar. Genellikle i\u015f mant\u0131\u011f\u0131 katman\u0131n\u0131n do\u011frudan kullanabilece\u011fi, etki alan\u0131 odakl\u0131 sorgulara odaklan\u0131r. Repository, bir veya daha fazla DAO&#8217;yu i\u00e7erebilir.<\/p>\n<p>Modern \u00e7er\u00e7eveler (\u00f6rne\u011fin, Spring Data JPA), genellikle Repository ad\u0131n\u0131 kullanarak DAO deseninin i\u015flevselli\u011fini sunar. Bu \u00e7er\u00e7eveler, DAO&#8217;nun d\u00fc\u015f\u00fck seviyeli veri eri\u015fimini ve Repository&#8217;nin koleksiyon benzeri aray\u00fcz\u00fcn\u00fc birle\u015ftirir. Bu nedenle, g\u00fcn\u00fcm\u00fczde \u00e7o\u011fu zaman &#8220;DAO&#8221; ve &#8220;Repository&#8221; terimleri birbirinin yerine kullan\u0131labilir hale gelmi\u015ftir, ancak teknik olarak Repository, DAO&#8217;nun \u00fczerine in\u015fa edilmi\u015f daha zengin bir soyutlama katman\u0131 sunar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>DAO tasar\u0131m deseni, yaz\u0131l\u0131m mimarisinde veri eri\u015fim katman\u0131n\u0131 d\u00fczenlemek i\u00e7in g\u00fc\u00e7l\u00fc ve zamana meydan okuyan bir \u00e7\u00f6z\u00fcmd\u00fcr. Uygulama mant\u0131\u011f\u0131n\u0131 veri depolama detaylar\u0131ndan ay\u0131rarak, daha mod\u00fcler, s\u00fcrd\u00fcr\u00fclebilir, esnek ve test edilebilir uygulamalar geli\u015ftirmemizi sa\u011flar. Ba\u015flang\u0131\u00e7ta ek soyutlama katmanlar\u0131 nedeniyle bir miktar karma\u015f\u0131kl\u0131k getirse de, \u00f6zellikle orta ve b\u00fcy\u00fck \u00f6l\u00e7ekli kurumsal uygulamalarda sa\u011flad\u0131\u011f\u0131 uzun vadeli faydalar, bu maliyetin \u00e7ok \u00fczerindedir.<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme \u00e7er\u00e7eveleri (Spring Data JPA gibi), jenerikler ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi tekniklerle birle\u015ftirildi\u011finde, DAO deseninin uygulanmas\u0131 son derece kolayla\u015f\u0131r ve tekrarlayan kod miktar\u0131 minimize edilir. DAO deseni, ister geleneksel ili\u015fkisel veritabanlar\u0131 isterse yeni nesil NoSQL \u00e7\u00f6z\u00fcmleriyle \u00e7al\u0131\u015f\u0131yor olun, veri eri\u015fim stratejilerinizi yap\u0131land\u0131rman\u0131n temel bir yolu olmaya devam etmektedir. Bu desenin prensiplerini anlamak ve uygulamak, her yaz\u0131l\u0131m geli\u015ftiricisinin ara\u00e7 kutusunda bulunmas\u0131 gereken kritik bir beceridir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131\nVeri, modern yaz\u0131l\u0131m uygulamalar\u0131n\u0131n kalbinde yer al\u0131r ve bu verilere eri\u015fim,","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-32220","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131\" \/>\n<meta property=\"og:description\" content=\"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131 Veri, modern yaz\u0131l\u0131m uygulamalar\u0131n\u0131n kalbinde yer al\u0131r ve bu verilere eri\u015fim,\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-19T02:40:43+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131\",\"datePublished\":\"2025-10-19T02:40:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/\"},\"wordCount\":2115,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/\",\"name\":\"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-19T02:40:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/","og_locale":"tr_TR","og_type":"article","og_title":"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131","og_description":"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131 Veri, modern yaz\u0131l\u0131m uygulamalar\u0131n\u0131n kalbinde yer al\u0131r ve bu verilere eri\u015fim,","og_url":"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-19T02:40:43+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131","datePublished":"2025-10-19T02:40:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/"},"wordCount":2115,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/","url":"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/","name":"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-19T02:40:43+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/dao-tasarim-deseni-veri-erisimi-katmanini-soyutlama-sanati\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"DAO Tasar\u0131m Deseni: Veri Eri\u015fimi Katman\u0131n\u0131 Soyutlama Sanat\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32220","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32220"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32220\/revisions"}],"predecessor-version":[{"id":32221,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32220\/revisions\/32221"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32220"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}