Проверяет архитектурное мышление и разделение ответственности.
HTTP-handler должен заниматься только транспортом: парсингом запроса и формированием ответа. Бизнес-логика внутри handler’ов ухудшает тестируемость и сопровождаемость кода.
HTTP-handler — это входная точка, а не место для бизнес-правил.
Если бизнес-логика внутри handler’а:
код сложно тестировать без HTTP;
логика размазывается по разным endpoint’ам;
невозможно переиспользовать код (CLI, gRPC, batch);
сложнее внедрять middlewares и ретраи.
Правильная структура:
handler -> service -> repository
Пример:
func Handler(w http.ResponseWriter, r *http.Request) {
dto := parse(r)
result, err := service.Process(r.Context(), dto)
respond(w, result, err)
}Такой подход:
упрощает unit-тесты;
делает код чище;
облегчает поддержку.
Вывод: handler — это транспортный слой, а не место для логики.