Какую роль выполняет репозиторий в паттерне Repository?

«Какую роль выполняет репозиторий в паттерне Repository?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Репозиторий — это паттерн слоя доступа к данным, который выступает в роли посредника между доменным слоем и слоем данных. Он инкапсулирует всю логику работы с хранилищем, предоставляя доменному слою коллекцию объектов в памяти.

Основные цели:

  • Абстрагирование источника данных: Домен не знает, откуда берутся данные (БД, API, файл).
  • Упрощение логики домена: Избавляет бизнес-логику от сложных запросов.
  • Централизация запросов: Все запросы к данным находятся в одном месте.

Пример на Java (Spring Data JPA):

// 1. Доменная сущность
@Entity
class User {
    @Id
    private Long id;
    private String email;
    private boolean active;
}

// 2. Репозиторий как абстракция
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // Декларативный запрос по имени метода
    Optional<User> findByEmail(String email);
    List<User> findByActiveTrue();

    // Кастомный JPQL-запрос
    @Query("SELECT u FROM User u WHERE u.email LIKE %:domain")
    List<User> findUsersByEmailDomain(@Param("domain") String domain);
}

// 3. Использование в сервисе (доменный слой)
@Service
class UserService {
    private final UserRepository userRepo; // Зависимость от абстракции

    public User getUserByEmail(String email) {
        return userRepo.findByEmail(email)
                       .orElseThrow(() -> new UserNotFoundException(email));
    }
}

Ключевые преимущества:

  • Изоляция доменной логики от деталей инфраструктуры.
  • Упрощение тестирования — репозиторий можно легко замокать.
  • Единая точка для применения правил кэширования, спецификаций запросов и пагинации.