Расскажите о вашем опыте на последнем проекте

Ответ

На последнем проекте я занимался разработкой backend для fintech-приложения на Spring Boot.

Ключевые задачи и технологии:

  • Разработка REST API: Создание и поддержка эндпоинтов для платежей, транзакций и отчетности.
  • Интеграции: Подключение к внешним банковским системам через SOAP-протокол.
  • Работа с данными: Оптимизация сложных SQL-запросов в PostgreSQL и использование Hibernate для ORM.
  • Асинхронная обработка: Настройка Apache Kafka для надежной передачи событий между микросервисами.
  • Тестирование: Покрытие кода модульными и интеграционными тестами с использованием JUnit 5 и Mockito.
  • CI/CD: Участие в настройке пайплайнов в GitLab CI для автоматического развертывания.

Пример кода (контроллер):

@RestController
@RequestMapping("/api/v1/payments")
public class PaymentController {
    private final PaymentService paymentService;

    @Autowired
    public PaymentController(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public PaymentResponse processPayment(@Valid @RequestBody PaymentRequest request) {
        return paymentService.process(request);
    }
}

Почему такой подход? Использование final поля и инъекции через конструктор обеспечивает неизменяемость и упрощает тестирование. Аннотация @Valid автоматически проверяет входные данные.

Ответ 18+ 🔞

А, ну вот, слушай, про мой последний проект. Сидел я, значит, на этом вашем финтехе, блядь, как сыч, и пилил бэкенд на Spring Boot. Ну, стандартная песня, только масштаб, блядь, другой — деньги же, ёпта, чужие, тут ошибаться низя.

Чем конкретно мозги выносил:

  • REST API лепил: Эндпоинты эти, на оплаты, на транзакции, на отчёты — которых дохуя и больше. Чтобы всё чётко, по RFC, статусы правильные возвращались, а не просто «200 ОК» на любой пиздец.
  • Интеграции, мать их: С банками старыми, которые до сих пор в SOAP-е купаются, как в говне мамонты. Сука, эти WSDL, эти XML-схемы... Чистый ад, но подружили, блядь, подружили.
  • С базой водился: PostgreSQL наш, родной. Там такие запросы порой приходилось писать, что сам от себя охуевал. Плюс Hibernate, чтобы с объектами работать, а не голыми SQL-инъекциями, как какой-то школяр.
  • Асинхронщина: Чтобы сервисы между собой не синхронно, как идиоты, общались, а через Apache Kafka. События туда-сюда, гарантированная доставка, ретраи — красота, в общем. Хуй с горы, если один микросервис лег, остальные не должны падать.
  • Тесты, блядь: Без них никуда. JUnit 5 и Mockito — мои лучшие друзья. Каждый новый метод так затестил, что он сам начинает сомневаться в своём существовании. Интеграционные, модульные — овердохуища всего.
  • CI/CD: В GitLab CI эти пайплайны настраивал, чтобы коммитнул — и оно само собралось, протестировалось и, если не сломал ничего, укатило на прод. Волшебство, ёпта.

Вот, глянь, кусочек кода, как я контроллер делал:

@RestController
@RequestMapping("/api/v1/payments")
public class PaymentController {
    private final PaymentService paymentService;

    @Autowired
    public PaymentController(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public PaymentResponse processPayment(@Valid @RequestBody PaymentRequest request) {
        return paymentService.process(request);
    }
}

А почему так, а не иначе? Да всё просто, как три копейки. Поле final — чтобы никто, сука, потом не подменил сервис на какой-нибудь левый. Инъекция через конструктор — сразу видно, от чего объект зависит, да и для тестов удобно, подсунул мок и поехал. Аннотация @Valid — это вообще магия, она сама, блядь, проверяет, что в запросе пришло, не надо руками if'ы городить. В общем, не айс, конечно, но работает как швейцарские часы, ёбана.