Separation of Concerns(관심사 분리)

2023. 5. 1. 14:09Spring Framework

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

"관심사의 분리(Separation of Concerns, SoC)"는 소프트웨어 설계에서 중요한 원칙 중 하나입니다. 이 원칙은 각 부분이 자신의 관련된 기능만을 담당하도록 하여 코드의 가독성을 높이고, 유지보수를 쉽게 하며, 오류 발생 가능성을 줄이는 데 목적이 있습니다. 자바에서는 클래스를 통해 관심사를 분리할 수 있으며, 다양한 방법으로 구현될 수 있습니다. 대표적인 예로는 모듈화, 계층화, 컴포넌트 기반 개발 등이 있습니다.

자바 예제: 쇼핑 애플리케이션

이 예제에서는 간단한 쇼핑 애플리케이션을 만들어 보겠습니다. 주요 구성 요소는 상품 정보를 관리하는 Product, 데이터베이스 접근을 담당하는 ProductDao, 비즈니스 로직을 처리하는 ProductService, 그리고 사용자 인터페이스를 관리하는 ProductController로 구성됩니다.

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;
    }
}

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);
    }
}

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();
    }
}

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())
        );
    }
}

 

이 예제에서 각 클래스는 자신의 관심사에 집중하며, 서로의 코드를 직접적으로 알지 못해도 동작합니다. 이를 통해 유지보수가 용이하고, 각 컴포넌트의 재사용성이 향상됩니다. 이런 방식으로 설계하는 것이 관심사의 분리의 핵심입니다.

'Spring Framework' 카테고리의 다른 글

원칙과 패턴 - OCP(Open-Closed Principle)  (0) 2023.05.02
Chapter 7 프로젝트 설정 관련  (0) 2023.05.01
Spring Resource  (0) 2023.05.01
POJO(Plain Old Java Object)  (0) 2023.05.01
Maven Build System  (0) 2023.05.01