[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-arkhitektura-prilozheniy-chto-takoe-pattern-repository":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":20,"progress":21,"seo":22},142,"chto-takoe-pattern-repository",3,"arkhitektura-prilozheniy","Архитектура приложений","🏗️","Что такое паттерн Repository?","Repository (Репозиторий) -- паттерн, предоставляющий абстракцию для доступа к данным. Репозиторий создаёт иллюзию работы с коллекцией объектов в памяти, скрывая детали хранения (SQL-запросы, ORM, внешние API). Как библиотекарь: вы просите книгу по названию, а он знает, на какой полке и в каком зале она стоит.\n\n```\nБизнес-логика  ──────▶  Repository (интерфейс)\n                               ▲\n                               │ реализует\n                               │\n                    ┌──────────┴──────────┐\n                    │   JPA Repository     │\n                    │   (инфраструктура)   │\n                    └──────────┬──────────┘\n                               │\n                          ┌────┴────┐\n                          │   БД    │\n                          └─────────┘\n```\n\n### Зачем нужен\n\n- Изолирует бизнес-логику от способа хранения данных.\n- Упрощает тестирование -- можно подставить in-memory реализацию.\n- Центральное место для запросов к определённой сущности.\n- Соответствует принципу DIP из SOLID.\n\n### Пример\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Интерфейс в доменном слое\npublic interface PaymentRepository {\n    Payment findById(PaymentId id);\n    List\u003CPayment> findByStatus(PaymentStatus status);\n    void save(Payment payment);\n    void delete(PaymentId id);\n}\n\n\u002F\u002F Реализация в инфраструктурном слое\n@Repository\npublic class JpaPaymentRepository implements PaymentRepository {\n\n    private final PaymentJpaRepo jpaRepo;\n    private final PaymentMapper mapper;\n\n    @Override\n    public Payment findById(PaymentId id) {\n        PaymentEntity entity = jpaRepo.findById(id.getValue())\n            .orElseThrow(() -> new PaymentNotFoundException(id));\n        return mapper.toDomain(entity);\n    }\n\n    @Override\n    public void save(Payment payment) {\n        PaymentEntity entity = mapper.toEntity(payment);\n        jpaRepo.save(entity);\n    }\n\n    \u002F\u002F ...\n}\n\n\u002F\u002F Spring Data JPA -- упрощённая реализация\npublic interface PaymentJpaRepo extends JpaRepository\u003CPaymentEntity, Long> {\n    List\u003CPaymentEntity> findByStatus(String status);\n}\n```\n\n\u003C\u002Fdetails>\n\n### Repository vs DAO\n\n| Аспект | DAO (Data Access Object) | Repository |\n|--------|--------------------------|------------|\n| Ориентация | На таблицу БД | На доменный объект (агрегат) |\n| Работает с | Записями | Бизнес-сущностями |\n| Гранулярность | Один DAO на одну таблицу | Может использовать несколько таблиц для сборки агрегата |\n| Контекст | Инфраструктурный паттерн | DDD-паттерн |\n\nВ DDD репозиторий создаётся для каждого Aggregate Root, а не для каждой таблицы. Например, `OrderRepository` загружает `Order` вместе с его `OrderItem`-ами как единый агрегат.\n\n> **На собеседовании:** Интервьюер хочет услышать разницу между Repository и DAO, а также понимание связи с DDD (Aggregate Root). Частая ошибка -- считать Repository просто обёрткой над DAO или Spring Data JPA-интерфейсом.","","junior",[15,16,17,18,19],"ddd","patterns","data-access","repository","architecture",[],null,{"title":23,"description":24,"ogTitle":23,"ogDescription":25,"keywords":26,"schemaAnswer":33,"featuredSnippetReady":34},"Паттерн Repository: абстракция доступа к данным — Gymterview","Что такое паттерн Repository? Абстракция для доступа к данным, отличие от DAO, реализация в Spring Data JPA. Примеры на Java для собеседования.","Разбор паттерна Repository: абстракция работы с данными, отличие от DAO, реализация в Spring Data JPA.",[27,28,29,30,31,32],"паттерн Repository","репозиторий","DAO vs Repository","Spring Data JPA","доступ к данным","DDD","Repository — паттерн, предоставляющий абстракцию для доступа к данным, создающий иллюзию работы с коллекцией объектов в памяти и скрывающий детали хранения. Он изолирует бизнес-логику от способа хранения, упрощает тестирование и соответствует принципу DIP из SOLID. В отличие от DAO, который ориентирован на таблицу БД, Repository ориентирован на доменный объект (агрегат). В DDD репозиторий создаётся для каждого Aggregate Root, а не для каждой таблицы.",true]