← Назад к вопросам

В чем разница между @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
Слой архитектурыPresentationData/Persistence
НазначениеОбработка HTTPДоступ к данным
ВозвращаетResponseEntity, Model, StringEntity, Collections, Optional
Обработка ошибокHTTP статусы (404, 500)DataAccessException
ЗависимостиService слойORM (JPA, Hibernate)
ТестированиеMockMvc, @WebMvcTestRepository тесты, 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)
В чем разница между @Controller и @Repository в Spring? | PrepBro