클린 아키텍처에서 말하는 Domain 계층은 소프트웨어의 핵심 비즈니스 로직을 포함하는 계층입니다.
이 계층은 시스템의 업무 규칙과 비즈니스 프로세스를 다룹니다.
즉, 도메인 계층은 애플리케이션의 핵심 비즈니스 로직을 구현하고 업무 규칙을 적용하는 데 사용됩니다. 이 계층은 데이터베이스, 사용자 인터페이스 또는 외부 인터페이스와 분리되어 있어야 하며, 이를 통해 시스템이 변경될 때 도메인 모델이 영향을 받지 않도록 보호됩니다.
Presentation 계층은 사용자 인터페이스, 웹 서비스, API 등과 같은 사용자 인터페이스를 다룹니다. Presentation 계층은 도메인 계층에 의존할 수 있지만, 도메인 계층은 Presentation 계층에 의존해서는 안 됩니다. 이렇게 의존성을 한쪽 방향으로 유지하면 시스템이 더 모듈화되고 유지보수가 더 용이해집니다
시스템의 업무 규칙이란, 특정 업무나 도메인에서 유효한 비즈니스 규칙, 정책, 요구사항 등을 의미합니다. 예를 들어, 은행 시스템에서는 계좌 이체가 발생할 때 잔액보다 큰 금액은 이체할 수 없다는 규칙이 존재합니다. 이러한 업무 규칙은 시스템이 수행하는 일련의 비즈니스 프로세스에 필요한 규칙으로, 이를 프로그래밍적으로 구현하여 시스템이 이러한 업무를 정확하고 일관되게 처리할 수 있도록 합니다.
도메인 계층은 이러한 시스템의 업무 규칙을 구현하는 계층으로, 시스템의 핵심 비즈니스 로직을 포함합니다. 이러한 계층에서 구현된 비즈니스 로직은 변경 가능성이 높으며, 변경이 필요할 경우 도메인 계층에서 수정되어야 합니다. 따라서 도메인 계층은 시스템의 핵심 기능을 담당하며, 시스템의 변경에 따른 안정성과 유연성을 제공합니다.
Domain 예시 코드
// Order.kt
data class Order(
val orderId: Int,
val customer: Customer,
val items: List<OrderItem>,
val totalPrice: Double,
val orderDate: LocalDate,
val status: OrderStatus
)
data class OrderItem(
val productId: Int,
val productName: String,
val quantity: Int,
val price: Double
)
enum class OrderStatus {
CREATED,
PENDING,
SHIPPED,
DELIVERED,
CANCELLED
}
// OrderRepository.kt
interface OrderRepository {
fun createOrder(order: Order)
fun getOrderById(orderId: Int): Order?
fun updateOrder(order: Order)
}
// OrderService.kt
class OrderService(private val repository: OrderRepository) {
fun placeOrder(customer: Customer, items: List<OrderItem>) {
val order = Order(
orderId = generateOrderId(),
customer = customer,
items = items,
totalPrice = calculateTotalPrice(items),
orderDate = LocalDate.now(),
status = OrderStatus.CREATED
)
repository.createOrder(order)
}
fun cancelOrder(orderId: Int) {
val order = repository.getOrderById(orderId) ?: throw OrderNotFoundException()
order.status = OrderStatus.CANCELLED
repository.updateOrder(order)
}
private fun generateOrderId(): Int {
// implementation omitted
}
private fun calculateTotalPrice(items: List<OrderItem>): Double {
// implementation omitted
}
}
'android' 카테고리의 다른 글
[안드로이드 스튜디오] git 커밋할 때 다른 계정으로 올라간다면? 계정 변경 방법 (0) | 2024.07.13 |
---|---|
android webview 통신 webBridge (1) | 2023.12.26 |
자바의 정석 | 객체지향 프로그래밍 1 (0) | 2023.01.01 |
[Kotlin] Geckoview tutorial (0) | 2022.12.19 |
디자인 패턴 MVC, MVP, MVVM (0) | 2022.11.10 |