Temiz kodlama pratikleri, Spring Boot uygulamalarınızın bakımını kolaylaştırır, okunabilirliğini artırır ve geliştirilebilirliğini sağlar. Bu rehber, hem Java hem de Kotlin'de daha temiz ve verimli kod yazmanıza yardımcı olacak temel ipuçları ve kod örneklerini sunar.
Yazan
Şuayb Şimşek
Spring Boot, güvenlik, mikroservis ve cloud-native mimari konularında pratik teknik notlar paylaşan backend odaklı fullstack geliştirici.
Aşağıdaki örnek, Örnek: Lombok ile Entity için pratik bir bağlam sunar ve doğrudan uygulanabilir.
JAVAUser.java
package com.example.cleanproject.entity;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
Faydalar:
@Data, getter, setter, equals, hashCode ve toString metotlarını otomatik olarak oluşturur.
@NoArgsConstructor ve @AllArgsConstructor yapıcı metotları oluşturur.
🛠️ Adım 3: Kotlin'de Kısa ve Okunabilir Kod Yazın
Kotlin, modern özellikleri ile doğal olarak daha temiz kod yazılmasını sağlar:
Örnek: Kotlin ile Entity
Aşağıdaki örnek, Örnek: Kotlin ile Entity için pratik bir bağlam sunar ve doğrudan uygulanabilir.
KOTLINUser.kt
package com.example.cleanproject.entity
import jakarta.persistence.*
@Entity
data class User(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0,
var name: String,
var email: String
)
Kotlin'in Avantajları:
data class, toString, equals ve hashCode metotlarını otomatik olarak oluşturur.
Değişmez özellikler (val) daha iyi stabilite sağlar.
🛠️ Adım 4: Dependency Injection Prensiplerini Takip Edin
Bileşenleri ayırmak ve test edilebilirliği arttırmak için dependency injectionu kullanın.
Örnek: Service Katmanı ile DI
Aşağıdaki örnek, Örnek: Service Katmanı ile DI için pratik bir bağlam sunar ve doğrudan uygulanabilir.
🛠️ Adım 5: Veri Transferi İçin DTO'ları Kullananın
Data Transfer Object (DTO), domain ve API katmanlarını ayırarak daha iyi kapsülleme sağlar.
Örnek: User İçin DTO
Aşağıdaki örnek, Örnek: User İçin DTO için pratik bir bağlam sunar ve doğrudan uygulanabilir.
Controller Katmanı
HTTP isteklerini yönetmek ve service katmanıyla etkileşim sağlamak için bir controller uygulayın.
▶️ Uygulamayı Çalıştırma
Uygulamayı aşağıdaki komutla çalıştırın:
BASH
./mvnw spring-boot:run
Postman veya cURL gibi bir aracı kullanarak endpoint'leri test edin.
🧪 API'yi Test Edin
API'yi aşağıdaki cURL komutu ile test edebilirsiniz:
Tüm kullanıcıları getir:
BASH
curl -X GET http://localhost:8080/api/users
🏁 Sonuç
Artık Spring Boot Temiz Kodlama Pratikleri için üretim odaklı bir Spring Boot temeliniz var. Sonraki adımda ayarları kendi domainine uyarlayıp test ve gözlemlenebilirlik katmanını ekleyerek gerçek trafik altında doğrulayın.
JAVAUserService.java
package com.example.cleanproject.service;
import com.example.cleanproject.entity.User;
import com.example.cleanproject.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public List<User> getAllUsers() {
return userRepository.findAll();
}
}
KOTLINUserService.kt
package com.example.cleanproject.service
import com.example.cleanproject.entity.User
import com.example.cleanproject.repository.UserRepository
import org.springframework.stereotype.Service
@Service
class UserService(
private val userRepository: UserRepository
) {
fun getAllUsers(): List<User> = userRepository.findAll()
}
JAVAUserDTO.java
package com.example.cleanproject.dto;
import lombok.Data;
@Data
public class UserDTO {
private String name;
private String email;
}
KOTLINUserDTO.kt
package com.example.cleanproject.dto
data class UserDTO(
val name: String,
val email: String
)
JAVAUserController.java
package com.example.cleanproject.controller;
import com.example.cleanproject.dto.UserDTO;
import com.example.cleanproject.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping
public List<UserDTO> getAllUsers() {
return userService.getAllUsers();
}
}
KOTLINUserController.kt
package com.example.cleanproject.controller
import com.example.cleanproject.dto.UserDTO
import com.example.cleanproject.service.UserService
import org.springframework.web.bind.annotation.*
@RestController
@RequestMapping("/api/users")
class UserController(
private val userService: UserService
) {
@GetMapping
fun getAllUsers(): List<UserDTO> = userService.getAllUsers()
}