← Kursa Dön
📄 Text · 20 min

Spring Boot Proje Anatomisi

Giriş

Bir Spring Boot projesi oluşturduğunuzda karşınıza çıkan dosyalar ne işe yarar? pom.xml neden bu kadar önemli? @SpringBootApplication arka planda ne yapar? Bu derste bir Spring Boot projesini katman katman inceleyeceğiz.

Proje Dizin Yapısı

demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/demo/
│   │   │       ├── DemoApplication.java      # Ana giriş noktası
│   │   │       ├── controller/               # REST Controller'lar
│   │   │       ├── service/                  # İş mantığı
│   │   │       ├── repository/               # Veri erişim
│   │   │       ├── model/                    # Entity/DTO sınıfları
│   │   │       └── config/                   # Konfigürasyon sınıfları
│   │   └── resources/
│   │       ├── application.properties        # Uygulama konfigürasyonu
│   │       ├── application.yml               # YAML alternatifi
│   │       ├── static/                       # Statik dosyalar (CSS, JS)
│   │       └── templates/                    # Thymeleaf şablonları
│   └── test/
│       └── java/
│           └── com/example/demo/
│               └── DemoApplicationTests.java  # Test sınıfları
├── pom.xml                                   # Maven konfigürasyonu
├── mvnw / mvnw.cmd                           # Maven Wrapper
└── .gitignore

pom.xml Detaylı İnceleme

Parent POM

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.3.0</version>
    <relativePath/>
</parent>

Parent POM şunları sağlar:

  • Tüm Spring ve 3rd party kütüphanelerin versiyon yönetimi (BOM — Bill of Materials)

  • Java versiyon ayarı, encoding ayarı

  • Maven plugin konfigürasyonları

  • Resource filtering

Starter Dependencies

<dependencies>
    <!-- Web uygulaması: Spring MVC + Embedded Tomcat + Jackson -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Test: JUnit 5 + Mockito + AssertJ + Spring Test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

Spring Boot Maven Plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Bu plugin ile: mvn package → çalıştırılabilir fat JAR oluşturulur.

application.properties vs application.yml

İki format da desteklenir, işlevsel olarak eşdeğerdir:

# application.properties
server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.jpa.hibernate.ddl-auto=update
logging.level.root=INFO
# application.yml
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
  jpa:
    hibernate:
      ddl-auto: update
logging:
  level:
    root: INFO

Tercih: YAML hiyerarşik yapısıyla daha okunabilirdir, ancak indent hataları sorun çıkarabilir. Ekibinizle bir standart belirleyin.

@SpringBootApplication Anatomisi

@SpringBootApplication // Aşağıdaki 3 annotation'ı birleştirir
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

// Eşdeğeri:
@SpringBootConfiguration   // @Configuration'ın özelleştirilmiş hali
@EnableAutoConfiguration   // Classpath taraması ile otomatik bean konfigürasyonu
@ComponentScan             // Bu paketin altındaki tüm @Component'leri tarar
public class DemoApplication { }
  • @SpringBootConfiguration: Bu sınıfın bir konfigürasyon kaynağı olduğunu belirtir

  • @EnableAutoConfiguration: spring-boot-autoconfigure modülündeki tüm auto-config sınıflarını aktifleştirir

  • @ComponentScan: Aynı paketteki ve alt paketlerdeki @Component, @Service, @Repository, @Controller sınıflarını tarar

main() Metodu

public static void main(String[] args) {
    // SpringApplication.run() şunları yapar:
    // 1. ApplicationContext oluşturur
    // 2. Auto-configuration çalıştırır
    // 3. Component scanning yapar
    // 4. Embedded server başlatır
    // 5. ApplicationRunner/CommandLineRunner bean'lerini çağırır
    SpringApplication.run(DemoApplication.class, args);
}

Uygulama başlarken görünen ASCII art banner'ı özelleştirebilirsiniz:

# src/main/resources/banner.txt
=======================================
  __  __         _____           _
 |  \/  |_   _  |  _  |_ __ ___(_)
 | |\/| | | | | | |_) | '__/ _ \ |
 | |  | | |_| | |  __/| | | (_) | |
 |_|  |_|\__, | |_|   |_|  \___// |
         |___/                 |__/
 :: Spring Boot :: ${spring-boot.version}
=======================================
# Banner'ı kapatma
spring.main.banner-mode=off

Best Practices

İpucu: Ana uygulama sınıfını (@SpringBootApplication) root package'a koyun. Böylece @ComponentScan tüm alt paketleri otomatik tarar.

Uyarı: @SpringBootApplication sınıfını com.example.demo paketine koyduysanız, com.example.other paketindeki bean'ler taranmaz. Farklı paketleri taramak için @ComponentScan(basePackages = {...}) kullanın.

Özet

Spring Boot projesinin her dosyası bir amaca hizmet eder. pom.xml bağımlılık ve build yönetimini, application.properties/yml uygulama ayarlarını, @SpringBootApplication ise uygulamanın çalışma altyapısını belirler. Bu yapıyı iyi anlamak, karşılaşacağınız hataları hızlıca çözmenizi sağlar.