Pull to refresh

Comments 18

Рекомендую писать проект современно: на Java это стек: Spring Boot + Spring Data JPA

Эмм, не совсем современно, хоть и популярно. Spring тянет с собой медленный reflection stack (все ключи бинов в итоге приводятся к строке). Современно -- это Dagger 2, который генерирует dependency injection во время компиляции, так что JIT проще, и можно скомпилировать код.

Вообще современно сейчас деплоить приложения в контейнерах легковесных, где довольно важно startup time. Отчасти из-за этого, по моим наблюдениям, Java в последнее время стали всё больше компилировать с помощью GraalVM. А там dependency injection ahead-of-time очень даже помогает.

Для веб сервера Jetty конечно очень популярен, не спорю, но я бы сказал сейчас современно писать на обёртках Netty (из-за async processing), например http4k или ktor для Котлина. Они тоже компилируются с GraalVM.

Для all-around frameworks (по крайней мере в Долине) популярны Dropwizard и Micronaut.

А JPA уже точно устарело. JOOQ самый популярный из современных, я бы сказал. Опять же таки из-за кодогенерации во время билда, как и Dagger.

Спасибо за комментарий! Поправил на "востребованном на рынке стеке ". Действительно, если современный воспринимать как самый передовой, то это не Spring Boot. А популярность фреймворка легко оценить для России в вакансиях на hh или по обзорам: https://www.jrebel.com/blog/2021-java-technology-report, https://snyk.io/jvm-ecosystem-report-2021/ - Spring Boot - 58-62%, Dropwizard  4%-9%, Micronaut 4%-5%. Dagger отсутствует.
Spring Data - это работа с БД по умолчанию в Spring Boot (причем не только с реляционными). Поэтому что "точно устарело" и JOOQ  популярнее- категорически не соглашусь. Ну и еще раз именно про тестовые приложения на вакансии - чем у вас все будет стандартнее для разработки и совпадать со стеком компании, тем выше оценка.

  • 6.4: Обновление в базе делается через update - не стоит смешивать JPA и DAO. апдейт делать не надо и сейв загруженного POJO также не надр - достаточно лишь изменить поля на необходимые значения, остальную работу сделает JPA. JPA и есть "паттерн".

Спасибо за плодовитость комментариев:)
6.4 Я в курсе, что в загруженных entity при изменении полей save не нужен. Речь идет о логике, когда ради экономии пары строчек Java люди объединяют save и update примерно так:

if(updateCondition)
repository.delete(entity)
}
repository.save(entity)

  • 7.5: Поля базы case insensitive, не пишите camelStyle - в обратных одинарных кавычках для мариядэбэ или майскл кейс сенситив, для оракла в двойных кавычках уейс сенситив, для мсскл в квадратных скобках кейс сенситив. поля можно указать в маппинге сущьностей. Поля кейс сенситив...

Я именно об этом- не надо camelCase и двойных кавычек вместе с ними

  • 7.6: Таблицы я предпочитаю именовать в единственном числе. Исключение - users, т. к. user - зарезервированное слово - order и другие также лучше в множественном.

  • 8.2: Я предпочитаю четкое разделение ролей на основе URL. Например, для админа URL содержит /admin - спорное утверждение, не имеющее отношения к праыильному выполнению тестового задания.

Именно поэтому я написал - "Я предпочитаю"

10.2: Проверяйте входные данные Primary Key при create/update в контроллерах. - этим может заниматься база данных, а Джава (слой данных) возбуждать исключение и возврвщать клиенту, например "бэд реквест". Без блокировки не существующих записей (да, это можно сделать) это не сделать консистентно, либо нужно изменять уровень изоляции транзакций, а это уменьшает масштабируемость приложения. Проще на это не обращать внимание, за вас сделает эту работу база данных и джпа/спринг.

Это неверно. При POST надо проверять id==nullобъекта, а при PUT соответствие id в URL и в объекте в теле запроса (null допускается). База этого не сделает и проверка должна быть именно в контроллере- он отвечает за проверку входных данных

  • 11.1: JUnit-тесты очень желательны. Можно не делать 100% покрытие, только основные сценарии - junit тесты надо писать без поднятия контекста. С поднятием контекста - это лучше относить к интеграционным тестам. Почему? Потому, что тесты с контестом работают медленно, лучше мказать медленно поднимается контекст. Тесты дата-лейера тем более это интеграционные тесты. Как писать на спринге и не поднимать его в юнмт тестах? надо использовать библиотеку моков, например мокито.

Если тестов много то это не так заметно, так как спринг может кешировать контекст.

Все так, по умолчанию кэширует. На достаточно скромной машине порядка 100 тестов в минуту через MockMvc меня устраивает.

Поправка: - на стажировке у нас 133 теста, у меня выполняются за 18 секунд.

  • ОБЯЗАТЕЛЬНО: запусти mvn test - ошибок быть не должно - mvn verify тоже ошибки быть не должно при запуске интеграционных тестов.

Sign up to leave a comment.

Articles