Оглавление
Spring Boot
Главный фреймворк Java для серверных приложений: REST API, Spring Data, безопасность, тесты и выкладка.
1.Начало работы
- Что такое Spring и Spring BootЗачем нужен Spring, чем от него отличается Spring Boot и что мы построим в этом курсе.
- Создание проектаКак создать проект Spring Boot на start.spring.io и что лежит в каждом сгенерированном файле.
- Структура проекта и pom.xmlГде в проекте Spring Boot лежит код, настройки и шаблоны, и как устроен файл pom.xml со стартерами.
- Запуск и встроенный серверКак запустить приложение Spring Boot, что значат строки журнала и как сменить порт встроенного Tomcat.
2.Основы Spring
- Бины и контейнерЧто такое бин Spring, как аннотации @Component и @Service регистрируют классы и зачем нужен @Bean.
- Внедрение зависимостейКак Spring передаёт одни бины в другие через конструктор и что делать, если подходящих бинов несколько.
- Настройки: properties и YAMLКак задавать настройки в application.properties и application.yaml, читать их через @Value и переопределять при запуске.
- ПрофилиКак держать разные настройки для разработки и сервера с помощью профилей Spring и как их включать.
- Группа настроек в записиКак собрать связанные настройки в одну запись с @ConfigurationProperties вместо разрозненных @Value.
3.REST API
- Контроллер и JSONКак @RestController принимает HTTP-запросы и превращает возвращаемые объекты в JSON.
- Адреса, параметры пути и строки запросаКак задать общий префикс адресов, получить номер статьи из пути через @PathVariable и фильтр через @RequestParam.
- Тело запроса и DTOКак принять JSON в POST-запросе через @RequestBody и почему для входных данных заводят отдельную запись.
- Ответы и коды статусаКак вернуть правильный код статуса HTTP через ResponseEntity и @ResponseStatus, и как устроены изменение и удаление.
- Проверка данныхКак проверять входящие данные аннотациями Jakarta Validation и @Valid, не написав ни одного if.
- Обработка ошибок и ProblemDetailКак превращать исключения в понятные ответы API через @RestControllerAdvice и стандартный формат ProblemDetail.
- Сервисы и слоиКак разделить приложение на контроллеры, сервисы и репозитории и какой код в каком слое писать.
- Загрузка файловКак принять файл в запросе через MultipartFile, ограничить размер, сохранить его на диск и отдать обратно по адресу.
- CORS: запросы с другого сайтаПочему браузер блокирует запросы к API со страницы на другом адресе и как разрешить их через @CrossOrigin и общую настройку, в том числе со Spring Security.
- Документация API: OpenAPI и Swagger UIКак библиотека springdoc-openapi сама описывает API блога в формате OpenAPI и показывает страницу Swagger UI, где запросы можно отправить прямо из браузера.
4.База данных
- Подключение базы данныхЧто такое JPA, Hibernate и Spring Data, как подключить базу H2 для разработки и что поменять для PostgreSQL.
- СущностиКак описать таблицу базы данных классом Java с аннотациями @Entity, @Id и @Column.
- РепозиторииКак Spring Data JPA создаёт репозиторий по одному интерфейсу и как перевести сервис блога на базу данных.
- Запросы по имени методаКак Spring Data строит SQL-запрос по одному названию метода репозитория: findBy, OrderBy, Containing и другие слова.
- Свои запросы: @QueryКак написать запрос на JPQL или обычном SQL в аннотации @Query, когда имени метода уже не хватает.
- Связи между сущностямиКак связать статьи с пользователями и комментариями через @ManyToOne и @OneToMany и отдать комментарии по вложенному адресу.
- Страницы и сортировкаКак отдавать список статей частями через Pageable, управлять сортировкой из адреса и возвращать стабильный JSON через PagedModel.
- ТранзакцииКак @Transactional объединяет несколько действий с базой в одно целое, откатывает их при ошибке и сохраняет изменения сущностей без save.
- Миграции базы данных: FlywayКак вести схему базы SQL-файлами миграций Flyway вместо ddl-auto и что делать, когда нужна новая колонка.
5.Страницы на Thymeleaf
- Шаблоны ThymeleafКак отдавать HTML-страницы из Spring Boot: @Controller, модель и атрибуты Thymeleaf th:text, th:each, th:href.
- ФормыКак сделать HTML-форму новой статьи на Thymeleaf: th:object и th:field, проверка через @Valid и BindingResult, переход после отправки.
- Общий макет и статические файлыКак вынести шапку и подвал в фрагменты Thymeleaf, передать фрагменту параметр и подключить CSS из папки static.
6.Безопасность
- Spring Security: первое знакомствоЧто происходит, когда в проект добавляют Spring Security: всё закрыто, временный пароль в журнале, ответы 401 и вход через curl.
- Пользователи и паролиКак хранить пользователей блога в базе, шифровать пароли через PasswordEncoder и подключить их к Spring Security через UserDetailsService.
- Правила доступа к APIКак в SecurityFilterChain открыть чтение для всех, закрыть изменения для гостей, выдать удаление только администратору и узнать текущего пользователя.
- Вход на сайт: форма и сессияКак сделать для страниц блога свою форму входа, сессию через cookie, выход и вывод имени пользователя в шаблоне.
- Вход в API по токену JWTКак выдать клиенту API токен JWT по имени и паролю и проверять его в каждом запросе через OAuth2 Resource Server со своим секретным ключом.
7.Тесты
- Тесты с @SpringBootTestКак запустить в тесте всё приложение Spring, проверить сервис на настоящей базе в памяти и откатывать данные после каждого теста.
- Тесты контроллеров: MockMvcКак проверить адреса API и страницы без настоящего сервера: MockMvc, jsonPath, @WithMockUser и токен CSRF в тестах.
- Тесты репозиториев: @DataJpaTestКак быстро проверить запросы репозиториев срезом @DataJpaTest на встроенной базе, не поднимая веб-часть приложения.
- Тесты на настоящей PostgreSQL: TestcontainersКак запустить в тесте настоящую PostgreSQL в контейнере Docker через Testcontainers и подключить к ней приложение аннотацией @ServiceConnection.
8.Полезные возможности
- Запросы к другим API: RestClientКак из приложения Spring Boot обратиться к чужому HTTP API через RestClient, получить JSON в запись и обработать ошибку 404.
- Задачи по расписаниюКак запускать метод по расписанию через @EnableScheduling и @Scheduled: интервалы, выражения cron и расписание в настройках.
- КешированиеКак запоминать результаты методов через @Cacheable, сбрасывать устаревшие значения через @CacheEvict и проверить, что база больше не нагружается.
- ЖурналКак писать сообщения в журнал через SLF4J, читать строку журнала Spring Boot, управлять уровнями и сохранять журнал в файл.
9.Выкладка
- Actuator и проверка здоровьяКак Spring Boot Actuator показывает состояние приложения: адрес /actuator/health, сведения /actuator/info и что можно открывать наружу.
- Сборка JAR и запуск на сервереКак собрать приложение в один исполняемый JAR, запустить его на сервере с профилем prod и передать пароль базы через переменные окружения.
- Образ DockerКак упаковать приложение Spring Boot в образ Docker через Dockerfile или команду spring-boot:build-image и запустить его вместе с PostgreSQL.