Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[WIL]20240908 도메인 계층 본문

개발Article

[WIL]20240908 도메인 계층

최밤빵 2024. 9. 8. 22:33

도메인 계층은 애플리케이션에서 중요한 개념 중 하나이고, 비즈니스 로직을 처리하는 핵심 역할을 한다. 하지만 이 계층이 정확히 무엇을 하는지, 왜 중요한지 잘 이해하지 못했기 때문에 이번 개발일지에서 도메인 계층을 공부하고 기록하기로 했다.

 

▶도메인 계층이란?

도메인 계층(Domain Layer)은 소프트웨어 아키텍처에서 비즈니스 로직을 담당하는 계층이다. 비즈니스 로직이란, 애플리케이션이 해결하려는 문제와 관련된 규칙과 절차들을 말한다. 예를 들어, 쇼핑몰 애플리케이션에서는 상품 주문, 결제, 환불 등이 비즈니스 로직에 속한다. 도메인 계층은 이러한 비즈니스 규칙을 구현하고 유지하는 역할을 한다.

도메인 계층은 종종 애플리케이션의 다른 계층과 분리되어, 비즈니스 로직만을 집중적으로 처리할 수 있게 설계된다. 이렇게 분리하는 이유는 비즈니스 로직이 애플리케이션에서 가장 중요한 부분 중 하나이기 때문에, 이를 깨끗하고 명확하게 유지하는 것이 중요하기 때문이다.

 

▶도메인 계층의 역할

도메인 계층은 다양한 역할을 수행한다. 대표적으로 다음과 같은 기능들이 있다.

 

→ 비즈니스 규칙 처리:

도메인 계층은 애플리케이션에서 가장 중요한 비즈니스 로직을 담고 있다. 예를 들어, 특정 상품의 재고가 부족할 때 주문을 거절하거나, 고객이 충분한 포인트를 보유한 경우에만 포인트 결제를 허용하는 것 등이 포함된다. 이러한 로직은 애플리케이션의 핵심 규칙이므로, 도메인 계층에서 엄격하게 관리된다.

→ 도메인 객체 관리:

도메인 계층은 애플리케이션에서 중요한 엔티티나 값 객체(Value Object)들을 관리한다. 엔티티는 데이터베이스의 테이블과 매핑되는 객체이며, 값 객체는 변하지 않는 데이터 값을 표현할 때 사용된다. 예를 들어, 고객, 주문, 상품 같은 개념이 엔티티로 표현될 수 있으며, 고객의 주소나 결제 금액 같은 정보가 값 객체로 사용될 수 있다.

→ 데이터 유효성 검사:

도메인 계층에서는 입력 데이터나 비즈니스 로직을 실행할 때 그 데이터가 유효한지 확인하는 작업을 한다. 이를 통해 잘못된 데이터가 처리되지 않도록 보호하며, 안정적인 시스템 동작을 보장한다.

 

▶도메인 계층의 위치

도메인 계층은 일반적으로 소프트웨어의 계층형 아키텍처(Layered Architecture)에서 중간에 위치한다. 대표적으로는 다음과 같은 계층 사이에 위치한다.

 

→ 프레젠테이션 계층(Presentation Layer):

사용자가 애플리케이션과 상호작용하는 부분이다. 프레젠테이션 계층은 도메인 계층에 요청을 보내어 비즈니스 로직을 처리하고, 그 결과를 사용자에게 반환한다.

→ 인프라 계층(Infrastructure Layer):

데이터베이스와의 통신이나 외부 API 호출 등을 담당하는 계층이다. 도메인 계층은 인프라 계층을 통해 필요한 데이터를 저장하거나 불러오는 작업을 한다.

이렇게 도메인 계층은 프레젠테이션 계층과 인프라 계층 사이에서 비즈니스 로직을 처리하며, 애플리케이션의 중심적인 역할을 한다.

 

▶도메인 계층의 설계 원칙

도메인 계층을 설계할 때는 몇 가지 중요한 원칙을 지켜야 한다고 배웠다.

 

→ 단일 책임 원칙(Single Responsibility Principle):

도메인 계층의 각 객체는 하나의 책임만을 가져야 한다. 이를 통해 코드를 더 간결하고 유지보수하기 쉽게 만든다.

→ 도메인 주도 설계(Domain-Driven Design):

도메인 계층을 설계할 때, 실제 비즈니스 용어와 개념을 반영하여 설계하는 방법이다. 이를 통해 개발자와 비즈니스 전문가 사이의 커뮤니케이션이 더 명확해지고, 비즈니스 로직의 변경이 쉽게 반영될 수 있다.

→ 유연성과 확장성:

도메인 계층은 비즈니스 요구사항이 변화할 때 쉽게 확장 가능해야 한다. 따라서 도메인 객체 간의 결합을 최소화하고, 인터페이스나 추상화를 통해 유연한 설계를 해야 한다.

 

▶도메인 계층의 예시

스프링 프레임워크를 사용하여 도메인 계층을 구성하는 예시를 간단히 구현했다. 

쇼핑몰 애플리케이션에서 주문(Order)과 관련된 도메인 로직을 처리하는 예시:

 

▽ 엔티티 클래스

@Entity
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL)
    private List<OrderItem> items;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

    public Order() {
        this.status = OrderStatus.PENDING;
    }

    public void confirmOrder() {
        if (this.status == OrderStatus.PENDING) {
            this.status = OrderStatus.CONFIRMED;
        }
    }

    public void cancelOrder() {
        if (this.status == OrderStatus.CONFIRMED) {
            this.status = OrderStatus.CANCELED;
        }
    }

    // Getters 생략 
}

→ Order 엔티티는 주문과 관련된 비즈니스 로직을 포함하고 있다. 주문을 확인(확정)하거나 취소하는 비즈니스 규칙은 이 도메인 객체에서 처리된다.

 

▽ 서비스 클래스

@Service
public class OrderService {

    private final OrderRepository orderRepository;

    @Autowired
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public void confirmOrder(Long orderId) {
        Order order = orderRepository.findById(orderId)
                .orElseThrow(() -> new IllegalArgumentException("Invalid order ID"));
        order.confirmOrder();
        orderRepository.save(order);
    }

    public void cancelOrder(Long orderId) {
        Order order = orderRepository.findById(orderId)
                .orElseThrow(() -> new IllegalArgumentException("Invalid order ID"));
        order.cancelOrder();
        orderRepository.save(order);
    }
}

→ OrderService 클래스는 도메인 계층의 비즈니스 로직을 처리하는 역할을 한다. 서비스 계층에서 엔티티의 도메인 로직을 호출하여 주문을 확인하거나 취소하는 로직을 구현한다.

 

▽ 레포지토리 인터페이스

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
}

→ OrderRepository는 스프링 데이터 JPA를 사용하여 데이터베이스와 상호작용하는 리포지토리 인터페이스이다. 도메인 계층에서 발생한 비즈니스 로직의 결과를 저장하거나 불러오는 작업을 담당한다.

 

▶도메인 계층 학습 요약

이번 개발일지를 통해 도메인 계층이 무엇인지, 어떤 역할을 하는지에 대해 학습할 수 있었다. 도메인 계층은 애플리케이션의 핵심 비즈니스 로직을 담당하고, 명확하게 설계하는 것이 애플리케이션의 성공적인 동작에 매우 중요하다는 점을 깨달았다. 또한 도메인 계층을 설계할 때는 단일 책임 원칙과 같은 원칙을 따르는 것이 중요하며, 도메인 주도 설계를 통해 실제 비즈니스 용어를 반영하는 것이 설계의 질을 높이는 데 도움이 된다는 것을 배웠다.

'개발Article' 카테고리의 다른 글

[TIL]20240910 리젝(Reject)  (0) 2024.09.10
[TIL]20240909 스택 트레이스(Stack Trace)  (0) 2024.09.09
[TIL]20240907 OUTER JOIN  (1) 2024.09.07
[TIL]20240906 kotlin  (0) 2024.09.07
[TIL]20240905 프로그래밍 언어가 많은 이유  (0) 2024.09.05