{"id":16413850,"url":"https://github.com/celalaygar/interview-q","last_synced_at":"2025-02-24T09:23:38.694Z","repository":{"id":96476497,"uuid":"276303471","full_name":"celalaygar/interview-Q","owner":"celalaygar","description":"Jr., Mid., Sn. Pozisyonları için Java, Spring, Spring Boot, Hibernate, Javascript, React, Database mülakat soruları ve cevapları. ","archived":false,"fork":false,"pushed_at":"2024-05-29T09:45:01.000Z","size":531,"stargazers_count":21,"open_issues_count":0,"forks_count":5,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-01-06T13:35:34.387Z","etag":null,"topics":["interview","interview-java","interview-questions","java-interview-questions","javascript-interview-questions","react-interview-questions"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/celalaygar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-07-01T07:07:41.000Z","updated_at":"2024-08-23T08:47:15.000Z","dependencies_parsed_at":"2024-05-13T19:25:27.754Z","dependency_job_id":"59c03a5e-3bae-4ef1-8298-1f3340d4f9ab","html_url":"https://github.com/celalaygar/interview-Q","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/celalaygar%2Finterview-Q","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/celalaygar%2Finterview-Q/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/celalaygar%2Finterview-Q/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/celalaygar%2Finterview-Q/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/celalaygar","download_url":"https://codeload.github.com/celalaygar/interview-Q/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240450755,"owners_count":19803331,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["interview","interview-java","interview-questions","java-interview-questions","javascript-interview-questions","react-interview-questions"],"created_at":"2024-10-11T06:52:30.323Z","updated_at":"2025-02-24T09:23:38.377Z","avatar_url":"https://github.com/celalaygar.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Genel Mülakat Soruları\n\n+1 +2 +3 Yıl tecrübeliler için Java mülakat soruları\n\n# JAVA - SPRING Mulakat soruları\n\n## Java Class Loader nedir ?\n```\nJava’da ClassLoader, Java programlarındaki sınıf dosyalarını yüklemek için kullanılan bir sınıftır.\nJava kodu, javac derleyicisi tarafından sınıf dosyasına derlenir ve JVM, sınıf dosyasında yazılmış\nbyte kodlarını çalıştırarak Java programını yürütür.\n```\nJava’da üç varsayılan ClassLoader vardır: Bootstrap, Extension ve System (Application) ClassLoader.\n```\n1. Bootstrap ClassLoader : rt.jar ve diğer temel sınıflar gibi standart JDK sınıf dosyalarını yükler.\nTüm ClassLoader’ların atasıdır ve herhangi bir atası yoktur. Primordial ClassLoader olarak da\nadlandırılır.\n\n2. Extension ClassLoader : Bu sınıf yükleyicisi, kullanıcının genişletilmiş sınıf dosyalarını\nyüklemesine izin verir. Bu sınıflar, “java.ext.dirs” olarak tanımlanan özel bir klasörde bulunur.\n\n3. System / Application ClassLoader : Bu sınıf yükleyicisi, kullanıcının kendi sınıf dosyalarını\nyüklemesine izin verir. (Yazılan Kodlar) Bu sınıflar, “java.class.path” olarak tanımlanan özel\nbir klasörde bulunur.\n```\n\n## Java'da String ve StringBuilder arasındaki fark ? \n```\nString: String sınıfı değiştirilemez (immutable) bir sınıftır. Bir String nesnesi oluşturulduktan\nsonra, onun içeriği değiştirilemez. Örneğin, bir String üzerinde herhangi bir değişiklik yapmak\n(bir karakter eklemek, çıkarmak veya değiştirmek) yeni bir String nesnesi oluşturur.\n\nStringBuilder: StringBuilder sınıfı değiştirilebilir (mutable) bir sınıftır. Bir StringBuilder\nnesnesi oluşturulduktan sonra, onun içeriği değiştirilebilir. Bu, aynı nesne üzerinde değişiklik\nyapmanıza olanak tanır ve genellikle daha verimlidir.\n```\n\n## Java'da StringBuilder ve StringBuffer arasındaki fark ? \n```\nStringBuilder: Thread-safe değildir. Bu, StringBuilder nesnesinin aynı anda birden fazla thread\ntarafından güvenli bir şekilde kullanılamayacağı anlamına gelir. Tek thread'li uygulamalarda veya\nbirden fazla thread'in aynı StringBuilder nesnesine erişmeyeceği durumlarda kullanılması uygundur.\n\nStringBuffer: Thread-safe'dir. Bu sınıfın tüm yöntemleri senkronize edilmiştir, yani aynı anda\nbirden fazla thread tarafından güvenli bir şekilde kullanılabilir. Bu nedenle, çok thread'li\nuygulamalarda veya birden fazla thread'in aynı StringBuffer nesnesine erişmesi gereken durumlarda\nkullanılması uygundur.\n```\n\n## Javada Access modifiers nelerdir ? \n```\n1-Default: Aynı sınıftan, altsınıftan ve aynı package'den erişilebilir. Javada bir access modifier\ntanımlanmazsa default olarak kabul edilir ve bu geçerli olur.\n2-Private: Sadece aynı sınıftan erişilebilir.\n3-Protected: Aynı sınıftan, aynı packageden ve alt sınıflardan erişilebilir.\n4-Public: Her yerden erişilebilir.\n```\n\n## ArrayList ile Array arasındaki fark nedir ? \n```\n1- Boyut: Array'ler, boyutları sabit olan veri yapılarıdır, yani tanımlandıkları boyutta kalırlar.\nArrayList'ler ise boyutları dinamik olarak değiştirilebilen veri yapılarıdır, yani öğe sayısı\narttıkça boyutları da otomatik olarak artar.\n\n2- Tür: Array'ler, tek bir türdeki verileri depolamak için kullanılır. ArrayList'ler ise farklı\ntürlerdeki verileri depolamak için kullanılabilir.\n\n3- İşlevsellik: Array'ler, basit bir veri yapısıdır ve sınırlı işlevselliğe sahiptirler.\nArrayList'ler ise daha gelişmiş işlevselliklere sahiptir. Örneğin, ArrayList'lerde verileri\nekleme, silme, sıralama gibi işlemler kolayca yapılabilir.\n\n4- İşlem hızı: Array'ler, verileri doğrudan belleklerinde tuttuklarından hızlı işleme imkanı\nsağlarlar. ArrayList'ler ise verileri heap bellekte tuttuklarından işlem hızı, Array'lere göre\ndaha yavaş olabilir.\n\n5- Tip güvenliği: Array'ler, tür güvenliğine sahiptir. Yani, tanımlanan tür haricinde veri\neklenemez. ArrayList'ler ise tür güvenliği sağlamak için cinsiyetli yapılar ile çalışırlar.\n\n6-Null değerler: Array'ler null değerler içerebilirken, ArrayList'ler null değerleri kabul etmezler.\n```\n\n## List, Set, Hashmap  acıklayınız ?\n```\nSet Nesnesi: Kendisine verilen elemanların her birinde sadece bir tanesini tutar. Kopya ya da\ntekrarlanan elemanları barındırmaz.\n\nList Nesnesi: Kendisine verilen elemanları sıralı şekilde tutar. Tekrarlana elemanları barındırabilir.\n\nMap Nesnesi: Her biri birbirinden farklı anahtarlar ile eşleştirilen nesnelerden oluşur.\n```\n\n## Javada Statement ve PreparedStatement arasındaki farklar?\n```\nPreparedStatement ile SQL ifadelerimizi veritabanımızda önceden derlenmek üzere gönderebileceğimiz ve\nher defasında derlenmiş hale değer göndererek tekrar tekrar kullanabileceğimiz bir yapıdır.\n\nStatement nesnesinde programımız üzerinde ifade derlenip veritabanımız sadece sorgulama işlemini\ngerçekleştirmekte idi.\n```\n##### Statement\n```\n- SQL sorgusunun yalnızca bir kez yürütülmesi gerektiğinde kullanılır.\n- Çalışma zamanında parametreleri iletemezsiniz.\n- Performans çok düşük.\n- Normal SQL sorgularını yürütmek için kullanılır.\n- Binary verileri okumak  ve yazmak için kullanılmaz.\n```\n##### PreparedStatement\n```\n- SQL sorgusunun birden çok kez yürütülmesi gerektiğinde kullanılır\n- Çalışma zamanında parametreleri iletebilirsiniz.\n- Birden çok kez çalıştırılacak sorgular için kullanılır.\n- Performans Statement'ten daha iyidir.\n- Dinamik SQL sorgularını çalıştırmak için kullanılır.\n- Binary verileri okumak  ve yazmak için Readydstatement'ı kullanabiliriz.\n- PreparedStatement, özel karakterlerden otomatik olarak kaçtığı için SQL enjeksiyon\nsaldırılarını önlememize yardımcı olur.\n```\n\n## Java Spring bootda Aspect ile ilgili neler yaptın, ne yapılabilir.\n```\n\n```\n\n## Bir final class da içindekı liste final ise değişiklik yapılabilir mi.\n```\n\n```\n\n## Set içerisinde bir student nesnesi var nesne id ve name barındırıyor. id leri aynı name leri farklı olan objeleri Set'e yerleştirirsek ne olur acıklayınız ?\n```\nher yeni new ile oluşturulan class ların hash code ları farklı olduğundan dolayı\nSet listesine yeni bir farklı obje olarak eklenir. Örnek kod ve çıktısı aşşağıdadır.\n```\n```\npublic static void main(String[] args) {\n    Set\u003cStudent\u003e set = new HashSet\u003cStudent\u003e();\n    set.add(new Student(1, \"cello\"));\n    set.add(new Student(2, \"mello\"));\n    set.stream().forEach(System.out::println);\n}\n\nclass Student{\n    private int id;\n    private String name;\n\n    public Student(int id, String name) {\n        this.id = id;\n        this.name = name;\n    }\n}\n```\nOutput\n```\nmain6.Student@7a81197d\nmain6.Student@5ca881b5\n```\n## ArrayList ile LinkedList arasındaki fark nedir ? \n```\n1- Dizilerde ulaşmak istediğimiz elemana indisini girerek ulaşırız. Linked List’lerde ise\nulaşmak istediğimiz elemanlara point eden pointerlar vasıtasıyla ulaşırız.\n\n2- Dizilerde eleman ekleme, silme gibi işlemler Linked List’lere göre performans açısından\ndaha maliyetlidir. Örneğin; 1000 elemanlı bir dizimiz tanımlı olsun. Bu dizinin 500.cü elemanını\nsilmek istediğimizde, bu elemandan sonra gelen her eleman bir sıra geri kaydırılacak bu da\nperformans kaybına yol açacaktır. Linked List’te ise bu işlem sadece basit pointer\noperasyonlarıyla gerçekleştirilir ve kaydırma işlemlerine gerek kalmaz. Bu sayede\nperformanstan kazanç sağlanmaktadır.\n\n3- Linked List dinamiktir. Dizi tanımlaması yapılırken en başında veri boyutunu belirtmemiz\ngerekirken, Linked List’lerde ihtiyaç duyduğumuzda boyutu artırabilir, silme işlemlerimizden\nsonra Linked List boyutumuzu küçültebiliriz.\n```\n## Final anahtar kelimesi ne işe yarar?\n```\nFinal değişkenler:Değiştirilemez. Static ile beraber Constant olarak kullanılabilir.\nFinal class:Extend edilemez\nFinal methods: Override edilemez.\n```\n\n## Error ve Exception arasındaki farklar ?\n```\nError, jvm tarafından runtime'da handle edilmesi mümkün olmayan türden hatalardır.\nException ise try catch ile handle edilebilir. Java'da exceptionları 5 farklı keyword ile\nhandle edilebilir. -- Try -- Catch -- Finally -- Throw -- Throws\n```\n\n## Checked Exception ve Unchecked Exception arasındaki farklar ?\n```\nRuntimeException ve Error dışında Throwable sınıfını extend eden sınıflar Checked Exceptions\nolarak tanımlanabilir. Checked Exceptionlar compile edilirken alınan hatalardır.\n(IOException, SQLException)\n\nRuntimeException sınıfını extend eden exceptionlar Unchecked Exceptionlar olarak adlandırılır.\nCompile edilirken kontrol edilip gözükmez,\n(ArithmeticException, NullPointerException)\n```\n\n## Java Thread ile VirtuaL Thread arasndaki fark nedir ?\n```\nhttps://medium.com/@onurokkyay/java-virtual-thread-nedir-6049151ac2b8\n```\n```\nJava’da kullandığımız geleneksel threadler (bundan sonra Platform Thread olarak da bahsedeceğiz)\nişletim sistemi tarafından yönetilir ve planlanır. Yeni bir platform thread oluşturmak için bir\nsistem çağrısı yapılmalıdır ve bu maliyetli bir işlemdir.\n\nGeleneksel threadlerin aksine virtual threadler JVM tarafından yönetilir. Bu nedenle, tahsisleri\nbir sistem çağrısı gerektirmez ve işletim sisteminin bağlam anahtarından (context switch) muaftırlar.\nSonuç olarak, sistemin bağlam anahtarından kurtulduğumuz için daha az maliyetle birçok virtual\nthread üretebiliriz.Ayrıca virtual threadler, gerçek çekirdek thread olan taşıyıcı threadler\nüzerinde çalışır. Virtual threadler, Java kodu perspektifinden normal threadler gibi hissedilir,\nancak işletim sistemi threadlerine 1:1 eşlenmezler. Taşıyıcı thread havuzundan uygun olan taşıyıcı\nthreadin üzerine virtual threadler eşlenir.\n```\n\n## Java Multi Thread  nedir ?\n```\nThread safe, birden çok threadin bir kaynağı aynı anda kullanması durumlarında ortaya çıkan\ntutarsızlıkların sonucundaki hatalara karşı; o anki threadin kaynağını güvenceye alan ve bunu o kaynağı\nkullanan tüm threadler için uygulayan bir konsepttir.\n\nAsenkron yani multithreading bir yapıda threadlerin aynı veri kaynağına erişip değiştirmeye çalışması,\nhatalı davranışların sergilenmesine ve tutarlı bir sonuç elde edilememesine neden olabilir. Bu ve\nbunun gibi problemleri önlemek için threadleri güvenli bir şekilde tasarlamak ve geliştirmek gerekir.\nBu metodolojiye thread safe, iş parçacığı güvenliği denir.\n```\n## Serilization nedir?\n```\nBir nesnenin veya bir sınıfın saklanacak forma dönüştürülme işlemidir. Extend edilen Serilization\nsınıfı alt sınıf olan kullanacağımız sınıfın byte'lar halinde streamlere yazılabilir böylece bir\njava objesi veritabanına kaydedilebilir.\n\nDeserilization ise byte haline çevrilen java objesinin eski haline çevrimine denir.\n```\n\n## Java Thread safe ?\n```\nhttps://medium.com/@eda.dlkc/thread-safe-nedir-fe52d21238fa\n```\n```\nhttps://www.gencayyildiz.com/blog/thread-safe-concurrentqueue-concurrentdictionary-concurrentbag-concurrentstack-ve-blockingcollection-koleksiyonlari-ve-kullanim-durumlari/\n```\n\n## JPA Nedir ?\n```\nJPA, Java objeleri ve ilişkisel (relational) database arasında bilgi aktarımı için kullanılan bir\nstandarttır. JPA bu ikisi arasında bir köprü görevi görür. JPA kullanabilmek için projeye implemente\nedilmesi gerekir ve bu yüzden Java dilindeki Hibernate, TopLink gibi çeşitli ORM araçları bilgiler\nkonusunda bir devamlılık sağlamak için JPA kullanır. JPA aracılığıyla farklı ORM araçları ufak birkaç\nayarlama dışında yazılan kod değiştirilmeden kullanılabilir.\n```\n\n## Java ConcurrentHashMap ?\n```\nhttps://medium.com/@mmuratakbiyik/concurrenthashmap-detaylar%C4%B1-ve-temel-kullan%C4%B1m%C4%B1-5bb415d3bcf2\n```\n\n## Spring Scope Türleri nelerdir ?\n```\nSpring Framework içinde “scope” bir nesnenin yaşam döngüsünü ve ne kadar süreyle erişilebilir\nolduğunu tanımlayan bir kavramdır. Spring, çeşitli nesne scope’ları sağlar ve bu scope’lar\nnesnelerin oluşturulma, kullanılma ve yok edilme şeklini belirler.\n\nBu scope’lar, Spring uygulamalarında nesnelerin nasıl yönetileceğini belirlemek için kullanılır. Scope\nbelirleme, nesnelerin doğru zamanda oluşturulması, paylaşılması ve yok edilmesi açısından önemlidir ve\nuygulamanın performansı ve davranışı üzerinde etkili olabilir.\n```\n\n##### singleton Scope \n```\nBir bean default olarak singleton scope’a sahiptir. Bean singleton scope ile tanımlandığı zaman mevcut\napplication context‘imiz içerisinde o bean’den yalnızca tek bir adet initialize edileceğini garanti\nederiz. Bu bean ile yapılacak olan tüm request’ler cache’lenmiş olan aynı nesne üzerinden yapılır. \n```\n##### prototype Scope\n```\nPrototype ile belirlenmiş bir bean, container içerisinde çağırıldığı her request’te yeniden\noluşturulacaktır. Scope notasyonun iki farklı kullanımını aşağıda görebilirsiniz.\n\nPrototype Scope kullandığınızda, her request geldiğinde yeni bir instance döndürür. Diyelim ki bir\nsetter methoduna sahip bir sınıfınız var, şimdi bu sınıf için bir bean oluşturduğunuzda, size her\nzaman sınıfın yeni bir instance’sını verecek ve nesne niteliklerini değiştirmek için setter’ı özgürce\nkullanıp çalışacaktır. \n```\n##### request Scope\n```\nRequest bean’i HTTP isteği geldiğinde oluşturulur. örneğin, bir “ /products” API’niz var, şimdi\ncontroller bu isteği aldığında ve service methodunu çağırdığında, Request Scope ile bir Bean’iniz\nolacak ve bu API isteği yanıtı geri gönderene kadar her zaman nesnenin aynı instance’ını alırsınız,\nancak yeni bir request geldiğinde, yeni bir instance gönderecek.\n```\n##### session Scope\n```\nSession Scope Web Uygulamalarında HTTP isteği geldiğinde oluşturulur. Mesela Spring boot uygulamanız\nkullanıcı sessionlarını sürdürdüğünde, bu scope yardımcı olabilir.\n\nSession Scope kullandığımızda, tüm Session için (kullanıcı düzeyindeki oturumda) her zaman nesnenin\naynı instance’ını return eder. Ancak kullanıcı oturumu kapandığında, yeni bir kullanıcı oturumu için\nnesnenin yeni bir instance’ını alacaksınız.\n```\n##### application Scope\n```\nBir application scope, ServletContext’in yaşam döngüsü için bean örneğini oluşturur. Bu singleton\nscope’a benzer ancak aralarında farklılıklar mevcuttur. Bir bean application scope değerine sahipken\nbu bean çoklu servlet tabanlı uygulamalar ile de paylaşılabilirken, singleton scope değerine sahip\nbir bean yalnızca mevcut application context’i içerisinde tanımlıdır.\n```\n\n## Solid prensipleri nelerdir?\n```\n1-Single responsibilty: Bir nesne ya da bir sınıfın tek bir sorumluluğu olmalıdır.\n2-Open-closed: Bir sınıf değişime kapalı gelişmeye açık olmalıdır.\n3-Liskov's Substitution: Nesneler programın çalışmasında sorun yaratmadan kendi alt örnekleriyle\n  değiştirilebilmelidir.\n4-Interface Segregation: Nesneler ihtiyaç duymadıkları metotların interfacelerinden ayrıştırılmalıdır.\n5-Dependency Inversion: Yüksek seviyeli sınıflar düşük seviyeli sınıflara bağlı olmamalı,\n  her ikisi de soyut kavramlara bağlı olmalıdır.\n```\n\n## Single Responsibilty nedir?\n```\nSingle responsibilty bir nesnenin tek bir amaçla yaratılmasını konu alır. Bağlı olduğu sınıfın\niçerdiği davranışsal özellikler tek bir amaca uygun olmalı başka bir davranış göstermemelidir.\nÖrneğin bir çalışan sınıfı içerisinde vergi hesaplama fonskiyonu bulunamaz. Bu single responsibilty\nprensibine aykırı bir kod yazım şeklidir.\n```\n\n## Dependency Injection nedir?\n```\n\"Dependency Inversion\" prensibinin uygulanmasını içeren bir patterndir.Dependency Injection tekniğinde\nbağımlılık oluşturacak parçalarının ayrılıp, bunların sisteme dışarıdan verilmesi (enjekte edilmesi)\nile meydana gelir. Temel olarak 3 tür DI vardır. Bunlar;\n- Constructor Injection,\n- Setter Injection,\n- Method Injection \nTüm yöntemler bağımlı olan sınıfları dışarıdan enjekte etmeye dayanır.\n```\n\n## DAO nedir?\n```\nDAO Data Access Object ifadesini: Bu araç geliştiricilere özellikle Java kaynaklı veri erişim araçları\nile daha kolay çalışma imkanı sunar. Bir yazılım uygulamasında veritabanı veya diğer veri kaynaklarına\nerişimi sağlayan bir tasarım desenidir. DAO ile diğer katmanlar etkilenmeden veritabanı ve bilgi\nbankası değiştirilebilir. \n```\n\n## @Autowire ve @Qualifier ?\n```\nBu kombinasyon türü uygulamada birçok farklı türde tekil bean bulunduğunda kullanılır. Bu kombinasyon\nher bir ayrı bean'i farklılaştırır.\n\n@Autowired annotasyonu kullanıldığında Spring, bağımlılığı otomatik olarak enjekte eder. Ancak birden\nfazla aday bean olduğunda, hangi bean’in kullanılması gerektiğini belirtmemiz gerekiyor. İşte\n@Qualifier annotasyonu bu seçimi yapmamızı kolaylaştırır.\n```\n\n## Circuat Breaker nedir ?\n```\nCircuit Breaker, bir servisin aşırı yük altında olduğunu veya düzgün çalışmadığını tespit ettiğinde,\notomatik olarak o servise gelen istekleri keser. Bu sayede sistem, tek bir servisin başarısızlığından\ndolayı tamamen çökme durumuna düşmekten korunmuş olur.\n```\n##### spring hystrix ?\n```\nhttps://medium.com/@SametAkgul/circuit-breaker-pattern-e5311f670c2e\n```\n```\nhttps://medium.com/trendyol-tech/nedir-bu-circuit-breaker-pattern-2d3d34948767\n```\n\n##### spring resilience4j?\n```\nhttps://umitsamimi.medium.com/circuit-breaker-resilience4j-7e1082610c52\n```\n\n\n## Spring Boot Interceptor Nedir?\n```\nInterceptor, Spring MVC paketinde bulunan bir sınıftır. HTTP isteklerinin öncesi, sonrası ve\ntamamlandıktan sonra yapılması gereken işlemleri bu sınıf aracılığı ile handle edebilmekteyiz.\n\nGelen isteklerin endpointe ulaşmadan önce işlenmesini sağlamamıza yarayan bir sınıftır. Bir servlete\nbenzer ve DispatcherServlet ten sonra bulunmaktadır. HTTP isteklerini kontrol etmek için kullanılır.\nİstek başlamadan önce çağrılır ve HTTP isteği ile ilgili bilgileri içeren HttpServletRequest nesnesini\nve HTTP isteği ile ilgili yanıtı döndürecek HttpServletResponse nesnesini alır.\n\nRef : \nhttps://blog.burakkutbay.com/spring-boot-interceptor-nedir-uygulama-ornegi.html/\n\nSpring MVC'de interceptor'lar işlemeden önce, işleme sırasında ve işleme sonrasında bir istemcinin\ntalebini yerine getirmek için kullanılır. Kodda istenmeyen herhangi bir tekrardan sakınmak için\nmuhteşem bir araçtır.\n```\n\n## Spring IOC Container ?\n```\nSpring IoC Container, Spring Framework'ün çekirdeğidir. Bu konteyner, nesneleri oluşturur, nesneleri\nbirbirine bağlar, bağımlılıklarını yapılandırır ve tüm yaşam döngüsünü yönetir.\n\nInversion of control bir yazılım tasarım prensibidir. Ioc ile Uygulama içerisindeki obje\ninstance’larının yönetimi sağlanarak, bağımlılıklarını en aza indirgemek amaçlanmaktadır. Projenizdeki\nbağımlılıkların oluşturulmasını ve yönetilmesini geliştiricinin yerine, framework’ün yapması olarak da\naçıklanır.\n\nFramework‘in üzerinde çalıştığımız da görülüyor ki; frameworkler birçok işi kendisi yapmakta ve bizim\nkodumuzu çalıştırmak için framework gerekli kaynakları ve çalışması gereken metotları oluşturup,\nyönetmektedir. Yazdığımız kod bloğu çalışacağı zaman, framework bizim kodumuzu çağırır ve çalıştırır\ndaha sonra kontrol yeniden framework’e geçmesi olayının tümüne Inversion Of Control adı verilmektedir.\n```\n\n## Microservices ler arası iletişim kurma yöntemleri nelerdir?\n```\n- RestTemplate\n- Feign Client\n- GRPC\n```\n\n\n# HIBERNATE Mulakat soruları\n\n## Hibernate Nedir ?\n```\nHibernate yazılım nesnelerin, ilişkisel veri tabanlarındaki (relational databases) kayıtlara\nnasıl karşılık geldiğini yürüten bir teknolojidir.\n\nJava programlama dilinde kullanılan açık kaynaklı bir nesne/ilişkisel eşleme (ORM) aracıdır.\nHibernate, veri tabanı işlemlerini, Java sınıfları arasında doğrudan ilişki kurmak yerine nesnelerin\nsaklanması ve yönetilmesi yoluyla yönetir.\n```\n\nRef : https://www.turkninja.com/2024/02/hibernate-ileri-seviye-interview.html\n\n## Hibernate FetchType EAGER - LAZY Farkları ?\n```\n#FetchType : Aralarında ilişki bulunan entitylerden bir tarafı yüklerken diğer tarafın\nyüklenme stratejisini belirlememize olanak sağlar.\n\nEAGER kullanırsak nesneyi veritabanından çekerken EAGER olan tüm nesneleri de\nberaberinde çekeriz.\n\nLAZY kullanırsak, ihtiyaç duyduğumuzda ilgili veriler çekilecektir.\n```\n\n## Hibernate'de Lazy Loading nedir ve nasıl çalışır ?\n```\nLazy Loading, bir nesnenin ilişkili nesnelerinin ihtiyaç duyulduğunda, yani erişildiğinde\nyüklenmesi yöntemidir. Bu, gereksiz veri yüklemeyi önlemek ve performansı artırmak için\nkullanılır. Hibernate, proxy nesneleri veya bytecode enhancement kullanarak lazy loading'i\ngerçekleştirir.\n```\n\n## Hibernate'de @Entity ve @Table annotasyonlarının farkı nedir?\n```\n@Entity: bir sınıfın bir veritabanı tablosuna karşılık geldiğini Hibernate'e belirtir.\n\n@Table: sınıfın eşleştirildiği tablonun adını ve isteğe bağlı olarak schema adını belirlemek\niçin kullanılır.\n\n@Entity zorunludur, ancak @Table kullanımı isteğe bağlıdır; eğer kullanılmazsa, sınıf adı\ntablo adı olarak varsayılır.\n```\n\n## Hibernate'de Optimistic ve Pessimistic Kilitlenme nedir?\n```\nOptimistic Kilitlenme, veri çakışmalarını önlemek için sürüm numarası veya zaman damgası kullanır.\nVeri güncellenmeden önce, sürüm numarası veya zaman damgasının değişip değişmediği kontrol edilir.\n\nPessimistic Kilitlenme ise, bir kaynağa erişim sırasında veritabanı seviyesinde kilit kullanır,\nböylece diğer işlemler o kaynağı değiştiremez veya okuyamaz.\n\nOptimistic kilitlenme genellikle okuma yoğun uygulamalarda tercih edilirken, Pessimistic kilitlenme\nyazma yoğun işlemlerde veya yüksek çakışma riski olan durumlarda kullanılır.\n```\n\n## Hibernate'de cascade türleri nelerdir ve nasıl kullanılır ?\n```\nHibernate'de cascade türleri, bir nesne üzerinde yapılan işlemlerin ilişkili nesnelere nasıl\nuygulanacağını belirler. Ana cascade türleri: ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH.\n\nÖrneğin,\nbir Parent nesnesi Child nesneleri ile bir ilişki içindeyse ve Parent nesnesi kaydedildiğinde\n(PERSIST) veya güncellendiğinde (MERGE) Child nesnelerinin de otomatik olarak kaydedilmesi veya\ngüncellenmesi isteniyorsa, ilgili cascade türü ilişkide belirtilir.\n```\n\n## Hibernate Query Plan Cache nedir ve performans üzerindeki etkisi nedir?\n```\nHibernate Query Plan Cache, sorgu planlarını önbelleklemek için kullanılır. Bu, aynı sorgunun\ntekrar tekrar çalıştırılması durumunda, sorgu derleme süresini azaltarak performansı artırır.\nÖnbellek, sorgu metni ve bağlamı (örneğin, parametre türleri) bazında sorgu planlarını saklar.\nBu özellik, özellikle karmaşık sorguların ve sık çalıştırılan sorguların olduğu uygulamalarda\nönemli performans iyileştirmeleri sağlayabilir.\n```\n\n## Hibernate'de N+1 sorgu problemi nedir ve nasıl çözülür?\n```\nN+1 sorgu problemi, bir entity ve onun ilişkili nesnelerini yüklerken ortaya çıkan bir performans\nsorunudur. Örneğin, bir Parent entity'si ile ilişkili çok sayıda Child entity'sini yüklerken, ilk\nolarak Parent entity'si için bir sorgu çalıştırılır ve ardından her bir Child için ayrı ayrı sorgular\nçalıştırılır. Bu, toplamda 1 (parent için) + N (N child için) sorgu anlamına gelir ve özellikle N'nin\nbüyük olduğu durumlarda ciddi bir performans düşüklüğüne yol açabilir.\n```\n\n# DATABASE Mulakat soruları\n\n## PostgreSQL de index türleri ?\nhttps://gokhana.dev/postgresql-index-tipleri-ve-index-secimi/\n##### BTREE Index\n```\nBir index yaratıldığında tipi verilmez ise default olarak btree oluşturulmaktadır. Özellikle\n“büyüktür”, “büyük eşittir”, “küçüktür”, “küçük eşittir”, “eşittir”, “between”, “is null”,\n“is not null” gibi sorguların hepsinde kullanılabilir. Like’lı ifadeler ise “sabit değer%”\nşeklinde ise kullanılabilir. Balance tree algoritmasını kullanmaktadır.\n\n- Çoğu sorgu türü için en performanslı seçenektir.”\u003e, \u003e=, \u003c, \u003c=, =, IN, BETWEEN” gibi gibi..\n- Varsayılan/Default sorgu tipidir.\n- Çoklu kolon indexlemesini yapılabilir. \n```\n##### Hash Index\n```\nHash daha çok eşitlik anında kullanılabilen bir index türüdür. Oluşum hızı index yaratma süresi\naçısından Btree’ye göre çok daha fazladır. Ancak kapladığı alan bakımından Btree’ye göre çok\ndaha az bir yer kaplar. Çünkü Btree ağaç yapısında tutulurken, hash flat bir yapıda tutulmaktadır.\n\nHash index, kullanım şekli açısından genellikle B-tree ile karşılaştırılmaktadır.\n\n- Eşitlik operatörü ile yapılan sorgular için iyi bir seçenektir. \n- Hash index, B-Tree indexinden daha az yer kaplar.\n- Tabloya satırlar eklendikçe linear olarak büyüyen B-Tree indexinin aksine, Hash indexi ani\n  artışlarla büyür.\n- Hash indexler ile “unique” constraint kullanılamaz.\n- Hash indexler birden fazla kolon için oluşturulamazlar. \n- Hash indexleme yapılırken sıralama ifadelerine yer verilemez.\n- Hash indexleme yaptığınız bir tablo için Cluster kullanamazsınız.\n```\n##### BRIN: Block range index\n```\nPostgresql verileri varsayılan olarak 8 Kb’lık bloklar halinde saklamaktadır. Brin indexlemede,\nindexler tutulurken bloklar içerisindeki en büyük ve en küçük değerler baz alınır. B-tree’nin\naksine blok içersinde sıralanmış tüm değerler değil, sadece min ve max değerler tutulur. Eski\nadıyla min-max indextir.\n\nB-tree yaratıldığında 8Kb’lık veri setlerinin tümünü saklayacak şekilde bir indexleme yapar. Ancak\nBRIN ındex 8Kb’lık bloklardan sadece minumum ve maximum değerleri alarak index halinde saklar.\n\n- Btree ile karşılaştırıldığında tutalan veri boyutuna bakarsak çok çok daha az\n  olduğunu görebiliriz.\n- Doğrudan bir veri yerine bir aralık üzerinde işlem yapılıyorsa çok performanslı\n  çalışabilir.\n- Sadece belirli veriler index için tutulduğundan ötürü en az yer kaplayan index\n  türüdür.\n- Özellikle big data ve veri analizi alanlarında range işlemlerinin çokluğundan\n  dolayı tercih edilmektedir.\n```\n##### GIN Index\n```\nGeneralized Inverted Index ile her kelime için bir index ve bu indexin içinde aranan ifadenin\ngeçtiği yerlerin listesini sıkıştırılmış olarak tutar.\n\n- Bir kolonda array gibi çoklu verinin olması durumlarında kullanılabilir. Yani metin\n  içinde aramalarda kullanılması önerilir\n- “Full text search” işlerinde kullanılabilir.\n- JSONB üzerinde yapılan aramalarda tercih edilebilir.\n- Range ve array veri tiplerinde kullanılabilir\n- ILIKE ile birlikte ‘%abc%’ şeklindeki aramalarda btree verimli çalışmaz. GIN tercih edilebilir.\n```\n\n##### GIST Index\n```\nGeneralized search tree, full text search için güçlü diğer bir adaydır. Btree karşılaştırma yapıları\niçin kullanılırken, GIST’te ağaç yapısında veri tutmasına karşın daha çok modern veritabanlarındaki\ngeodata, text documents gibi operatorler için kullanılmaktadır.\n\n- Aynı kolonda değerlerin başka satırlarda çakışması durumlarında kullanılabilir.\n- Indexleme yöntemidir ve bu index tipinden birçok index türetilebilir.\n- “Full text search” işlerinde kullanılabilir.\n- Geometrik veri türlerini indexlemek için kullanılırlar.\n```\n## Optimistic Lock Nedir ?\n```\nOptimistic, yani iyimser eş zamanlılık kontrolünde aynı anda bir kaydın update edilmeyeceği varsayılır\nve birden fazla session aynı kaydı update etmek için erişilebilir. Eğer aynı kayıt birden fazla kişi\ntarafından update edilirse kayıtlardan biri iptal olur ve kullanıcıya iptal olduğuna dair bilgilendirme\nyapılır.\n```\n\n## Pessimistic Lock Nedir ?\n```\nPessimistic, yani kötümser eş zamanlılık kontrolünde bir kullanıcı bir kaydı değiştirmek istediğinde\no kayda kilit koyar ve o kaydı başkası değiştiremez. İlk değiştirmeye çalışan kişi kaydı değiştirdikten\nsonra değiştirilen kayıt üzerindeki kilit açılır ve diğer değiştirmek isteyenler artık değiştirebilir\nhale gelir.\n```\n\n## Transaction İsolation ? \n```\nhttps://www.buraksenyurt.com/post/Transaction-larda-Izolasyon-Seviyeleri-(Isolation-Level)-1-bsenyurt-com-dan\n```\n```\nhttps://www.buraksenyurt.com/post/Transaction-larda-Izolasyon-Seviyeleri-2-(IsolationLevel-Numaralandc4b1rc4b1cc4b1sc4b1)-bsenyurt-com-dan\n```\n\n## Oracle Explain Plan Kullanımı ? \n```\nhttps://medium.com/yapi-kredi-teknoloji/oracle-explain-plan-kullan%C4%B1m%C4%B1-a0b5b746018e\n```\n\n## 3. part bir servise istek attığında hata alırsan yapılan işlemleri nasıl geri alırsın ? \n```\nsaga pattern ile yapılabilir. Saga pattern ile konuya özel açıklama yapılması iyi olur.\n```\n\n## CQRC nedir?\n```\nhttps://sefikcankanber.medium.com/cqrs-command-query-responsibility-segregation-nedir-16b196376389\n```\n\n## Apache Kafka ve Rabbit MQ arasındaki farklar nelerdir ?\n```\nhttps://aws.amazon.com/tr/compare/the-difference-between-rabbitmq-and-kafka/\n```\n\n## Saga Pattern nedir ?\n```\nhttps://sefikcankanber.medium.com/saga-pattern-nedir-e4a447bef361\n```\n\n## Domain Driven Design (DDD) ?\n```\nhttps://medium.com/@avniozunlu/domain-driven-design-ddd-151c90472914\n```\n## Domain Driven Design Nedir?\n```\nhttps://medium.com/@avniozunlu/domain-driven-design-ddd-151c90472914\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcelalaygar%2Finterview-q","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcelalaygar%2Finterview-q","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcelalaygar%2Finterview-q/lists"}