Приведите пример проекта, который вы разрабатывали самостоятельно, и опишите его ключевые компоненты.

«Приведите пример проекта, который вы разрабатывали самостоятельно, и опишите его ключевые компоненты.» — вопрос из категории Софт-скиллы, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Проект: RESTful API для управления задачами (To-Do List) на Spring Boot.

Цель: Создать backend-сервис с полным циклом аутентификации, авторизации и CRUD-операций.

Стек технологий:

  • Backend: Java 17, Spring Boot 3
  • Безопасность: Spring Security, JWT (JSON Web Token)
  • База данных: PostgreSQL, Spring Data JPA (Hibernate)
  • Документация: OpenAPI 3 (Springdoc)
  • Тестирование: JUnit 5, Mockito, Testcontainers

Ключевые компоненты и реализация:

  1. JWT Аутентификация и Авторизация:

    • Реализован фильтр для проверки JWT-токена в каждом запросе.
      @Component
      public class JwtAuthenticationFilter extends OncePerRequestFilter {
      @Override
      protected void doFilterInternal(HttpServletRequest request,
                                      HttpServletResponse response,
                                      FilterChain chain) throws IOException, ServletException {
          String authHeader = request.getHeader("Authorization");
          if (authHeader != null && authHeader.startsWith("Bearer ")) {
              String jwt = authHeader.substring(7);
              String username = jwtUtil.extractUsername(jwt); // Утилита для работы с JWT
              if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
                  if (jwtUtil.validateToken(jwt, username)) {
                      // Создание объекта Authentication и установка в SecurityContext
                      UsernamePasswordAuthenticationToken authToken =
                          new UsernamePasswordAuthenticationToken(username, null, authorities);
                      SecurityContextHolder.getContext().setAuthentication(authToken);
                  }
              }
          }
          chain.doFilter(request, response);
      }
      }
  2. Слой данных (Repository):

    • Использовал Spring Data JPA для декларативного доступа к данным.
      @Repository
      public interface TaskRepository extends JpaRepository<Task, Long> {
      List<Task> findByUserIdAndCompleted(Long userId, boolean completed);
      @Query("SELECT t FROM Task t WHERE t.dueDate < :date AND t.completed = false")
      List<Task> findOverdueTasks(@Param("date") LocalDate date);
      }
  3. Обработка больших данных (отдельный модуль):

    • Парсер CSV-файлов с использованием Java Stream API и многопоточности (ForkJoinPool) для импорта задач.
      public List<Task> parseCsvFile(Path filePath) throws IOException {
      return Files.lines(filePath)
                  .skip(1) // Пропуск заголовка
                  .parallel() // Параллельная обработка строк
                  .map(line -> line.split(","))
                  .filter(parts -> parts.length == 3)
                  .map(parts -> new Task(parts[0], parts[1], LocalDate.parse(parts[2])))
                  .collect(Collectors.toList());
      }

Что было реализовано:

  • Регистрация и вход пользователя с выдачей JWT.
  • CRUD для задач с привязкой к пользователю.
  • Фильтрация и пагинация задач.
  • Интеграционные и unit-тесты.
  • Docker-контейнеризация приложения и БД.

Итог: Проект продемонстрировал навыки работы с ключевыми Spring-технологиями, проектированием API, безопасностью и эффективной обработкой данных.