Какие методы должен содержать контроллер в Spring MVC/REST?

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

Ответ

Контроллер в Spring (@Controller или @RestController) должен содержать только методы для обработки HTTP-запросов. Его основная задача — быть тонким слоем между клиентом и бизнес-логикой приложения.

Что должен делать контроллер (его методы):

  1. Принимать HTTP-запросы, маппируя их через аннотации (@GetMapping, @PostMapping и т.д.).
  2. Валидировать входные данные (с помощью @Valid).
  3. Преобразовывать DTO (Data Transfer Object) в доменные модели и наоборот.
  4. Вызывать методы сервисного слоя для выполнения бизнес-логики.
  5. Формировать и возвращать HTTP-ответы (статусы, заголовки, тело).

Чего НЕ должно быть в контроллере:

  • Прямой работы с базой данных (JPA, JDBC).
  • Сложной бизнес-логики.
  • Транзакционной логики (управление @Transactional).

Пример правильно организованного REST-контроллера:

@RestController
@RequestMapping("/api/users")
public class UserController {
    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/{id}")
    public ResponseEntity<UserDto> getUser(@PathVariable Long id) {
        UserDto user = userService.getUserById(id);
        return ResponseEntity.ok(user);
    }

    @PostMapping
    public ResponseEntity<UserDto> createUser(@Valid @RequestBody CreateUserRequest request) {
        UserDto createdUser = userService.createUser(request);
        return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
    }
}

Такой подход обеспечивает разделение ответственности (Single Responsibility Principle) и упрощает тестирование.