Каково назначение контроллера в архитектуре MVC?

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

Ответ

Контроллер (Controller) в паттерне MVC выступает посредником между View (Представлением) и Model (Моделью). Его основная задача — обработка пользовательского ввода и координация потока данных.

Основные обязанности (на примере Spring MVC):

  1. Маршрутизация HTTP-запросов — определение, какой метод контроллера должен обработать запрос.
  2. Валидация и преобразование входных данных — проверка параметров запроса, десериализация JSON/XML в объекты.
  3. Вызов бизнес-логики — обращение к сервисному слою (Model).
  4. Подготовка ответа — выбор представления, сериализация данных, установка HTTP-статусов.

Пример REST-контроллера на Spring:

@RestController // Объединяет @Controller и @ResponseBody
@RequestMapping("/api/books")
public class BookController {

    @Autowired
    private BookService bookService; // Ссылка на слой бизнес-логики

    // Обработка GET-запроса
    @GetMapping("/{id}")
    public ResponseEntity<BookDto> getBook(@PathVariable Long id) {
        BookDto book = bookService.findById(id);
        return ResponseEntity.ok(book); // HTTP 200 с телом
    }

    // Обработка POST-запроса с валидацией
    @PostMapping
    public ResponseEntity<BookDto> createBook(
            @Valid @RequestBody CreateBookRequest request) {
        BookDto created = bookService.create(request);
        return ResponseEntity
            .created(URI.create("/api/books/" + created.getId())) // HTTP 201
            .body(created);
    }
}

Принцип "Тонкого контроллера": Контроллер должен быть максимально простым — только маршрутизация и преобразование данных. Вся бизнес-логика должна находиться в сервисном слое (Model).