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

Что вызовешь из контроллера при создании MVC приложения

2.3 Middle🔥 161 комментариев
#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Архитектура MVC и вызовы из контроллера

В классической архитектуре Model-View-Controller (MVC) контроллер выступает промежуточным звеном между пользовательским интерфейсом и бизнес-логикой приложения. Контроллер не содержит сложной логики — он лишь координирует взаимодействие компонентов.

Что вызывается из контроллера

Из контроллера обычно вызывают:

  1. Сервисы (Service слой) — основной вызов для обработки бизнес-логики
  2. Репозитории (если нет отдельного Service слоя) — для доступа к данным
  3. Валидаторы — для проверки входных данных
  4. Утилиты и хелперы — вспомогательные функции

Пример структуры контроллера

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    private final UserService userService;
    private final UserValidator validator;
    
    public UserController(UserService userService, UserValidator validator) {
        this.userService = userService;
        this.validator = validator;
    }
    
    @PostMapping
    public ResponseEntity<UserDTO> createUser(@RequestBody CreateUserRequest request) {
        // Валидация входных данных
        validator.validate(request);
        
        // Вызов сервиса для выполнения бизнес-логики
        User user = userService.createUser(request);
        
        // Преобразование результата в DTO и возврат
        return ResponseEntity.status(HttpStatus.CREATED)
            .body(UserMapper.toDTO(user));
    }
    
    @GetMapping("/{id}")
    public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
        User user = userService.getUserById(id);
        return ResponseEntity.ok(UserMapper.toDTO(user));
    }
}

Слой сервисов (Service)

Сервис содержит всю бизнес-логику и вызывает репозитории:

@Service
public class UserService {
    
    private final UserRepository userRepository;
    private final EmailService emailService;
    
    public User createUser(CreateUserRequest request) {
        // Проверка, не существует ли уже такой пользователь
        if (userRepository.existsByEmail(request.getEmail())) {
            throw new UserAlreadyExistsException("Email уже зарегистрирован");
        }
        
        // Создание и сохранение пользователя
        User user = new User();
        user.setName(request.getName());
        user.setEmail(request.getEmail());
        user.setPassword(hashPassword(request.getPassword()));
        
        User savedUser = userRepository.save(user);
        
        // Отправка приветственного письма
        emailService.sendWelcomeEmail(savedUser.getEmail());
        
        return savedUser;
    }
    
    public User getUserById(Long id) {
        return userRepository.findById(id)
            .orElseThrow(() -> new UserNotFoundException("Пользователь не найден"));
    }
}

Ключевые принципы

Контроллер должен быть "тонким" — содержать только логику преобразования HTTP-запросов/ответов. Вся бизнес-логика находится в сервисах.

Зависимости внедряются через конструктор (Constructor Injection) — это делает компонент тестируемым и явно показывает зависимости.

Разделение ответственности:

  • Controller → обработка HTTP, валидация, маршрутизация
  • Service → бизнес-логика, транзакции, оркестрация
  • Repository → работа с БД
  • Entity → модели данных

Этот подход обеспечивает чистоту кода, тестируемость и поддерживаемость приложения.

Что вызовешь из контроллера при создании MVC приложения | PrepBro