관심사의 분리(SoC)를 통한 자바 애플리케이션 설계 이해

관심사의 분리(Separation of Concerns, SoC) 원칙 설명

 

**관심사의 분리(Separation of Concerns, SoC)**는 소프트웨어 설계의 핵심 원칙 중 하나로, 소프트웨어 시스템을 구성하는 각 부분이 자신의 특정 기능에만 집중하도록 하는 것입니다. 이를 통해 코드의 가독성을 높이고, 유지보수를 쉽게 하며, 재사용성을 극대화할 수 있습니다. 💡

 

관심사의 분리가 중요한 이유

 

코드의 가독성 향상: 코드가 각 기능별로 분리되어 있기 때문에, 코드를 읽고 이해하기 쉬워집니다. 📖

유지보수 용이성: 특정 기능에 대한 변경 사항이 다른 부분에 영향을 미치지 않도록 설계되어, 오류 발생 가능성을 줄이고, 수정 작업이 쉬워집니다. 🔧

재사용성 증가: 각 모듈이 독립적으로 작동하므로, 다른 프로젝트나 시스템에서도 쉽게 재사용할 수 있습니다. ♻️

 

자바에서 관심사의 분리 예제: 쇼핑 애플리케이션

 

다음은 관심사의 분리 원칙을 적용한 간단한 쇼핑 애플리케이션 예제입니다. 이 예제는 다음과 같은 네 가지 주요 구성 요소로 나뉩니다:

 

1. 도메인 모델 (Domain Model): 비즈니스 로직에서 사용되는 데이터를 나타냅니다.

2. 데이터 액세스 오브젝트 (DAO): 데이터베이스와의 상호작용을 관리합니다.

3. 비즈니스 로직 (Service): 애플리케이션의 주요 로직을 처리합니다.

4. 컨트롤러 (Controller): 사용자 인터페이스와의 상호작용을 관리합니다.

 

1. 도메인 모델 (Domain Model) - Product.java

public class Product {
    private int id;
    private String name;
    private double price;

    public Product(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    // Getter와 Setter 메소드
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

 

Product 클래스는 상품의 데이터를 저장하고 관리하는 역할을 합니다. 각 상품의 ID, 이름, 가격 정보를 관리합니다. 이 클래스는 애플리케이션의 도메인 모델을 정의하며, 다른 클래스와는 독립적으로 동작합니다. 🛍️

 

2. 데이터 액세스 오브젝트 (DAO) - ProductDao.java

import java.util.ArrayList;
import java.util.List;

public class ProductDao {
    private List<Product> products = new ArrayList<>();

    public ProductDao() {
        products.add(new Product(1, "Coffee Maker", 99.99));
        products.add(new Product(2, "Toaster", 49.95));
    }

    public List<Product> getAllProducts() {
        return products;
    }

    public Product getProductById(int id) {
        return products.stream()
            .filter(product -> product.getId() == id)
            .findFirst()
            .orElse(null);
    }
}

 

ProductDao 클래스는 데이터베이스와의 상호작용을 관리합니다. 여기서는 간단히 List를 사용해 상품 데이터를 관리하지만, 실제로는 데이터베이스와의 통신을 담당합니다. 이 클래스는 데이터를 어떻게 저장하고 검색할지에 대해 책임집니다. 📊

 

3. 비즈니스 로직 (Service) - ProductService.java

public class ProductService {
    private ProductDao productDao;

    public ProductService(ProductDao productDao) {
        this.productDao = productDao;
    }

    public Product getProduct(int id) {
        return productDao.getProductById(id);
    }

    public List<Product> listProducts() {
        return productDao.getAllProducts();
    }
}

 

ProductService 클래스는 비즈니스 로직을 처리합니다. 이 클래스는 ProductDao와 협력하여 상품 데이터를 처리하며, 비즈니스 로직을 캡슐화합니다. 여기서 관심사는 비즈니스 규칙과 데이터 조작입니다. 🛠️

 

4. 컨트롤러 (Controller) - ProductController.java

public class ProductController {
    private ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    public void displayProduct(int productId) {
        Product product = productService.getProduct(productId);
        if (product != null) {
            System.out.println("Product Details: ID=" + product.getId() + ", Name=" + product.getName() + ", Price=$" + product.getPrice());
        } else {
            System.out.println("Product not found.");
        }
    }

    public void displayAllProducts() {
        productService.listProducts().forEach(product ->
            System.out.println("Product: ID=" + product.getId() + ", Name=" + product.getName() + ", Price=$" + product.getPrice())
        );
    }
}

 

ProductController 클래스는 사용자 인터페이스와의 상호작용을 담당합니다. 이 클래스는 ProductService를 사용하여 사용자에게 상품 정보를 보여주거나, 사용자 입력에 따라 작업을 수행합니다. 여기서 관심사는 사용자 인터페이스와 비즈니스 로직의 연결입니다. 🖥️

 

요약 및 결론

 

이 예제에서 각 클래스는 자신의 역할에만 집중합니다. Product는 데이터를, ProductDao는 데이터 접근을, ProductService는 비즈니스 로직을, ProductController는 사용자 인터페이스를 관리합니다. 이렇게 설계하면 코드의 유지보수가 용이하고, 재사용성이 높아지며, 시스템의 복잡도가 줄어듭니다. 🎯

 

관심사의 분리는 소프트웨어 설계에서 필수적인 원칙이며, 이를 통해 더욱 안정적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다. ✨

 

이해하기 쉬운 예제와 함께 잘 설계된 소프트웨어 시스템을 구축해보세요! 😃

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유