← Назад к вопросам
В чем разница между @Controller и @Repository в Spring?
1.0 Junior🔥 241 комментариев
#Spring Boot и Spring Data#Spring Framework
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Разница между @Controller и @Repository в Spring
Назначение и слой архитектуры
@Controller — это аннотация для компонентов слоя представления (Presentation/Web). Контроллеры отвечают за:
- Обработку HTTP-запросов
- Маршрутизацию запросов к нужным обработчикам
- Валидацию входных данных
- Формирование HTTP-ответов (JSON, HTML, XML)
@Repository — это аннотация для компонентов слоя данных (Data/Persistence). Репозитории отвечают за:
- Взаимодействие с базой данных
- CRUD операции (Create, Read, Update, Delete)
- Абстракцию логики доступа к данным
- Трансляцию исключений БД в Spring-исключения
Архитектурное разделение
// @Controller — слой представления
@Controller
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUserById(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(new UserDTO(user));
}
}
// @Repository — слой данных
@Repository
public class UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
@Query("SELECT u FROM User u WHERE u.active = true")
List<User> findAllActive();
}
Ключевые отличия
| Характеристика | @Controller | @Repository |
|---|---|---|
| Слой архитектуры | Presentation | Data/Persistence |
| Назначение | Обработка HTTP | Доступ к данным |
| Возвращает | ResponseEntity, Model, String | Entity, Collections, Optional |
| Обработка ошибок | HTTP статусы (404, 500) | DataAccessException |
| Зависимости | Service слой | ORM (JPA, Hibernate) |
| Тестирование | MockMvc, @WebMvcTest | Repository тесты, TestContainers |
Взаимодействие в многослойной архитектуре
Standard Spring Layered Architecture:
┌─────────────────────┐
│ @Controller │ ← Получает HTTP запрос
└──────────┬──────────┘
│ вызывает
↓
┌─────────────────────┐
│ @Service │ ← Содержит бизнес-логику
└──────────┬──────────┘
│ использует
↓
┌─────────────────────┐
│ @Repository │ ← Сохраняет/загружает из БД
└─────────────────────┘
Обработка исключений
@Repository преобразует низкоуровневые исключения БД (SQLIntegrityConstraintViolationException, etc.) в Spring DataAccessException, которые затем обрабатываются:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// Spring автоматически переводит SQL ошибки
// в DataAccessException
}
@Controller
public class UserController {
@ExceptionHandler(DataIntegrityViolationException.class)
public ResponseEntity<ErrorResponse> handleDuplicateEmail() {
return ResponseEntity.badRequest().body(...);
}
}
Практическое применение
Не смешивай ответственность — каждая аннотация имеет чёткую область применения:
✅ Правильно:
- Запрос идёт → Controller → Service → Repository → БД
- Ответ идёт в обратном порядке
- Каждый слой работает с данными своего уровня абстракции
❌ Неправильно:
- Repository возвращает JSON (это задача Controller)
- Controller напрямую работает с БД (нужен Service слой)
- Service возвращает HTTP ResponseEntity (это для Controller)