Каковы основные компоненты и принципы построения веб-приложения на Java?

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

Ответ

Типичное Java веб-приложение строится по многоуровневой архитектуре (чаще всего 3-слойной) и включает следующие ключевые компоненты:

1. Уровень представления (Presentation Layer / Controller):

  • Задача: Обработка HTTP-запросов и формирование ответов (HTML, JSON, XML).
  • Технологии: Spring MVC (@Controller, @RestController), JAX-RS (Jakarta REST), сервлеты.
  • Пример REST-контроллера на Spring Boot:

    @RestController
    @RequestMapping("/api/products")
    @RequiredArgsConstructor // Lombok для инъекции зависимости
    public class ProductController {
        private final ProductService productService;
    
        @GetMapping
        public ResponseEntity<List<ProductDto>> getAll() {
            return ResponseEntity.ok(productService.findAll());
        }
    
        @PostMapping
        public ResponseEntity<ProductDto> create(@Valid @RequestBody ProductDto dto) {
            return ResponseEntity.status(HttpStatus.CREATED)
                                 .body(productService.create(dto));
        }
    }

2. Бизнес-уровень (Business Layer / Service):

  • Задача: Содержит основную бизнес-логику, правила, транзакции.
  • Технологии: Spring Beans (@Service, @Transactional), EJB.

3. Уровень доступа к данным (Data Access Layer / Repository):

  • Задача: Абстракция для работы с хранилищами данных (БД, кэш).
  • Технологии: Spring Data JPA (@Repository), Hibernate, JDBC, JdbcTemplate.

4. Дополнительные ключевые компоненты:

  • Модель данных (Entity/DTO): @Entity для JPA, Data Transfer Objects для обмена между слоями.
  • Конфигурация и Dependency Injection (DI): Spring Core для управления бинами и инверсии контроля.
  • Безопасность: Spring Security для аутентификации и авторизации.
  • Клиентская часть: Может быть отдельным SPA (React, Angular) или серверным рендерингом (Thymeleaf, JSP).

Принципы: Разделение ответственности (SoC), инъекция зависимостей (DI), использование шаблонов проектирования (например, MVC, DTO), обеспечение безопасности на всех уровнях.