DDD 저장소의 일반적인 구현은 예를 들어 save()
메소드와 같이 OO처럼 보이지 않습니다 .
package com.example.domain;
public class Product { /* public attributes for brevity */
public String name;
public Double price;
}
public interface ProductRepo {
void save(Product product);
}
인프라 부분 :
package com.example.infrastructure;
// imports...
public class JdbcProductRepo implements ProductRepo {
private JdbcTemplate = ...
public void save(Product product) {
JdbcTemplate.update("INSERT INTO product (name, price) VALUES (?, ?)",
product.name, product.price);
}
}
그러한 인터페이스는 Product
적어도 게터와 함께 a anemic 모델이 될 것으로 기대합니다 .
반면에 OOP는 Product
객체가 자신을 저장하는 방법을 알아야 한다고 말합니다 .
package com.example.domain;
public class Product {
private String name;
private Double price;
void save() {
// save the product
// ???
}
}
문제는 Product
자체 저장 방법을 알고 있으면 인프라 코드가 도메인 코드와 분리되지 않았 음을 의미합니다.
저축을 다른 개체에 위임 할 수도 있습니다.
package com.example.domain;
public class Product {
private String name;
private Double price;
void save(Storage storage) {
storage
.with("name", this.name)
.with("price", this.price)
.save();
}
}
public interface Storage {
Storage with(String name, Object value);
void save();
}
인프라 부분 :
package com.example.infrastructure;
// imports...
public class JdbcProductRepo implements ProductRepo {
public void save(Product product) {
product.save(new JdbcStorage());
}
}
class JdbcStorage implements Storage {
private final JdbcTemplate = ...
private final Map<String, Object> attrs = new HashMap<>();
private final String tableName;
public JdbcStorage(String tableName) {
this.tableName = tableName;
}
public Storage with(String name, Object value) {
attrs.put(name, value);
}
public void save() {
JdbcTemplate.update("INSERT INTO " + tableName + " (name, price) VALUES (?, ?)",
attrs.get("name"), attrs.get("price"));
}
}
이것을 달성하는 가장 좋은 방법은 무엇입니까? 객체 지향 저장소를 구현할 수 있습니까?