logo
eng-flag

Spring Boot Notları ve İpuçları

İçindekiler

  1. Spring Boot Temelleri
  2. Spring Boot Anotasyonları
  3. Spring Boot Yapılandırması
  4. Spring Boot Veri Erişimi
  5. Spring Boot Web
  6. Spring Boot Testi
  7. Spring Boot Actuator
  8. Spring Boot Güvenliği
  9. Spring Boot En İyi Uygulamaları

Spring Boot Temelleri

Spring Boot Nedir?

Spring Boot, minimum yapılandırma ile bağımsız, üretime hazır Spring tabanlı uygulamalar oluşturmak için kullanılan açık kaynaklı bir Java çerçevesidir.

Temel Özellikler

  • Önceden belirlenmiş 'başlangıç' bağımlılıkları
  • Gömülü sunucu
  • Otomatik yapılandırma
  • Üretime hazır özellikler

Spring Boot Projesi Oluşturma

Spring Boot projesi oluşturmak için şunları kullanabilirsiniz:

  1. Spring Initializr (https://start.spring.io/)
  2. IDE'niz (IntelliJ IDEA, Eclipse, vb.)
  3. Spring Boot CLI

Spring Boot CLI kullanarak örnek:

spring init --dependencies=web,data-jpa my-project
cd my-project

Spring Boot Anotasyonları

Temel Anotasyonlar

  • @SpringBootApplication: @Configuration, @EnableAutoConfiguration ve @ComponentScan'i birleştirir
  • @Configuration: Bir sınıfın bir veya daha fazla @Bean metodu bildirdiğini belirtir
  • @EnableAutoConfiguration: Spring Boot'un otomatik yapılandırma mekanizmasını etkinleştirir
  • @ComponentScan: Spring'e mevcut paket ve alt paketlerinde bileşenleri aramasını söyler

Web Anotasyonları

  • @Controller: Sınıfı bir web denetleyicisi olarak işaretler
  • @RestController: @Controller ve @ResponseBody'yi birleştirir
  • @RequestMapping: HTTP isteklerini işleyici metodlara eşler
  • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping: Belirli bir HTTP metodu için @RequestMapping kısayolu

Örnek:

@RestController
@RequestMapping("/api")
public class KullaniciController {
    @GetMapping("/kullanicilar")
    public List<Kullanici> tumKullanicilariAl() {
        // Uygulama
    }
}

Veri Anotasyonları

  • @Entity: Sınıfın bir varlık olduğunu ve bir veritabanı tablosuna eşlendiğini belirtir
  • @Repository: Sınıfın bir depo olduğunu belirtir
  • @Service: Sınıfın bir servis olduğunu belirtir
  • @Autowired: Bir yapıcı, alan veya setter metodunun Spring'in bağımlılık enjeksiyonu tarafından otomatik bağlanacağını işaretler

Örnek:

@Entity
public class Kullanici {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String ad;
    // getter ve setter'lar
}

@Repository
public interface KullaniciRepository extends JpaRepository<Kullanici, Long> {
}

@Service
public class KullaniciService {
    @Autowired
    private KullaniciRepository kullaniciRepository;
    // metodlar
}

Spring Boot Yapılandırması

Uygulama Özellikleri

Spring Boot yapılandırma için application.properties veya application.yml kullanır.

Örnek application.properties:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password

Profiller

Profiller, ortama özgü yapılandırmaları tanımlamanıza olanak tanır.

Örnek:

# application-dev.properties
server.port=8080

# application-prod.properties
server.port=80

Bir profili etkinleştirme:

java -jar myapp.jar --spring.profiles.active=prod

Özel Yapılandırma

Özel yapılandırma sınıfları oluşturabilirsiniz:

@Configuration
public class BenimYapilandirmam {
    @Bean
    public BenimServism benimServism() {
        return new BenimServisImpl();
    }
}

Spring Boot Veri Erişimi

JPA Depoları

Spring Data JPA, veri erişim katmanı uygulamasını basitleştirir.

Örnek:

public interface KullaniciRepository extends JpaRepository<Kullanici, Long> {
    List<Kullanici> findBySoyad(String soyad);
}

Depoları Kullanma

@Service
public class KullaniciService {
    @Autowired
    private KullaniciRepository kullaniciRepository;

    public Kullanici kullaniciOlustur(Kullanici kullanici) {
        return kullaniciRepository.save(kullanici);
    }

    public List<Kullanici> soyadaGoreKullanicilariAl(String soyad) {
        return kullaniciRepository.findBySoyad(soyad);
    }
}

Spring Boot Web

RESTful Web Servisleri

Spring Boot ile RESTful API'leri kolayca oluşturun.

Örnek:

@RestController
@RequestMapping("/api/kullanicilar")
public class KullaniciController {
    @Autowired
    private KullaniciService kullaniciService;

    @GetMapping
    public List<Kullanici> tumKullanicilariAl() {
        return kullaniciService.tumKullanicilariAl();
    }

    @PostMapping
    public Kullanici kullaniciOlustur(@RequestBody Kullanici kullanici) {
        return kullaniciService.kullaniciOlustur(kullanici);
    }

    @GetMapping("/{id}")
    public Kullanici idIleKullaniciAl(@PathVariable Long id) {
        return kullaniciService.idIleKullaniciAl(id);
    }
}

İstisna İşleme

Global istisna işleme için @ControllerAdvice kullanın:

@ControllerAdvice
public class GlobalIstisnaiDurumIsleyici {
    @ExceptionHandler(KullaniciBulunamadiException.class)
    public ResponseEntity<?> kullaniciBulunamadiExceptionIsle(KullaniciBulunamadiException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }
}

Spring Boot Testi

Birim Testi

Entegrasyon testleri için @SpringBootTest kullanın:

@SpringBootTest
class KullaniciServiceTest {
    @Autowired
    private KullaniciService kullaniciService;

    @Test
    void testKullaniciOlustur() {
        Kullanici kullanici = new Kullanici("Ahmet Yılmaz");
        Kullanici kaydedilenKullanici = kullaniciService.kullaniciOlustur(kullanici);
        assertNotNull(kaydedilenKullanici.getId());
        assertEquals("Ahmet Yılmaz", kaydedilenKullanici.getAd());
    }
}

Denetleyici Testi için MockMvc

MockMvc kullanarak denetleyicilerinizi test edin:

@WebMvcTest(KullaniciController.class)
class KullaniciControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private KullaniciService kullaniciService;

    @Test
    void testTumKullanicilariAl() throws Exception {
        List<Kullanici> kullanicilar = Arrays.asList(new Kullanici("Ahmet"), new Kullanici("Ayşe"));
        when(kullaniciService.tumKullanicilariAl()).thenReturn(kullanicilar);

        mockMvc.perform(get("/api/kullanicilar"))
               .andExpect(status().isOk())
               .andExpect(jsonPath("$", hasSize(2)))
               .andExpect(jsonPath("$[0].ad", is("Ahmet")))
               .andExpect(jsonPath("$[1].ad", is("Ayşe")));
    }
}

Spring Boot Actuator

Spring Boot Actuator, uygulamanızı izlemenize ve yönetmenize yardımcı olmak için üretime hazır özellikler sağlar.

Actuator'ı Etkinleştirme

Bağımlılığı ekleyin:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Uç Noktalar

Bazı faydalı actuator uç noktaları:

  • /actuator/health: Uygulama sağlık bilgilerini gösterir
  • /actuator/info: Rastgele uygulama bilgilerini görüntüler
  • /actuator/metrics: Metrik bilgilerini gösterir
  • /actuator/env: Spring'in ConfigurableEnvironment'ından özellikleri gösterir

Özel Sağlık Göstergesi

Özel bir sağlık göstergesi oluşturun:

@Component
public class OzelSaglikGostergesi implements HealthIndicator {
    @Override
    public Health health() {
        int hataKodu = kontrol();
        if (hataKodu != 0) {
            return Health.down().withDetail("Hata Kodu", hataKodu).build();
        }
        return Health.up().build();
    }

    private int kontrol() {
        // Belirli bir sağlık kontrolü gerçekleştirin
        return 0;
    }
}

Spring Boot Güvenliği

Temel Güvenlik Yapılandırması

Güvenlik başlangıcını ekleyin:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Temel kimlik doğrulamayı yapılandırın:

@Configuration
@EnableWebSecurity
public class GuvenlikYapilandirmasi extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/anasayfa").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/giris")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("kullanici").password("{noop}parola").roles("KULLANICI");
    }
}

Spring Boot En İyi Uygulamaları

  1. Projelerinizi başlatmak için Spring Initializr kullanın
  2. Net bir paket yapısı izleyin (örn. controller, service, repository, model)
  3. Alan enjeksiyonu yerine yapıcı enjeksiyonu kullanın
  4. Özellik dosyalarını kullanarak yapılandırmayı dışsallaştırın
  5. Ortama özgü yapılandırmalar için profilleri kullanın
  6. Birim ve entegrasyon testleri yazın
  7. İzleme ve metrikler için Spring Boot Actuator kullanın
  8. Uygun istisna işleme uygulayın
  9. API'nizi etki alanı modelinizden ayırmak için DTO'lar (Veri Transfer Nesneleri) kullanın
  10. Logback ile SLF4J kullanarak uygun günlük kaydı uygulayın

Yapıcı enjeksiyonu örneği:

@Service
public class KullaniciService {
    private final KullaniciRepository kullaniciRepository;

    @Autowired
    public KullaniciService(KullaniciRepository kullaniciRepository) {
        this.kullaniciRepository = kullaniciRepository;
    }
    
    // Servis metodları
}

2024 © Tüm hakları saklıdır - buraxta.com