https://sundaland.tistory.com/52
관심사의 분리(SoC)는 소프트웨어 설계어서 중요한 원칙 중 하나이다. 이 원칙은 각 부분이 자신의 관련된 기능만을 담당하도록 하여 코드의 가독성을 높이고, 유지보수를 쉽게 하며, 오류 발생 가능성을 줄이는 데 목적이 있다.
자바에서는 클래스를 통해 관심사를 분리할 수 있으며, 다양한 방법으루 구현될 수 있다. 대표적인 예로 모듈화, 계층화, 컴포넌트 기반 개발 등이 있다.
아래 예제는 간단한 쇼핑 애플리케이션이다.
▼ 도메인 모델 (Domain Model)
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;
}
}
▼ 데이터 액세스 오브젝트 (DAO)
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);
}
}
▼ 비즈니스 로직 (Servie)
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();
}
}
▼ 컨트롤러 (Controller)
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())
);
}
}
이 예제들은 각 클래스는 자신의 관심사에 집중하며, 서로의 코드를 직접적으로 알지 못해도 동작한다. 이를 통해 유지보수가 용이하고, 각 컴포넌트의 재사용성이 향상된다. 이런 방식으로 설계하는 것이 관심사의 분리의 핵심이다.
'Toby Spring 3.1' 카테고리의 다른 글
아티팩트, DAO, JAVA Bean (0) | 2024.08.08 |
---|---|
원칙과 패턴 (Open-Closed Principle) (0) | 2024.08.08 |
UML (Unified Modeling Language) (0) | 2024.08.05 |