Separation of Concerns(관심사 분리)
2023. 5. 1. 14:09ㆍSpring 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' 카테고리의 다른 글
POM.xml (0) | 2023.05.02 |
---|---|
SOLID(객체 지향 설계 원칙) (0) | 2023.05.02 |
Chapter 7 프로젝트 설정 관련 (0) | 2023.05.01 |
POJO(Plain Old Java Object) (0) | 2023.05.01 |
Maven Build System (0) | 2023.05.01 |