본문 바로가기

DDD/도메인 주도 설계 철저 입문

레포지토리란? - 「도메인 주도 설계 철저 입문」 5장 (1)

 

본 포스트 시리즈는 「도메인 주도 설계 철저 입문」책을 요약한 내용입니다.

 

 

이전 발행 글 보기

더보기

 

 


 

05장 데이터와 관계된 처리를 분리하자 - 리포지토리 (1)

 

(1) 리포지토리의 책임

 

 

리포지토리란

데이터베이스에 객체를 저장하고 복원하는 일을 도메인에서 직접하는 대신 리포지토리에 맡기기 위해 리포지토리가 존재한다. 이렇게 하면 개발자는 도메인, 즉 비즈니스 로직에 더욱 집중할 수 있다.

 

 

리포지토리 사용의 장점

우선 리포지토리를 사용하지 않고 사용자 중복을 검사하는 메소드를 구현한 도메인 서비스(UserService) 코드는 다음과 같다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserService {

    public boolean exists(User user) {
        
        String connectionString = "jdbc:your_database_connection_string"; 

        try (Connection connection = DriverManager.getConnection(connectionString);
             PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE name = ?")) {

            // PreparedStatement에 사용자 이름 설정
            statement.setString(1, user.getName().getValue());

            // 쿼리 실행
            try (ResultSet resultSet = statement.executeQuery()) {
                // 결과가 있으면 true 반환
                return resultSet.next();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }
}

 

 

반면 리포지토리를 사용하면 도메인 서비스 코드가 다음과 같이 변한다.

public class UserService {
    private final IUserRepository userRepository;

    public UserService(IUserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public boolean exists(User user) {
        User found = userRepository.find(user.getName());

        return found != null;
    }
}

 

데이터베이스를 다루는 코드는 리포지토리가 대체하고 `User 객체의 중복 확인은 사용자명을 기준으로 한다`는 비즈니스 로직이 명확히 드러났다. 

 

 

리포지토리의 정의

리포지토리는 다음과 같이 인터페이스로 정의된다. 

public interface IUserRepository {
    void save(User user);
    User find(UserName name);
}

 

 

리포지토리의 책임

이때 사용자 중복을 확인하는 exists()라는 메서드를 리포지토리에 구현하는 것은 바람직하지 않다. 사용자 중복 확인은 도메인 규칙에 가깝기도 하고, 리포지토리의 책임은 퍼시스턴시까지기 때문이다. 퍼시스턴시는 도메인 객체를 저장하고 복원하는 것을 말한다. 

 

 

도메인 지식의 누락

그리고 만약 리포지토리에 사용자 중복 확인을 구현하게 되면 중복 확인이 사용자명 기준이라는 지식이 도메인 객체에서 누락된다. 따라서 도메인 지식이 누락되지 않도록 리포지토리의 책임은 퍼시스턴시에 국한되어야 한다.

public class UserService {
    private final IUserRepository userRepository;

    public UserService(IUserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public boolean exists(User user) {
        // 중복 확인이 사용자명 기준이라는 지식이 도메인 객체에서 누락된다
        return userRepository.exists(user);
    }
}

 

 

 


 

요약

 

1. 데이터베이스에 객체를 저장하고 복원하는 일, 즉 퍼시스턴시를 도메인 서비스에서 분리하기 위해 리포지토리를 사용

2. 리포지토리의 책임은 퍼시스턴시로 국한되어야 한다.

3. `사용자 중복 확인은 사용자 명을 기준으로 한다`와 같은 도메인지식이나 비즈니스 로직이 리포지토리에 구현되면 안된다.