๐ง ์๋ก
Repository์ DAO์ ๊ดํด์ ํท๊ฐ๋ ค ํ๋ ๋ถ๋ค์ด ๋๊ฒ ๋ง์ ๊ฒ ๊ฐ๋ค๋ ๊ฒ์ ๋๋ผ๊ณ ์์ต๋๋ค.
์ ๋ ์ฒ์ ํด๋น ๋ ์ฉ์ด๋ฅผ ์ ํ์ ๋์๋ ๊ต์ฅํ ํผ๋์ค๋ฌ์ ๋ ๊ธฐ์ต์ด ์์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ ์ ๋ ์ฉ์ด์ ๋ํด์ ๊ฐ๊ฐ ์ด๋ค ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์ด๋ค ์์ผ๋ก ์ฌ์ฉ๋๋์ง ์ดํด๋ด์ผ๋ก์จ ๊ณ ๋ฏผ์ ์กฐ๊ธ ํด๊ฒฐํด ๋ณด๋ ์๊ฐ์ ๊ฐ์ง๋ ค ํฉ๋๋ค.
๊ฒฐ๋ก ๋ง ๋ณด๊ณ ์ถ์ผ์๋ค๋ฉด, ๋งจ ์๋๋ก ๋ด๋ ค๊ฐ์ ๋ ๋ฉ๋๋ค.
๐ง DAO
Data Access Object์ ์ค์๋ง์ธ DAO๋ ํด์ ๊ทธ๋๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค.
์กฐ๊ธ ๋ ํ์ด์ ์ค๋ช ํ์๋ฉด, DAO๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํน์ ๋ค๋ฅธ ์์์ฑ(Persistence) ๋ฉ์ปค๋์ฆ์ ๋ํ ์ ๊ทผ์ ์ถ์ํํด์ฃผ๋ ์ญํ ์ ์ํํฉ๋๋ค.
์ฆ ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง, ํน์ ์ด๋ค ์์์ฑ ์ ์ฅ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ธ์ง์ ๋ํด์ ์์ฉ ๊ณ์ธต์์๋ ์ ๊ฒฝ์ฐ์ง ์๋๋ก ๋ง๋ค์ด ์ฃผ๋ ์ญํ ์ ์ํํฉ๋๋ค.
DAO๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ด๋ ํ ๋ฌธ์ ์ ์ด ์๋์ง, ์๋ ์์๋ฅผ ํตํด ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ค DAO ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์
๋ค์ ์ฝ๋๋ ๊ฐ๋จํ๊ฒ ์ฃผ๋ฌธ์ ์์ฑํ๋ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์ฝ๋์ ๋๋ค.
@Service
@Transactional
public class OrderService {
public void order(final PlaceOrderCommand command) {
Order order = command.toDomain();
order.place();
save(order);
}
private void save(final Order order) {
// [MYSQL] DB Connection ์ ํ๋ํ๋ ์ฝ๋
String saveSql = "INSERT INTO ORDERS(id, user_id, order_time, status) VALUES(?, ?, ?, ?)";
// ๋์ถฉ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉํ๊ณ , DB์ ์ ์ฅํ๋ ์ฝ๋
}
}
public class PlaceOrderCommand {
private final Long userId;
public PlaceOrderCommand(final Long userId) {
this.userId = userId;
}
public Order toDomain() {
return new Order(userId, "beforePlace");
}
}
public class Order {
private Long id;
private Long userId; // ์ฃผ๋ฌธ์ ID
private LocalDateTime orderTime; // ์ฃผ๋ฌธ์๊ฐ
private String status; // ์ฃผ๋ฌธ์ํ
public Order(final Long userId, final String status) {
this.userId = userId;
this.orderTime = LocalDateTime.now();
this.status = status;
}
public void place() {
status = "placed";
}
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด Application(Service) ๊ณ์ธต์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ ์ผ๋ก ์์กดํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ง์ฝ MYSQL ๋์ ์ Oracle๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ ์๊ตฌ์ฌํญ์ด ๋ค์ด์จ๋ค๋ฉด, Application์ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค.
์ฆ ๋ณ๊ฒฝ์ ์ทจ์ฝํด์ง๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด DAO๋ฅผ ๋์ ํฉ๋๋ค.
๐ค DAO ๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐ
DAO๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฝ๋๋ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
@Service
@Transactional
public class OrderService {
private final OrderDao orderDao;
public PlaceOrderService(final OrderDao orderDao) {
this.orderDao = orderDao;
}
public void order(final PlaceOrderCommand command) {
Order order = command.toDomain();
order.place();
orderDao.save(order); // ๋ฌด์จ DB๋ฅผ ์ฐ๋์ง ๋
ธ์ถ๋์ง ์๋๋ค.
}
}
public class PlaceOrderCommand {
private final Long userId;
public PlaceOrderCommand(final Long userId) {
this.userId = userId;
}
public Order toDomain() {
return new Order(userId, "beforePlace");
}
}
public class Order {
private Long id;
private Long userId; // ์ฃผ๋ฌธ์ ID
private LocalDateTime orderTime; // ์ฃผ๋ฌธ์๊ฐ
private String status; // ์ฃผ๋ฌธ์ํ
public Order(final Long userId, final String status) {
this.userId = userId;
this.orderTime = LocalDateTime.now();
this.status = status;
}
public void place() {
status = "placed";
}
}
์ ์ฝ๋๋ง์ ํตํด์๋ ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํน์ ๋ค๋ฅธ ์์์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋์ง ์ ํ ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์์์ฑ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ ๊ตฌํ์ OrderDao ๋ด๋ถ์์ ๋ด๋นํฉ๋๋ค.
์ด๋ฅผ ํตํด Application์์๋ ์์์ฑ ๋ฉ์ปค๋์ฆ์ ๋ํด ์ ๊ฒฝ์ฐ์ง ์์ ์ ์๊ฒ ๋์์ผ๋ฉฐ, ๋ฐ๋ผ์ ์ด์ ์ ๋ฐ์ํ๋ ๋ฐ์ดํฐ ์ ์ฅ์๊ฐ ๋ฐ๋๋ ๊ฒฝ์ฐ Application ๋ ์ด์ด์ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ์ ๋๋ค.
DAO๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ณดํต DB ํ ์ด๋ธ๊ณผ์ ๋งคํ์ ์ฑ ์์ผ๋ก ๊ฐ์ง๋๋ค.
์ฆ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ด order, user, xxx ๋ฑ๋ฑ ์กด์ฌํ๋ค๋ฉด, DAO๋ OrderDao, UserDao, XxxDao ๋ฑ์ผ๋ก ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
๋ณดํต DAO๋ (DB๋ฅผ ์ฌ์ฉํ๋ค๋ฉด) DB ํ ์ด๋ธ๊ณผ 1๋1 ๋งคํ์ ์์ผ ์ฌ์ฉํฉ๋๋ค.
๐ง Repository
Repository๋ DDD์์ ๋ฑ์ฅํ ๊ฐ๋ ์ ๋๋ค.
Repository๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ DDD์ ๋ํ ์ง์(Aggregate ๋ฑ)์ ์๋ฉด ๋ ๋์์ด ๋๊ฒ ์ง๋ง, ์ฌ๊ธฐ์๋ ๊ฐ๋จํ๊ฒ๋ง ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ์ ์ ์ฝ๋๋ฅผ ์กฐ๊ธ ๋ ๋ฐ์ ์ํจ ํ, ์ด๋ ํ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋์ง๋ฅผ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฃผ๋ฌธ(Order)์ ํ ๋์๋, ๋น์ฐํ ์ฃผ๋ฌธ ์ํ(OrderItem)๋ค์ด ์์ด์ผ ํฉ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ๋์ ์ฃผ๋ฌธ์๋ ์ฌ๋ฌ๊ฐ์ ์ฃผ๋ฌธ ์ํ์ด ํฌํจ๋ ์ ์๋๋ฐ์, ์ด๋ฅผ ๋๋ฉ์ธ ๋ชจ๋ธ๋ก์จ ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public class Order {
private Long id;
private Long userId; // ์ฃผ๋ฌธ์ ID
private LocalDateTime orderTime; // ์ฃผ๋ฌธ์๊ฐ
private String status; // ์ฃผ๋ฌธ์ํ
private List<OrderItem> orderItems = new ArrayList<>(); // ์ฃผ๋ฌธ ํญ๋ชฉ๋ค
public Order(final Long userId, final String status, final List<OrderItem> orderItems) {
this.userId = userId;
this.orderTime = LocalDateTime.now();
this.status = status;
this.orderItems.addAll(orderItems);
}
public void place() {
status = "placed";
}
public List<OrderItem> orderItems() {
return orderItems;
}
}
public class OrderItem {
private Long id;
private String name; // ์ํ ์ด๋ฆ
private int price; // ์ํ ๊ฐ๊ฒฉ
private int count; // ์ํ ๊ฐ์
public OrderItem(final String name, final int price, final int count) {
this.name = name;
this.price = price;
this.count = count;
}
}
๐ค Repository ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์
์ฃผ๋ฌธ์ ์ ์ฅํ ๋์๋ ์ฃผ๋ฌธ ์ํ๋ค ๋ํ ์ ์ฅ์ ํด์ผ ํฉ๋๋ค.
๋ํ ์ฃผ๋ฌธ ์กฐํ์ ์ฃผ๋ฌธ ์ํ๋ค๋ ๊ฐ์ด ์กฐํ๋์ด์ผ ํ๊ณ , ์ฃผ๋ฌธ ์ ๊ฑฐ ์ ์ฃผ๋ฌธ ์ํ๋ค๋ ๊ฐ์ด ์ ๊ฑฐ๋์ด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด์๋ ์ฃผ๋ฌธ ์ํ์ ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋ง๋ค์ด์ผ ํ๊ณ , ๊ทธ์ ๋ฐ๋ผ DAO๋ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
์ด์ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํด์, ์ฃผ๋ฌธ์ ์ ์ฅํ๊ณ , ์กฐํํ๊ณ , ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
@Service
@Transactional
public class OrderService {
private final OrderDao orderDao;
private final OrderItemDao orderItemDao;
public PlaceOrderService(final OrderDao orderDao, final OrderItemDao orderItemDao) {
this.orderDao = orderDao;
this.orderItemDao = orderItemDao;
}
public void order(final PlaceOrderCommand command) {
Order order = command.toDomain();
order.place();
orderDao.save(order); // ์ฃผ๋ฌธ ์ ์ฅ
orderItemDao.saveAll(order.orderItems()); // ์ฃผ๋ฌธ์ํ ์ ์ฅ
}
// ์ฃผ๋ฌธ ์กฐํ ์ ์ฃผ๋ฌธ ์ํ๋ค ๋ํ ๊ฐ์ด ์กฐํ๋์ด์ผ ํ๋ค.
public Order findOrderById(final Long id) {
Order order = orderDao.findById(id);
List<OrderItem> orderItems = orderItemDao.findAllByOrderId(id);
order.setOrderItems(orderItems);
return order;
}
// ์ฃผ๋ฌธ ์ญ์ ์ ์ฐ๊ด๋ ์ฃผ๋ฌธ๋ค ๋ํ ๊ฐ์ด ์ญ์
public void deleteOrderById(final Long id) {
orderItemDao.deleteAllByOrderId(id);
orderDao.deleteById(id);
}
}
class PlaceOrderCommand {
// ์๋ต
public Order toDomain() {
final List<OrderItem> orderItems = placeOrderItems.stream()
.map(PlaceOrderItem::toDomain)
.collect(Collectors.toList());
return new Order(userId, "beforePlace", orderItems);
}
public class PlaceOrderItem {
// ์๋ต
}
}
class Order {
// ์๋ต
}
class OrderItem {
// ์๋ต
}
์ฃผ๋ฌธ ์ ์ฅ ์ ์ฃผ๋ฌธ ์ํ๋ค๋ ๊ฐ์ด ์ ์ฅํ๊ธฐ ์ํ์ฌ OrderService์ ์ฝ๋๊ฐ ์์ ๋์์ต๋๋ค.
๋ง์ฝ ์ฃผ๋ฌธ๊ณผ ํจ๊ป ์ ์ฅ๋๊ณ , ์กฐํ๋๊ณ , ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๊ฒ๋ค์ด ๋์ด๋๋ค๋ฉด ์ด๋ก ์ธํด Application Layer์ ์ฝ๋๋ ๊ณ์ํด์ ๋ณ๊ฒฝ๋์ด์ผ ํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋๋ฉ์ธ ๋ชจ๋ธ ๋ด์ ์ฐธ์กฐ์ ๋ํ ์บก์ํ๊ฐ ์ด๋ฃจ์ด์ง์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์ผ์ ๋๋ค.
์ฃผ๋ฌธ์ด ์ฃผ๋ฌธ ์์ดํ ์ ์ฐธ์กฐํ๋ค๋ ๊ฒ์ OrderService์ ๋ ธ์ถ๋ ํ์๊ฐ ์์ต๋๋ค.
์ฃผ๋ฌธ์ ์ ์ฅํ ๋, ์์์ ์ฐธ์กฐํ๋ ์ฃผ๋ฌธ ํญ๋ชฉ๋ค๋ ๊ฐ์ด ์ ์ฅ๋๋๋ก ํ๋ค๋ฉด OrderService์ ๋ณต์ก๋๊ฐ ์ค์ด๋ค ๊ฒ์ ๋๋ค.
Repository๋ฅผ ๋์ ํจ์ผ๋ก์จ ์ด๋ฌํ ๋ชฉ์ ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
๐ค Repository ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ํด๊ฒฐ
์ฌ๋ฌ ๊ธ๋ค์์๋ 'Repository๋ ๊ฐ์ฒด Collection์ ์ถ์ํ'๋ผ๊ณ ์ค๋ช ํฉ๋๋ค.
์ ๋ ํด๋น ์ค๋ช ์ ์กฐ๊ธ ๋ ์ด์ ๋ถ์ฌ๋ณด๋ ค ํฉ๋๋ค.
Repository๋ ํจ๊ป ์ ์ฅ๋๊ณ , ํจ๊ป ์กฐํ๋๋ฉฐ, ํจ๊ป ๋ณ๊ฒฝ๋๋ ์ฌ๋ฌ ๋๋ฉ์ธ ๋ชจ๋ธ ์ฌ์ด์์,
์ด๋ค์ ์ง์ ์ ์ญํ ์ ํ ์ ์๋ ๋๋ฉ์ธ ์ํฐํฐ์ ๋ํ ์ปฌ๋ ์ ์ฒ๋ผ ๋์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฃผ๋ฌธ๊ณผ ์ฃผ๋ฌธ์ํ์ ํจ๊ป ์ ์ฅ๋๊ณ , ํจ๊ป ์กฐํ๋๋ฉฐ, ํจ๊ป ๋ณ๊ฒฝ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฃผ๋ฌธ ์ํ๋ค์ ์ฃผ๋ฌธ์ ํตํด์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ์ฃผ๋ฌธ ๋ด์์๋ง ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค.
๋ฐ๋ผ์ ์ฃผ๋ฌธ๊ณผ ์ฃผ๋ฌธ ์ํ๋ค ์ค ์ง์ ์ ์ญํ ์ ํ ์ ์๋ ๋๋ฉ์ธ ์ํฐํฐ๋ ์ฃผ๋ฌธ์ด๋ฉฐ, Repository๋ ์ฃผ๋ฌธ์ ๋ํด์๋ง ์กด์ฌํด์ผ ํฉ๋๋ค.
Repository๋ฅผ ๋์ ํ์ฌ ์์ ์ฝ๋๋ฅผ ์์ ํด ๋ณด๊ฒ ์ต๋๋ค.
@Service
@Transactional
public class OrderService {
private final OrderRepository orderRepository;
public PlaceOrderService(final OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
public void order(final PlaceOrderCommand command) {
Order order = command.toDomain();
order.place();
orderRepository.save(order); // ๋ด๋ถ์ ์ผ๋ก Order์ OrderItem์ ํจ๊ป ์ ์ฅํ๋ค.
}
public Order findOrderById(final Long id) {
return orderRepository.findById(id); // ์กฐํ๋ Order๋ OrderItem์ด ์จ์ ํ ์ธํ
๋์ด์๋ค.
}
// ์ฃผ๋ฌธ ์ญ์ ์ ์ฐ๊ด๋ ์ฃผ๋ฌธ๋ค ๋ํ ๊ฐ์ด ์ญ์
public void deleteOrderById(final Long id) {
orderRepository.deleteById(id); // ๋ด๋ถ์ ์ผ๋ก Order์ OrderItem์ ํจ๊ป ์ ๊ฑฐํ๋ค.
}
}
class PlaceOrderCommand {
// ์๋ต
}
class Order {
// ์๋ต
}
class OrderItem {
// ์๋ต
}
์ฆ ์ฐ๋ค๊ด๊ณ๋ฅผ ๊ฐ์ง ๋๋ฉ์ธ ๋ชจ๋ธ๋ค์ ์ฐธ์กฐ๋ฅผ ์ถ์ํํ๊ณ , ์ฐ๊ด๋ ๋๋ฉ์ธ ๋ชจ๋ธ๋ค ์ค ์ด๋ค์ ์ง์ ์ ์ญํ ์ ํ๋ ๊ฐ์ฒด์ ๋ํ Repository๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ Application Layer์ ๋ณต์ก๋๊ฐ ๋ฎ์์ง ๊ฒ์ ์ ์ ์์ต๋๋ค.
๐ง ๊ฒฐ๋ก
DAO์ Repository ๋ ๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค(ํน์ ๊ธฐํ ์์์ฑ ๋ฉ์ปค๋์ฆ) ์ ๊ทผ์ ์บก์ํํ๋ ์ญํ ์ ์ํํฉ๋๋ค.
(ํธ์๋ฅผ ์ํด, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ฐ์ ํ๊ณ ์ด์ด๊ฐ๊ฒ ์ต๋๋ค.)
๋์ฒด๋ก DAO๋ DB ํ ์ด๋ธ๊ณผ 1๋1 ๋งคํ์ ์ํต๋๋ค.
Repository์ ๊ฒฝ์ฐ ์์ฑํ๋ ๊ธฐ์ค์ด DB ํ ์ด๋ธ์ด ์๋๋๋ค.
Repository๋ ์ฐ๊ด์ด ์๊ณ , ํจ๊ป ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ์ฌ๋ฌ ๋๋ฉ์ธ ๋ชจ๋ธ ์ฌ์ด์์, ์ด๋ค์ ์ง์ ์ ์ญํ ์ ํ ์ ์๋ ๋๋ฉ์ธ ์ํฐํฐ์ ๋ํด์๋ง Repository๋ฅผ ๊ตฌํํฉ๋๋ค.
๋๋ฉ์ธ ์ํฐํฐ์ ์ฐ๊ด๋ ๊ฐ์ฒด๊ฐ ์์ด, ๋๋ฉ์ธ ์ํฐํฐ๊ฐ DB ํ ์ด๋ธ์ 1๋1๋ก ๋งคํ๋๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ๊ฒฐ๊ตญ 1๊ฐ์ Repository์ 1๊ฐ์ DAO๋ฅผ ์ฌ์ฉํ๋ ํ์์ด ๋๋ฏ๋ก, ์ด๋ฌํ ๊ฒฝ์ฐ์๋ Repository์ DAO๋ ๋ณ ์ฐจ์ด๊ฐ ์์ด์ง๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก DAO๋ DB์ ์กฐ๊ธ ๋ ์ฐ๊ด์ฑ์ด ์์ผ๋ฉฐ,
Repository๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์กฐ๊ธ ๋ ์ฐ๊ด๋์ด ์์ต๋๋ค.
(๋๋ฌด ๋ฏฟ์ง๋ ๋ง์ธ์ ^^ ๊ทธ๋ฅ ์ค๋ฌด ๊ฒฝํ ์๋ ์ฝ๋ฉ ์์ด๋ณด์ ์๊ฐ ์ ๋ฆฌ๊ธ์ ๋๋ค.)
(๋น์ฐํ๊ฒ๋ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง ์๋ ์์ต๋๋ค. ๋ญ CQRS๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ฟผ๋ฆฌ์ฉ ๋ฐ์ดํฐ ์ ๊ทผ ํด๋์ค๋ฅผ DAO, ๋ช ๋ น์ ํด๋นํ๋ ๋ฐ์ดํฐ ์ ๊ทผ ํด๋์ค๋ฅผ Repository๋ก ์ด๋ค๊ฑฐ๋ ๋ญ... ์๋ฌดํผ์)
๐ Reference
๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ - ์๋ฆญ ์๋ฐ์ค
๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ - ์ต๋ฒ๊ท ๋
๊ทธ๋์ ๋ด์๋ ์ฌ๋ฌ ๊ธ๋ค๊ณผ, ์ง์ ์ฌ์ฉํด๋ณด๋ฉฐ ๋ค์๋ ๋์ ์๊ฐ