Spring Boot Kursu
Spring Boot'u adım adım öğren: Spring Core, Spring MVC, Spring Data JPA, mikroservisler ve ileri konular; gerçek kod örnekleri ve quizlerle.
5 kategoride 39 ders
Spring Core
Dependency Injection ve IoC
Spring'e değinmeden, saf Java ile Inversion of Control, Dependency Injection ve constructor/setter/field injection.
Spring IoC Container ve Bean Yaşam Döngüsü
BeanFactory/ApplicationContext, bean lifecycle, @PostConstruct/@PreDestroy, bean scope'ları, @Lazy ve circular dependency çözümü.
Component Scanning ve Configuration
@Component/@Service/@Repository/@Controller stereotype'ları, @ComponentScan, @Autowired (field/setter/constructor), @Qualifier ve @Primary.
Spring Boot Auto-Configuration ve Properties
@SpringBootApplication, @Conditional ailesi (@ConditionalOnClass/@ConditionalOnMissingBean/@ConditionalOnProperty), @Value, @ConfigurationProperties, @Profile ve ApplicationEvent/@EventListener.
Transaction Management
@Transactional'ın proxy tabanlı mekanizması, rollback kuralları, propagation (REQUIRED/REQUIRES_NEW), self-invocation tuzağı, isolation levels, readOnly, TransactionTemplate ve @TransactionalEventListener.
Spring MVC
Spring MVC Temelleri
DispatcherServlet, MVC deseni (Model/View/Controller) ve @Controller ile @RestController arasındaki fark.
Mapping Annotation'ları ve HTTP Metotları
@RequestMapping ve beş kısayolu (@GetMapping/@PostMapping/@PutMapping/@PatchMapping/@DeleteMapping), consumes/produces ve HTTP metotlarının safe/idempotent semantiği.
Path Variable'lar ve Request Parametreleri
@PathVariable, @RequestParam ve @RequestHeader ile bir HTTP isteğinin URL'sinden ve header'larından veri okumak; path variable ile query parametresi arasındaki fark.
Request ve Response Handling
@RequestBody ile istek gövdesini nesneye çevirmek, ResponseEntity ile yanıtı tam kontrol etmek, HTTP durum kodları ve content negotiation.
Validation & Exception Handling
Bean Validation (@NotBlank, @Size, @Email, @Pattern) ile @Valid, iç içe nesnelerde cascading, @ExceptionHandler, @RestControllerAdvice ve RFC 7807 ProblemDetail ile standart hata yönetimi.
Spring MVC Views ve Thymeleaf
Model, ModelMap ve ModelAndView ile view'a veri taşımanın üç yolu; Thymeleaf'in "natural templating" felsefesi; Thymeleaf değişken/link/mesaj ifadeleri (@{...}, #{...} ve dolar-süslü-parantez erişimi); th:if, th:each, th:fragment; SpringEL seçim ifadeleri (.?[...] / #vars); ve projenin kendi layout'una referansla MVC vs REST karşılaştırması.
Advanced Spring MVC
HandlerInterceptor (preHandle/postHandle/afterCompletion) ve Filter vs Interceptor ayrımı; WebMvcConfigurer ile interceptor kaydı ve global CORS yapılandırması; same-origin policy, preflight request ve @CrossOrigin; MultipartFile ile dosya yükleme ve boyut sınırları.
REST API Tasarımı
Entity'yi doğrudan dışarı vermenin riskleri ve DTO deseni; Pageable/Page/Sort ile sayfalama, sıralama ve query parametreleriyle filtreleme; URI versioning vs header versioning; idempotency ve Idempotency-Key header'ı ile POST'u idempotent yapmak; HATEOAS (kısa bakış).
Spring MVC'de Test Yazmak
MockMvc ve @WebMvcTest ile web katmanı testleri; @MockitoBean ile bağımlılıkları sahteleme; model(), view() ve jsonPath() ile doğrulama; request body, path variable/query param, validation hataları ve multipart dosya yükleme testleri; bu projenin gerçek HomeController'ı ve TopicController'ı için gerçek testler.
Mikroservisler
Microservices Temelleri
Monolitik mimarinin sınırları, mikroservis mimarisinin temel özellikleri, servis sınırlarını (bounded context) belirlemek, database per service, CAP teoremi ve Conway Yasası'na kısa bir bakış -- hiç kod yazmadan, kavramsal bir giriş.
Mikroservis Yapılandırma
Tek bir Spring Boot mikroservisini (order-service) baştan sona yapılandırmak: kendi giriş noktası, kendi application.yml'i (port, uygulama adı, veritabanı), REST controller ile API sözleşmesi, service katmanı, domain modeli ve health check.
Servisler Arası İletişim
order-service'in yanına ikinci bir mikroservis (inventory-service) eklemek ve ikisini Spring'in RestClient'ıyla senkron bir REST çağrısıyla konuşturmak: stok kontrolü, hata yönetimi (servis ayakta değilse ne olur), ve servisler arası DTO ayrımı. Kategorinin gerçek, çalıştırılabilir Pratik Proje'sine buradan ulaşılıyor.
Servis Keşfi ve Eureka
order-service'in inventory-service'i artık sabit kodlanmış bir URL yerine bir İSİMLE bulması: Eureka Server (merkezi kayıt defteri), Eureka Client (spring.application.name'in keşif anahtarına dönüşmesi), DiscoveryClient ile doğrudan sorgu, @LoadBalanced RestClient ile isimle çağrı yapma, heartbeat/eviction/self-preservation modu, ve Eureka'nın CAP teoreminin AP tarafını seçmesi.
API Gateway
order-service ve inventory-service'in artık dış istemciler için tek bir giriş noktası üzerinden erişilebilir olması: Spring Cloud Gateway ile ayrı bir api-gateway uygulaması kurmak, rota (route) predicate/URI/filtre üçlüsü, lb:// ile Eureka üzerinden keşif tabanlı yönlendirme, özel bir GlobalFilter yazmak (kursun ilk reaktif kodu), ve correlation id gibi sistem geneli konuların neden gateway'de kalıp iş mantığının serviste kalması gerektiği.
Resilience4j
order-service'in inventory-service çağrılarını manuel try/catch hata yönetiminin ötesine taşıması: Resilience4j ile @CircuitBreaker (CLOSED/OPEN/HALF_OPEN durum makinesi) ve @Retry annotation'larını ResilientStockClient'a uygulamak, fallback metotlarının devre açıldığında ne yaptığı, Spring proxy mekanizmasının self-invocation'da neden çalışmadığı, ve rate limiter/bulkhead'in circuit breaker'dan farklı bir riske karşı koruması.
Configuration Management
Her servisin şimdiye kadar kendi application.yml'inde tuttuğu yapılandırmayı Spring Cloud Config ile merkezileştirmek: @EnableConfigServer ile ayrı bir config-server uygulaması kurmak, bir Config Repository'nin neyi merkezileştirmeye değdiğine karar vermesi, spring.config.import ile Config Client olmak, profillerle ortam bazlı override, @RefreshScope ile yeniden başlatmadan yapılandırma yenileme, ve sırların neden düz metin olarak saklanmaması gerektiği.
Event-Driven Architecture ve Kafka
Bu kategorideki her servisler arası çağrının şimdiye kadar senkron olmasının yarattığı zaman ve doğrudan-bilgi bağlantısını Kafka ile kaldırmak: topic/partition kavramları, order-service'in KafkaTemplate ile OrderPlacedEvent yayınlaması, inventory-service'in @KafkaListener ile tepki vermesi, senkron vs asenkron arasında ne zaman hangisinin seçileceği, en az bir kez teslimat garantisinin her tüketiciyi idempotent yapmayı gerektirmesi, ve JSON serialization tercihi.
Distributed Transactions
Event-Driven Architecture ve Kafka dersinin açık bıraktığı boşluğu kapatmak -- inventory-service stok rezerve edemezse order-service'in zaten commit ettiği siparişe ne olur: Two-Phase Commit'in mikroservislerde neden nadir olduğu, Saga deseni (yerel işlemler + kompansasyon eylemleri), choreography ile StockReservationFailedEvent üzerinden iki yönlü bir saga akışı kurmak, kompansasyonun bir rollback olmadığı, ve Outbox deseninin bir olayın hiç yayınlanmama riskini kapatması.
Observability
API Gateway ve Resilience4j derslerinin kasıtlı olarak açık bıraktığı iki ipliği kapatmak: correlation id'yi order-service'in kendi loglarına (MDC) ve inventory-service'e giden çağrılara GERÇEKTEN yaymak, structured (JSON) loglama, Micrometer/Actuator ile metrikler, distributed tracing'in aynı correlation id kavramı üzerine inşa edilmesi, ve Resilience4j'nin Micrometer'la zaten otomatik entegre olması.
Security
Bu kategorideki her dersin şimdiye kadar varsaydığı koşulsuz güveni kapatmak: Spring Security'yi projeye ilk kez tanıtmak, authentication vs authorization ayrımı, JWT'nin kendi kendine yeterli doğası, api-gateway ve order-service'te AYRI AYRI JWT doğrulaması (zero trust), role-bazlı authorization, ve kimliğin correlation id'ye paralel şekilde servisler arası yayılması.
Deployment
Bu kategorinin şimdiye kadar her dersinin localhost varsayımının gerçek dünyada nasıl deploy edildiği: multi-stage Dockerfile ile küçük image'lar, tüm sistemi (eureka-server, config-server, api-gateway, order-service, inventory-service, Kafka) tek bir docker-compose dosyasında orkestre etmek, container'larda ortam değişkeni ile yapılandırma, depends_on'un health check olmadan neden yetmediği, ve Kubernetes'e kısa/dürüst bir bakış.
İleri Spring
Java Bean Validation
Spring MVC'nin "Validation & Exception Handling" dersinin üzerine inşa edilir -- işaret kısıtları (@Positive/@PositiveOrZero/@Negative/@NegativeOrZero), tarih/saat kısıtları (@Past/@Future/@PastOrPresent/@FutureOrPresent), tam ondalık sınırlar (@DecimalMin/@DecimalMax/@Digits), validation mesajlarını özelleştirmek, custom constraint annotation + ConstraintValidator ile çapraz alan validasyonu, ve validation grupları. Advanced Spring serisinin 1.'si.
Exception Handling
Spring MVC'nin "Validation & Exception Handling" ve bu kategorinin "Java Bean Validation" derslerinin üzerine inşa edilir -- MethodArgumentNotValidException'ın gerçekte ne taşıdığı, validasyon hatalarını ProblemDetail'e dönüştürmek (çapraz-alan hatalar dahil), custom ProblemDetail özellikleri, domain exception'ları doğru HTTP durum koduna (400/404/409/422/500) eşlemek, ResponseEntityExceptionHandler ile merkezileştirme, ve internal detay sızdırmayan güvenli hata yanıtları. Advanced Spring serisinin 2. ve son dersi.
Task Execution & Scheduling
"Threads"in dil seviyesinde işlediği thread pool temelinin üzerine inşa edilir -- Spring'in TaskExecutor soyutlaması, @Async ve @EnableAsync ile arka plan işi, self-invocation'ın @Async'i neden bozduğu ("Transaction Management"taki AYNI proxy tuzağı), @Scheduled ile fixed rate/fixed delay/initial delay/cron ifadeleri, ve scheduling'in kendi ayrı thread pool'unun (TaskScheduler) yapılandırılması. Advanced Spring serisinin 3.'sü.
Spring Batch
Neden büyük ölçekli batch işlemlerinin `@Scheduled`'ın tek başına sağlayamadığı bir yapıya ihtiyacı olduğu -- Job/Step/chunk-odaklı işleme zihinsel modeli, tek bir CSV-'den-veritabanına sipariş içe aktarma örneği boyunca ItemReader/ItemProcessor/ItemWriter, JobParameters/JobInstance/JobExecution ayrımı, JobRepository ile yeniden başlatılabilirlik, skip/retry fault tolerance, ve `@Scheduled` ile pratik birleşim. Advanced Spring serisinin 4.'sü.
Spring Data JPA
JPA, Hibernate ve Spring Data JPA
Bir Java nesnesini bir veritabanına kalıcı hale getirme sorunundan başlayarak, ORM → JPA (spesifikasyon) → Hibernate (implementasyon) → Spring Data JPA (repository soyutlaması) → Spring Boot (auto-configuration) zihinsel modeli, bu projenin gerçek Topic/TopicRepository sınıflarıyla inşa ediliyor. Spring Data JPA kategorisinin 1.'si.
Entities and the Repository Abstraction
@Entity/@Id/@GeneratedValue/@Column mapping'i, @Table/@Enumerated/nullable-unique kısıtları/argümansız constructor/entity vs DTO/equals()-hashCode() (kısaca), ve Repository → CrudRepository → PagingAndSortingRepository → JpaRepository hiyerarşisinin her katmanının ne kattığı -- bu projenin gerçek Topic/Category/TopicRepository sınıflarıyla. Spring Data JPA kategorisinin 2.'si.
Query Methods and JPQL with @Query
Spring Data JPA'nın bir repository metodunun adından bir sorguyu nasıl çıkardığı (findBy/existsBy/countBy, And/Or/OrderBy), @Query ile JPQL yazmak ve isimli parametreler, toplu güncelleme/silme için @Modifying, join fetch, ve ne zaman bir native query'ye başvurulacağı -- bu projenin gerçek repository'leriyle. Spring Data JPA kategorisinin 3.'sü.
Pagination, Sorting, and Projections
"REST API Tasarımı"nın controller-seviyesinde çözdüğü Pageable/Sort'un, repository seviyesinde gerçekte nasıl LIMIT/OFFSET + count sorgusuna dönüştüğü, findAll(Sort)/derived metotlarla sıralama, ve bütün bir entity yerine yalnızca ihtiyaç duyulan alanları döndüren interface-tabanlı ve record/constructor-expression projection'lar -- bu projenin gerçek Topic/TopicTranslation sınıflarıyla. Spring Data JPA kategorisinin 4.'sü.
Dynamic Queries with Specifications
"REST API Tasarımı"nın bellek içinde bıraktığı isteğe bağlı filtrelemeyi, JPA'nın Criteria API'si (Root/CriteriaQuery/CriteriaBuilder/Predicate) üzerine ince bir sarmalayıcı olan Specification interface'i, JpaSpecificationExecutor, Specification.where/and/or ile birleştirme, ve findAll(Specification, Pageable) ile gerçek sayfalamayla birleştirme -- bu projenin gerçek Topic entity'siyle. Spring Data JPA kategorisinin 5.'si.
Relationships, Fetching, and the N+1 Problem
@OneToMany/@ManyToMany mapping ("Transaction Management"in zaten kapsamlıca işlediği @ManyToOne'un ötesinde), cascade türleri (PERSIST/MERGE/REMOVE/ALL) ve orphanRemoval, N+1 probleminin somut gösterimi, ve @EntityGraph/batch fetching/projection'larla üç farklı düzeltme -- bu projenin gerçek Topic/Category/QuizQuestion sınıflarıyla. Spring Data JPA kategorisinin 6.'sı.
The Persistence Context and Locking
"Transaction Management"in zaten kapsamlıca işlediği dirty checking'in NEDEN çalıştığı -- persistence context'in kendisi, entity yaşam döngüsü durumları (transient/managed/detached/removed), first-level cache, persist/merge/detach, flush zamanlaması -- ve iki transaction aynı satıra dokunduğunda ne olduğu: @Version ile optimistic locking, @Lock ile pessimistic locking. Spring Data JPA kategorisinin 7.'si.
Auditing in Spring Data JPA
Bu projenin gerçek QuestionIngestService'inin elle yazdığı LocalDateTime.now() deseninden başlayarak, @CreatedDate/@LastModifiedDate, @EntityListeners(AuditingEntityListener.class) + @EnableJpaAuditing bağlantısı, @CreatedBy/@LastModifiedBy, AuditorAware<T>, ve @MappedSuperclass ile audit alanlarını paylaşmak. Spring Data JPA kategorisinin 8.'si.
Testing Spring Data JPA Repositories
"Spring MVC'de Test Yazmak"ın yalnızca isim olarak andığı @DataJpaTest ve TestEntityManager -- bu projenin kendi Mockito-mock'lanmış servis testlerinin bırakmadan geçtiği boşluğu (bir sorgunun gerçekten çalıştığının hiç doğrulanmaması) kapatıyor; derived query/custom @Query testi, ve embedded test veritabanı vs gerçek PostgreSQL vs Testcontainers -- bu projenin kendi application-test.yml'inin gerçek yorumuna dayanarak. Spring Data JPA kategorisinin 9. ve son dersi.