Всем привет!
На этой неделе плотно занималась учебным проектом. В этот раз к нашему проекту шеринга нужно было подключить базу данных через JPA и внести новые фичи. Нам дали ~700 тестов, на которых наш проект должен был успешно отработать. Из новых фич: добавили возможность бронировать вещи и оставлять комментарии после аренды.
Тесты были хорошие, в плане обработки разнообразных крайних случаев: то пользователь оставляет комментарии на вещь, которую не арендовал, то владелец хочет арендовать свою собственную вещь.
Самым сложным для понимания был момент с выводом последнего и следующего бронирования. Сначала поняла топорно, отсортировала бронирования по времени и выдавала их по индексам списка, по порядку. Это естественно не было правильным решением.
Потом стала смотреть почему тест ожидает именно эти бронирования, сделала свой запрос в базу данных, стала смотреть на результаты и разбираться в логике почему ожидаемый результат правильный.
Когда поняла, что последняя бронь является последней по отношению к текущему времени запроса, уже пошла придумывать алгоритм отбора таких бронирований и он успешно отработал.
Вообще, было очень интересно над ним работать, задание было большим, пугающим и местами очень непростым. Но постепенно, решая вопросы по мере поступления я его дописала, а вчера вечером мне его зачли,после небольших исправлений.
Вчера пока ждала проверки, стала потихоньку возвращаться к своим вопросам по другим темам, начала смотреть курс по докеру, потом по кафке. Ещё вчера "разговорилась" с chat gpt часа на полтора, просила его сравнивать разные инструменты, применять их на примерах с кодом. Очень понравилось)
На этой неделе плотно занималась учебным проектом. В этот раз к нашему проекту шеринга нужно было подключить базу данных через JPA и внести новые фичи. Нам дали ~700 тестов, на которых наш проект должен был успешно отработать. Из новых фич: добавили возможность бронировать вещи и оставлять комментарии после аренды.
Тесты были хорошие, в плане обработки разнообразных крайних случаев: то пользователь оставляет комментарии на вещь, которую не арендовал, то владелец хочет арендовать свою собственную вещь.
Самым сложным для понимания был момент с выводом последнего и следующего бронирования. Сначала поняла топорно, отсортировала бронирования по времени и выдавала их по индексам списка, по порядку. Это естественно не было правильным решением.
Потом стала смотреть почему тест ожидает именно эти бронирования, сделала свой запрос в базу данных, стала смотреть на результаты и разбираться в логике почему ожидаемый результат правильный.
Когда поняла, что последняя бронь является последней по отношению к текущему времени запроса, уже пошла придумывать алгоритм отбора таких бронирований и он успешно отработал.
Вообще, было очень интересно над ним работать, задание было большим, пугающим и местами очень непростым. Но постепенно, решая вопросы по мере поступления я его дописала, а вчера вечером мне его зачли,после небольших исправлений.
Вчера пока ждала проверки, стала потихоньку возвращаться к своим вопросам по другим темам, начала смотреть курс по докеру, потом по кафке. Ещё вчера "разговорилась" с chat gpt часа на полтора, просила его сравнивать разные инструменты, применять их на примерах с кодом. Очень понравилось)
👏6🔥1
Всем привет!
Вчера целый день изучала Docker. Хочу сегодня здесь немного коротко структурировать основные понятия:
Что такое докер?
Docker – это программная платформа для быстрой разработки, тестирования и развертывания приложений. Docker упаковывает ПО в стандартизованные блоки, которые называются контейнерами.
Что такое Docker контейнер?
Это такой блок, который включает все необходимое для работы приложения: библиотеки, системные инструменты, код и среду исполнения.
Что такое Docker-образ? (на английском Docker Image)
Docker-образ — шаблон для создания Docker-контейнеров. Представляет собой исполняемый пакет, содержащий все необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации.
Казалось бы, определения для контейнера и образа очень похожи. Чем же отличается докер контейнер от докер образа? Docker контейнер – это рабочая среда для образа. А докер-образ — это неизменяемый образ, из которого разворачивается контейнер.
Зачем нам может понадобиться Docker?
Когда разработка ведется разными людьми, на разных компьютерах, для того, чтобы запустить приложение, использующее, например, Java и PostgreSQL, нужно установить на каждый компьютер и java и postgresql. Когда мы хотим продемонстрировать работу нашего приложения, нам нужно установить java и postgresql на ту машину, на которой будет демо, либо привезти свой ноутбук. Если добавить удаленных тестировщиков, которые будут тестировать наше приложение, им также нужно будет установить и java и postgresql на их компьютерах. В зависимости от операционной системы на разных компьютерах, установка может отличаться, что может привести к сложностям.
Захотим мы протестировать наше приложение с работой с другой базой данных, MongoDb или MySQL, нам нужно будет установить все три базы данных на каждый компьютер.
Так вот докер позволяет запустить наше приложение не устанавливая никаких дополнительных инструментов на наш компьютер напрямую. Потому что контейнер — это своя собственная изолированная среда, включающая все необходимые настройки и инструменты для запуска и работы нашего приложения. И загрузить и запустить такой контейнер можно одной командой — docker run my-app:1.0, где my-app будет именем нашего образа, а 1.0 версией (тегом) нашего образа.
Вчера целый день изучала Docker. Хочу сегодня здесь немного коротко структурировать основные понятия:
Что такое докер?
Docker – это программная платформа для быстрой разработки, тестирования и развертывания приложений. Docker упаковывает ПО в стандартизованные блоки, которые называются контейнерами.
Что такое Docker контейнер?
Это такой блок, который включает все необходимое для работы приложения: библиотеки, системные инструменты, код и среду исполнения.
Что такое Docker-образ? (на английском Docker Image)
Docker-образ — шаблон для создания Docker-контейнеров. Представляет собой исполняемый пакет, содержащий все необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации.
Казалось бы, определения для контейнера и образа очень похожи. Чем же отличается докер контейнер от докер образа? Docker контейнер – это рабочая среда для образа. А докер-образ — это неизменяемый образ, из которого разворачивается контейнер.
Зачем нам может понадобиться Docker?
Когда разработка ведется разными людьми, на разных компьютерах, для того, чтобы запустить приложение, использующее, например, Java и PostgreSQL, нужно установить на каждый компьютер и java и postgresql. Когда мы хотим продемонстрировать работу нашего приложения, нам нужно установить java и postgresql на ту машину, на которой будет демо, либо привезти свой ноутбук. Если добавить удаленных тестировщиков, которые будут тестировать наше приложение, им также нужно будет установить и java и postgresql на их компьютерах. В зависимости от операционной системы на разных компьютерах, установка может отличаться, что может привести к сложностям.
Захотим мы протестировать наше приложение с работой с другой базой данных, MongoDb или MySQL, нам нужно будет установить все три базы данных на каждый компьютер.
Так вот докер позволяет запустить наше приложение не устанавливая никаких дополнительных инструментов на наш компьютер напрямую. Потому что контейнер — это своя собственная изолированная среда, включающая все необходимые настройки и инструменты для запуска и работы нашего приложения. И загрузить и запустить такой контейнер можно одной командой — docker run my-app:1.0, где my-app будет именем нашего образа, а 1.0 версией (тегом) нашего образа.
👍6
Всем привет!
Небольшой пятничный апдейт 👨💻
После того, как познакомилась с Docker, захотелось применить его на своем пет-проекте. Но для этого захотелось его сначала доделать.
Поэтому начала с настройки Spring Security. Наконец, это у меня получилось, пароли стали сохраняться в зашифрованном виде. После этого, подключила Json Web Token, который теперь может выдаваться юзеру на короткое время действия, и с которым юзер может заходить в защищенные эндпоинты.
Теперь хочу подключить простой фронт. Сомневаюсь, стоит ли делать через модель Spring MVC или через Vaadin... 🤔 C одной стороны, мне интереснее Vaadin, потому что он на Java, а MVC предполагает знание, как минимум, HTML. Но оба варианта предполагают изменение существующей логики — у меня сейчас реализованы REST контроллеры.
Буду рада, если кто-нибудь из читающих посоветует, что лучше выбрать (или свой вариант) ☺️
Небольшой пятничный апдейт 👨💻
После того, как познакомилась с Docker, захотелось применить его на своем пет-проекте. Но для этого захотелось его сначала доделать.
Поэтому начала с настройки Spring Security. Наконец, это у меня получилось, пароли стали сохраняться в зашифрованном виде. После этого, подключила Json Web Token, который теперь может выдаваться юзеру на короткое время действия, и с которым юзер может заходить в защищенные эндпоинты.
Теперь хочу подключить простой фронт. Сомневаюсь, стоит ли делать через модель Spring MVC или через Vaadin... 🤔 C одной стороны, мне интереснее Vaadin, потому что он на Java, а MVC предполагает знание, как минимум, HTML. Но оба варианта предполагают изменение существующей логики — у меня сейчас реализованы REST контроллеры.
Буду рада, если кто-нибудь из читающих посоветует, что лучше выбрать (или свой вариант) ☺️
👏2👍1
Всем привет!
Сегодня прочитала про одну, относительно древнюю, мудрость в современном контексте — «Лучшее — враг хорошего».
Мы часто много времени тратим на поиск лучшего — лучшей работы, лучших курсов, лучшего фреймворка, лучшего инструмента. С одной стороны, это логично и всем бы этого, наверное, хотелось.
Но из такого подхода могут выйти некоторые скрытые недостатки, например:
Мы не всегда знаем, что что-то перед нами уже и есть лучшее. Часто мы делаем выбор, основываясь на неидеальной информации: советам друзей, оценкам ревьюеров. Приобретая это что-то мы можем увидеть, что получили не «лучшее», а что-то, что занимает второе место по эффективности. Это может привезти к разочарованию и долгому сравнению фич одной вещи и другой. Такой подход может привезти к тревоге пропустить «лучшее».
Зачастую наш курс «Java-разработчика» на Яндекс.Практикум критикуют более опытные учащиеся, кто-то кто уже работает, например. Говорят, что теория подана плохо, тема раскрыта не полностью, другие говорят, что слишком много ссылок на сторонние ресурсы. Один из моих сокурсников ушел на другие курсы, потому что там ему показалось, что преподавание поставлено лучше и более эффективно.
Идея звучит в том, чтобы принимать то, что «достаточно хорошо». Когда мы перестаем стремиться к идеалу каждую минуту, мы не только становимся счастливее, но и развиваемся.
Сегодня прочитала про одну, относительно древнюю, мудрость в современном контексте — «Лучшее — враг хорошего».
Мы часто много времени тратим на поиск лучшего — лучшей работы, лучших курсов, лучшего фреймворка, лучшего инструмента. С одной стороны, это логично и всем бы этого, наверное, хотелось.
Но из такого подхода могут выйти некоторые скрытые недостатки, например:
Мы не всегда знаем, что что-то перед нами уже и есть лучшее. Часто мы делаем выбор, основываясь на неидеальной информации: советам друзей, оценкам ревьюеров. Приобретая это что-то мы можем увидеть, что получили не «лучшее», а что-то, что занимает второе место по эффективности. Это может привезти к разочарованию и долгому сравнению фич одной вещи и другой. Такой подход может привезти к тревоге пропустить «лучшее».
Зачастую наш курс «Java-разработчика» на Яндекс.Практикум критикуют более опытные учащиеся, кто-то кто уже работает, например. Говорят, что теория подана плохо, тема раскрыта не полностью, другие говорят, что слишком много ссылок на сторонние ресурсы. Один из моих сокурсников ушел на другие курсы, потому что там ему показалось, что преподавание поставлено лучше и более эффективно.
Идея звучит в том, чтобы принимать то, что «достаточно хорошо». Когда мы перестаем стремиться к идеалу каждую минуту, мы не только становимся счастливее, но и развиваемся.
👍7🔥3
Всем привет!
Сегодня хочу рассказать про свое мок-собеседование, которое у меня прошло в понедельник. Оно было посвящено уже больше java, ООП не обсуждали, хотя немного поговорили о SOLID (и как я нем опять ошиблась? 🤦)
Собеседование проходило в интересном формате, я расшарила свой экран, открыла блокнот и писала в нем код. Кстати, кто вдруг не использует, рекомендую Notepad++ вместо стандартного блокнота. Он удобнее для того, чтобы писать код.
Первая задача была написать алгоритм для расчёта факториала. Не с первого раза вспомнила как он рассчитывается, но потом написала.
Собеседующий перед встречей почитал мои посты в блоге и так узнал про нашу учебную реализацию двусвязного списка. Ему было интересно узнать, как именно мы это делали и он предложил рассказать подробнее. Пока объясняла, схематично и очень коряво, нарисовала схему в paint из узлов и как мы их удаляли за О(1). Пришли к выводу, что наша реализация с двумя хранением данных (узлов в мапе и задач в двусвязном списке) была нецелесообразна.
Плавно перешли к тому, как устроен HashSet и хотя я знаю, что он основан на мапе, где в ключе лежит то, что мы храним, а в value объект-заглушка, я поплавала при определении за сколько удаляется и находится элемент по О-большое и как происходит хранение в самой мапе в зависимости от хэшкода того, чего мы храним.
Так что на следующей неделе сделаю здесь подробный разбор как устроены HashMap и HashSet.😊
Обсуждали бины в спринг, какие бывают, как инжектятся зависимости и какие плюсы и минусы у разных способах.
В чем ещё поплавала: уровни изоляции транзакций и ошибки, возникающие при низком уровне изоляции - об этом всем собираюсь сделать посты, чтобы разобраться получше в этих вопросах,пока эти посты буду готовить.
В общем, очень интересный и полезный опыт - перед реальным собеседованием нужно научиться говорить о технических вещах и, главное, научиться правильно выражать свои мысли. 💪
Сегодня хочу рассказать про свое мок-собеседование, которое у меня прошло в понедельник. Оно было посвящено уже больше java, ООП не обсуждали, хотя немного поговорили о SOLID (и как я нем опять ошиблась? 🤦)
Собеседование проходило в интересном формате, я расшарила свой экран, открыла блокнот и писала в нем код. Кстати, кто вдруг не использует, рекомендую Notepad++ вместо стандартного блокнота. Он удобнее для того, чтобы писать код.
Первая задача была написать алгоритм для расчёта факториала. Не с первого раза вспомнила как он рассчитывается, но потом написала.
Собеседующий перед встречей почитал мои посты в блоге и так узнал про нашу учебную реализацию двусвязного списка. Ему было интересно узнать, как именно мы это делали и он предложил рассказать подробнее. Пока объясняла, схематично и очень коряво, нарисовала схему в paint из узлов и как мы их удаляли за О(1). Пришли к выводу, что наша реализация с двумя хранением данных (узлов в мапе и задач в двусвязном списке) была нецелесообразна.
Плавно перешли к тому, как устроен HashSet и хотя я знаю, что он основан на мапе, где в ключе лежит то, что мы храним, а в value объект-заглушка, я поплавала при определении за сколько удаляется и находится элемент по О-большое и как происходит хранение в самой мапе в зависимости от хэшкода того, чего мы храним.
Так что на следующей неделе сделаю здесь подробный разбор как устроены HashMap и HashSet.😊
Обсуждали бины в спринг, какие бывают, как инжектятся зависимости и какие плюсы и минусы у разных способах.
В чем ещё поплавала: уровни изоляции транзакций и ошибки, возникающие при низком уровне изоляции - об этом всем собираюсь сделать посты, чтобы разобраться получше в этих вопросах,пока эти посты буду готовить.
В общем, очень интересный и полезный опыт - перед реальным собеседованием нужно научиться говорить о технических вещах и, главное, научиться правильно выражать свои мысли. 💪
🔥8👏3
Всем привет!
Сегодня будет пост, посвященный HashMap и HashSet.
Итак, что такое HashMap?
Хэшмапа, или хэш-таблица, это такая структура данных, которая хранит данные в паре ключ-значение.
Ключи уникальные, разрешается 1 ключ со значением null (если мы попытаемся положить ещё один элемент с ключом null, то наш элемент просто заменит имеющиеся данные в нашей таблице, которые хранились по этому ключу).
В основе HashMap лежит своего рода массив, каждая ячейка которого является некой корзиной для хранения наших данных. Вместимость по умолчанию - 16 корзин.
Как выбирается корзина, в которую попадет наш элемент?
Путем следующего вычисления: берется hashcode нашего ключа (хэшкод - это численное представление объекта в java) и берется остаток от деления на количество наших корзин. Например, пусть хэшкод нашего ключа 245345, тогда остаток от деления на 16 будет 1. Это будет индекс нашей ячейки куда поместится элемент, который мы хотим сохранить в хэшмапе.
В случае, когда в качестве ключа у нас кастомный класс, необходимо переопределить equals и hashcode для правильного расчета хэшкода для нашего класса. Ведь если всем элементам будет выдаваться одинаковый хэшкод и мы захотим положить в хэшмапу такие ключи, они все будут попадать в одну и ту же ячейку. Каждый элемент в такой ячейке будет ссылаться на следующий, подобно Linkedlist. Что увеличит сложность для получения значения по ключу от мгновенной О(1) до О(n).
Как правильно отметил Руслан в комментариях, начиная с Java 8, структура данных, в которой хранятся значения внутри одной корзины, изменяется со списка на сбалансированное дерево, если корзина содержит 8 или более значений, и обратно возвращается в список, если в какой-то момент в корзине осталось только 6 значений. Это повышает производительность до O(log n).
HashSet в свою очередь основан на хэшмапе, только в ключ попадает наш элемент, что позволяет хранить уникальные элементы, а в качестве значения кладется пустой объект заглушка (new Object()).
Таким образом, с правильно определенным equals и hashcode для кастомных классов, узнать есть ли в множестве (hashset) наш элемент можно мгновенно, так как в методе contains у хэшсета вызывается метод хэшмапы containsKey, который работает за О(1).
Стоит иметь в виду, что хэшсет не имеет метода get() для получения конкретного значения, поэтому найти нужный элемент мы можем за О(n).
Сегодня будет пост, посвященный HashMap и HashSet.
Итак, что такое HashMap?
Хэшмапа, или хэш-таблица, это такая структура данных, которая хранит данные в паре ключ-значение.
Ключи уникальные, разрешается 1 ключ со значением null (если мы попытаемся положить ещё один элемент с ключом null, то наш элемент просто заменит имеющиеся данные в нашей таблице, которые хранились по этому ключу).
В основе HashMap лежит своего рода массив, каждая ячейка которого является некой корзиной для хранения наших данных. Вместимость по умолчанию - 16 корзин.
Как выбирается корзина, в которую попадет наш элемент?
Путем следующего вычисления: берется hashcode нашего ключа (хэшкод - это численное представление объекта в java) и берется остаток от деления на количество наших корзин. Например, пусть хэшкод нашего ключа 245345, тогда остаток от деления на 16 будет 1. Это будет индекс нашей ячейки куда поместится элемент, который мы хотим сохранить в хэшмапе.
В случае, когда в качестве ключа у нас кастомный класс, необходимо переопределить equals и hashcode для правильного расчета хэшкода для нашего класса. Ведь если всем элементам будет выдаваться одинаковый хэшкод и мы захотим положить в хэшмапу такие ключи, они все будут попадать в одну и ту же ячейку. Каждый элемент в такой ячейке будет ссылаться на следующий, подобно Linkedlist. Что увеличит сложность для получения значения по ключу от мгновенной О(1) до О(n).
Как правильно отметил Руслан в комментариях, начиная с Java 8, структура данных, в которой хранятся значения внутри одной корзины, изменяется со списка на сбалансированное дерево, если корзина содержит 8 или более значений, и обратно возвращается в список, если в какой-то момент в корзине осталось только 6 значений. Это повышает производительность до O(log n).
HashSet в свою очередь основан на хэшмапе, только в ключ попадает наш элемент, что позволяет хранить уникальные элементы, а в качестве значения кладется пустой объект заглушка (new Object()).
Таким образом, с правильно определенным equals и hashcode для кастомных классов, узнать есть ли в множестве (hashset) наш элемент можно мгновенно, так как в методе contains у хэшсета вызывается метод хэшмапы containsKey, который работает за О(1).
Стоит иметь в виду, что хэшсет не имеет метода get() для получения конкретного значения, поэтому найти нужный элемент мы можем за О(n).
👍7❤1
Всем привет!
Пятничный апдейт 👩💻
На этой неделе окончательно решила не делать фронт для своего трекера. Изучать фронтэнд, пока я не знаю многие бэкэнд инструменты, мне не захотелось.
Поэтому, решила создать новый проект, с гордым названием CoolBlogWebsite.😅 Это будет бэкэнд для сайта, где можно будет вести блоги, оставлять комментарии, лайкать посты и тем увеличивать рейтинг автора, который будет влиять на сортировку по популярности при поиске что почитать.
Начала с подготовки к настройке Spring Security, завела базу пользователей, базу ролей, которые могут быть у этих пользователей.
Но вчера мне захотелось экспериментов, я давно пыталась подступить к Kafka и тут мне попалось видео, где было показано, как можно подключить кафка к спринг бут проекту. Интересно, подумала я и решила подключить ее к своему новому проекту.
Тут я вспомнила, что давно не практиковалась с Docker, поэтому подумала: "А почему бы не попробовать запустить кафка через докер?" Подумано - сделано, и теперь у меня подключена Kafka к проекту, которую запускала вчера через докер😁
Пока я не знаю, как именно ее буду использовать, потому что только только начала читать книгу "Kafka в действии" и находить более-менее понятные туториалы. Может мне в проекте Kafka, как акуле ноги, но посмотрю, что из этого получится 😊
Пятничный апдейт 👩💻
На этой неделе окончательно решила не делать фронт для своего трекера. Изучать фронтэнд, пока я не знаю многие бэкэнд инструменты, мне не захотелось.
Поэтому, решила создать новый проект, с гордым названием CoolBlogWebsite.😅 Это будет бэкэнд для сайта, где можно будет вести блоги, оставлять комментарии, лайкать посты и тем увеличивать рейтинг автора, который будет влиять на сортировку по популярности при поиске что почитать.
Начала с подготовки к настройке Spring Security, завела базу пользователей, базу ролей, которые могут быть у этих пользователей.
Но вчера мне захотелось экспериментов, я давно пыталась подступить к Kafka и тут мне попалось видео, где было показано, как можно подключить кафка к спринг бут проекту. Интересно, подумала я и решила подключить ее к своему новому проекту.
Тут я вспомнила, что давно не практиковалась с Docker, поэтому подумала: "А почему бы не попробовать запустить кафка через докер?" Подумано - сделано, и теперь у меня подключена Kafka к проекту, которую запускала вчера через докер😁
Пока я не знаю, как именно ее буду использовать, потому что только только начала читать книгу "Kafka в действии" и находить более-менее понятные туториалы. Может мне в проекте Kafka, как акуле ноги, но посмотрю, что из этого получится 😊
🔥5👍1
Всем привет!
В этом спринте мы стали изучать докер, работу в терминале и в финальном проекте спринта нам дают задание разбить наш проект на микросервисы и организовать работу между ними.
Докер очень хорошо зашел, после пройденного мной курса, прочитывания статей, которые посоветовали в комментариях. Работа в терминале тоже далась относительно легко, хотя были моменты, в которых я застревала. В целом, даже понравилось.
Осталось теперь понять, как мне организовать работу между микросервисами😅, о них я читала в книге, но там не было примеров с кодом. В теории понятно, как на практике начну сегодня разбираться с этим.
Это мне потом, возможно, пригодится для своего блог-проекта. Одно применение Кафки в нем, кстати, нашла - буду использовать при подсчете количества просмотров поста. (пока не знаю как, но как сделаю учебное ТЗ начну разбираться 😊)
Вот такие новости. Это ТЗ, кстати, будет последним перед дипломом. Диплом начнётся 4 сентября.
В этом спринте мы стали изучать докер, работу в терминале и в финальном проекте спринта нам дают задание разбить наш проект на микросервисы и организовать работу между ними.
Докер очень хорошо зашел, после пройденного мной курса, прочитывания статей, которые посоветовали в комментариях. Работа в терминале тоже далась относительно легко, хотя были моменты, в которых я застревала. В целом, даже понравилось.
Осталось теперь понять, как мне организовать работу между микросервисами😅, о них я читала в книге, но там не было примеров с кодом. В теории понятно, как на практике начну сегодня разбираться с этим.
Это мне потом, возможно, пригодится для своего блог-проекта. Одно применение Кафки в нем, кстати, нашла - буду использовать при подсчете количества просмотров поста. (пока не знаю как, но как сделаю учебное ТЗ начну разбираться 😊)
Вот такие новости. Это ТЗ, кстати, будет последним перед дипломом. Диплом начнётся 4 сентября.
👍6🔥3
Всем привет!
Эта неделя выдалась у меня очень загруженной. После последнего поста, мне пришло интересное тестовое задание - написать, относительно большой, проект - социальную сеть.
Что нужно было сделать:
1. Подключить Spring Security + JWT токены для авторизации и аутентификации. (это не вызвало сложностей)
2. Сделать, чтобы пользователи могли публиковать посты с заголовками, описанием и фото/jpg файлом. Jpg файлы до этого я ещё не подключала/не хранила в базе данных, поэтому получилось не сразу. Но теперь я знаю, как это нужно делать 🥳
3. Добавить дружбу. С этим у меня возникло много трудностей. До этого в учебном проекте мы делали простую дружбу - пользователи автоматом добавлялись друг другу в друзья. Здесь же надо было реализовать правильно - сначала один отправляет заявку, подписывается на обновления этого пользователя и ждет подтверждения дружбы.
При подтверждении, оба становятся друзьями и подписчиками друг друга, а при удалении друга, он удаляется из друзей и подписок первого пользователя, но у второго пользователя первый остается в подписках, пока он сам не откажется от подписки.
4. Добавить ленту событий. Это тоже не сложно.
5. Добавить документацию API с помощью OpenAPI, этого никогда до этого не делала, но, оказалось, что это делается очень просто и быстро.
6. Покрыть тестами. Пока я на этом этапе. Думала вчера, что за вечер всё протестирую, а в результате просидела до 2х часов ночи, разбираясь с тестами контроллеров и неправильно работающим моком Spring Security 😅 Он сначала ни в какую не давал мне прав создавать/изменять данные, давал права только на get методы.
В итоге, попробовав 5 разных вариантов, я смогла правильно сформулировать вопрос в гугле и нашла на stackoverflow ответ. Теперь, осталось применить во всех контроллерах, протестировать сервисы, и можно отправлять. 💪
(это тестовое - скрининг, так что не факт, что его будут проверять - при такой большой конкуренции начинающих специалистов на рынке, высока вероятность, что таких проектов им пришлют много на проверку, но я всё равно попробую 😊)
Эта неделя выдалась у меня очень загруженной. После последнего поста, мне пришло интересное тестовое задание - написать, относительно большой, проект - социальную сеть.
Что нужно было сделать:
1. Подключить Spring Security + JWT токены для авторизации и аутентификации. (это не вызвало сложностей)
2. Сделать, чтобы пользователи могли публиковать посты с заголовками, описанием и фото/jpg файлом. Jpg файлы до этого я ещё не подключала/не хранила в базе данных, поэтому получилось не сразу. Но теперь я знаю, как это нужно делать 🥳
3. Добавить дружбу. С этим у меня возникло много трудностей. До этого в учебном проекте мы делали простую дружбу - пользователи автоматом добавлялись друг другу в друзья. Здесь же надо было реализовать правильно - сначала один отправляет заявку, подписывается на обновления этого пользователя и ждет подтверждения дружбы.
При подтверждении, оба становятся друзьями и подписчиками друг друга, а при удалении друга, он удаляется из друзей и подписок первого пользователя, но у второго пользователя первый остается в подписках, пока он сам не откажется от подписки.
4. Добавить ленту событий. Это тоже не сложно.
5. Добавить документацию API с помощью OpenAPI, этого никогда до этого не делала, но, оказалось, что это делается очень просто и быстро.
6. Покрыть тестами. Пока я на этом этапе. Думала вчера, что за вечер всё протестирую, а в результате просидела до 2х часов ночи, разбираясь с тестами контроллеров и неправильно работающим моком Spring Security 😅 Он сначала ни в какую не давал мне прав создавать/изменять данные, давал права только на get методы.
В итоге, попробовав 5 разных вариантов, я смогла правильно сформулировать вопрос в гугле и нашла на stackoverflow ответ. Теперь, осталось применить во всех контроллерах, протестировать сервисы, и можно отправлять. 💪
(это тестовое - скрининг, так что не факт, что его будут проверять - при такой большой конкуренции начинающих специалистов на рынке, высока вероятность, что таких проектов им пришлют много на проверку, но я всё равно попробую 😊)
🔥6👍2👏2
Всем привет!
Сегодня хочу рассказать ещё про одно тестовое задание, которое выполнила сегодня.
Его мне прислали также на прошлой неделе, но со словами: "не пугайтесь, если вакансия уйдёт в архив, выполнение тестового задания всегда актуально". Я подумала, что раз "всегда", значит выполню сначала то, которое со сроком (из прошлого поста).
Сегодня решила его сделать, оно было небольшое: нужно было написать приложение для отслеживания почтовых отправлений.
Нужна была такая функциональность:
1. регистрация почтового отправления,
2. его прибытие в промежуточное почтовое отделение,
3. его отправление из почтового отделения,
4. его получение адресатом,
5. просмотр статуса и полной истории движения почтового отправления
6. покрытие тестами 70% и документация API.
Самое сложное было выцепить эти требования из самого задания и разложить по полочкам😁
Завтра вернусь к своим экспериментам с Кафка, потом расскажу, что из этого выйдет 😊
Сегодня хочу рассказать ещё про одно тестовое задание, которое выполнила сегодня.
Его мне прислали также на прошлой неделе, но со словами: "не пугайтесь, если вакансия уйдёт в архив, выполнение тестового задания всегда актуально". Я подумала, что раз "всегда", значит выполню сначала то, которое со сроком (из прошлого поста).
Сегодня решила его сделать, оно было небольшое: нужно было написать приложение для отслеживания почтовых отправлений.
Нужна была такая функциональность:
1. регистрация почтового отправления,
2. его прибытие в промежуточное почтовое отделение,
3. его отправление из почтового отделения,
4. его получение адресатом,
5. просмотр статуса и полной истории движения почтового отправления
6. покрытие тестами 70% и документация API.
Самое сложное было выцепить эти требования из самого задания и разложить по полочкам😁
Завтра вернусь к своим экспериментам с Кафка, потом расскажу, что из этого выйдет 😊
👍8👏1
Всем привет!
На днях изучала официальный сайт Kafka и там было хорошее видео, объясняющее, что такое кафка. Оно на английском, поэтому я решила выложить здесь перевод некоторых моментов из видео:
Десятилетиями мы хранили информацию, как некие 'данные' в базе данных. Это могут быть какие-то сущности, такие как пользователь, или что-то другое. Сейчас, многие стали думать о том, что хранить только данные недостаточно. Нужно хранить события (логи) - что-то случилось тогда-то в этом-то месте, например, такой-то пользователь обновил свой пост.
Кафка - это система, которая помогает управлять этими событиями. Эти события кафка называет топиками (topic с английского означает тема).
Топик - это упорядоченная коллекция событий, которые надежно хранятся. Надежно - имеется в виду, что хранение происходит на нескольких дисках / серверах, так чтобы эти события не потерялись.
Топики могут быть маленькие, могут быть огромные, храниться могут несколько секунд или бесрочно.
Кафка мотивирует разработчиков думать о событиях сначала и 'данных' потом.
Как можно использовать кафка топики? Микросервисы могут общаться друг с другом через такие топики. Один микросервис может получить сообщение из кафка топика, сделать с ним что-то и отправить информацию в другой кафка топик, который хранит события для другого приложения.
Другой сервис может в режиме реального времени анализировать такие топики, которые хранят данные, как события.
Это базовое представление о том, что такое кафка и что она из себя представляет.
Определение с официального сайта:
Kafka - это распределенная потоковая платформа, предлагающая три основные возможности:
1. чтение сообщений из очереди и запись их в очередь;
2 надежное хранение сообщений;
3 обработку потоков данных по мере их появления.
На днях изучала официальный сайт Kafka и там было хорошее видео, объясняющее, что такое кафка. Оно на английском, поэтому я решила выложить здесь перевод некоторых моментов из видео:
Десятилетиями мы хранили информацию, как некие 'данные' в базе данных. Это могут быть какие-то сущности, такие как пользователь, или что-то другое. Сейчас, многие стали думать о том, что хранить только данные недостаточно. Нужно хранить события (логи) - что-то случилось тогда-то в этом-то месте, например, такой-то пользователь обновил свой пост.
Кафка - это система, которая помогает управлять этими событиями. Эти события кафка называет топиками (topic с английского означает тема).
Топик - это упорядоченная коллекция событий, которые надежно хранятся. Надежно - имеется в виду, что хранение происходит на нескольких дисках / серверах, так чтобы эти события не потерялись.
Топики могут быть маленькие, могут быть огромные, храниться могут несколько секунд или бесрочно.
Кафка мотивирует разработчиков думать о событиях сначала и 'данных' потом.
Как можно использовать кафка топики? Микросервисы могут общаться друг с другом через такие топики. Один микросервис может получить сообщение из кафка топика, сделать с ним что-то и отправить информацию в другой кафка топик, который хранит события для другого приложения.
Другой сервис может в режиме реального времени анализировать такие топики, которые хранят данные, как события.
Это базовое представление о том, что такое кафка и что она из себя представляет.
Определение с официального сайта:
Kafka - это распределенная потоковая платформа, предлагающая три основные возможности:
1. чтение сообщений из очереди и запись их в очередь;
2 надежное хранение сообщений;
3 обработку потоков данных по мере их появления.
👍8🔥2
Всем привет!
Расскажу свои последние новости. После тестового задания по соцсети, меня пригласили к ним на собеседование, правда назначили мне его на 4 сентября. Сказали, что будет разговор о Spring и Spring Security.
Активно пошла разбираться в тонкостях, читая книжки и статьи по Security, думаю к концу недели написать пост о каком-нибудь теоретическом вопросе на эту тему.
Вчера ещё в одной организации начался java интенсив, на который я попала в группу из 22 человек. Было первое занятие, позиционировалось, как лекция, но на деле было знакомство. Так что потренировалась делать краткую самопрезентацию.
Потом лектор стал каждому задавать по два вопроса по Java Core и многие на них споткнулись. Вопросы в принципе были не сложные, но человека без подготовки могут застать врасплох.
Поэтому напишу некоторые вопросы здесь:
1. Отличие Comparable от Comparator.
2. Что такое блоки инициализации. Какие бывают и в каком порядке запускаются, если есть наследники.
3. Что такое дженерики (мне достался вопрос)
4. К какому типу данных относятся массивы, можно ли хранить примитивные типы данных в коллекциях.
5. Разница между final, finally и finalize.
Есть репозиторий с ответами на эти и похожие вопросы, здесь.
Расскажу свои последние новости. После тестового задания по соцсети, меня пригласили к ним на собеседование, правда назначили мне его на 4 сентября. Сказали, что будет разговор о Spring и Spring Security.
Активно пошла разбираться в тонкостях, читая книжки и статьи по Security, думаю к концу недели написать пост о каком-нибудь теоретическом вопросе на эту тему.
Вчера ещё в одной организации начался java интенсив, на который я попала в группу из 22 человек. Было первое занятие, позиционировалось, как лекция, но на деле было знакомство. Так что потренировалась делать краткую самопрезентацию.
Потом лектор стал каждому задавать по два вопроса по Java Core и многие на них споткнулись. Вопросы в принципе были не сложные, но человека без подготовки могут застать врасплох.
Поэтому напишу некоторые вопросы здесь:
1. Отличие Comparable от Comparator.
2. Что такое блоки инициализации. Какие бывают и в каком порядке запускаются, если есть наследники.
3. Что такое дженерики (мне достался вопрос)
4. К какому типу данных относятся массивы, можно ли хранить примитивные типы данных в коллекциях.
5. Разница между final, finally и finalize.
Есть репозиторий с ответами на эти и похожие вопросы, здесь.
GitHub
GitHub - enhorse/java-interview: Вопросы и ответы к интервью Java разработчика
Вопросы и ответы к интервью Java разработчика. Contribute to enhorse/java-interview development by creating an account on GitHub.
🔥2👏2
С Днем Знаний! 😁
У нас сегодня открылось задание на диплом. Будем реализовывать огромный, судя по всему, проект с несколькими микросервисами. Нужно выбрать дополнительную функциональность для него из нескольких на выбор. Я пока не определилась, но склоняюсь к функциональности «рейтинги». Там будет проект на тему событий, которые можно было бы оценивать, или, наоборот, хейтить :) В зависимости от рейтинга потом сортировать при выдаче.
Пока закрыт был доступ к диплому делала свой проект-блог. Настроила Spring Security, JWT, сделала, чтобы подсчет просмотров постов велся с помощью Kafka. Пока у меня есть два топика, один больше для логов, в качестве практики. А второй вот для подсчетов просмотров постов.
На интенсиве вчера был созвон с обсуждением Git, SOLID, задавались нам опять вопросы, только на этот раз не только по Java Core, но и по алгоритмам. На следующий созвон планируется подробная проверка наших знаний, как устроены коллекции.
Вчера отвлекалась от мыслей о сегодняшней линейке как могла: посмотрела видео Евгения Борисова о Spring (его видео - просто огонь, всем советую, кто еще не смотрел), читала Spring Security в действии, потом захотелось переключиться от Spring и стала читать MongoDB for Jobseekers (тоже интересная книжка).
У нас сегодня открылось задание на диплом. Будем реализовывать огромный, судя по всему, проект с несколькими микросервисами. Нужно выбрать дополнительную функциональность для него из нескольких на выбор. Я пока не определилась, но склоняюсь к функциональности «рейтинги». Там будет проект на тему событий, которые можно было бы оценивать, или, наоборот, хейтить :) В зависимости от рейтинга потом сортировать при выдаче.
Пока закрыт был доступ к диплому делала свой проект-блог. Настроила Spring Security, JWT, сделала, чтобы подсчет просмотров постов велся с помощью Kafka. Пока у меня есть два топика, один больше для логов, в качестве практики. А второй вот для подсчетов просмотров постов.
На интенсиве вчера был созвон с обсуждением Git, SOLID, задавались нам опять вопросы, только на этот раз не только по Java Core, но и по алгоритмам. На следующий созвон планируется подробная проверка наших знаний, как устроены коллекции.
Вчера отвлекалась от мыслей о сегодняшней линейке как могла: посмотрела видео Евгения Борисова о Spring (его видео - просто огонь, всем советую, кто еще не смотрел), читала Spring Security в действии, потом захотелось переключиться от Spring и стала читать MongoDB for Jobseekers (тоже интересная книжка).
YouTube
Евгений Борисов — Spring-потрошитель, часть 1
Подробнее о Java-конференциях:
— весной — JPoint: https://jrg.su/gTrwHx
— осенью — Joker: https://jrg.su/h7yvG4
— —
Встреча JUG.ru
Санкт-Петербург, 26.06.2014
Казалось бы, зачем знать, как работают внутренности спринга для того, чтобы им пользоваться? Работает?…
— весной — JPoint: https://jrg.su/gTrwHx
— осенью — Joker: https://jrg.su/h7yvG4
— —
Встреча JUG.ru
Санкт-Петербург, 26.06.2014
Казалось бы, зачем знать, как работают внутренности спринга для того, чтобы им пользоваться? Работает?…
👍6🔥1
Всем привет!
Сегодня у меня было первое техническое собеседование. Пишу поделиться впечатлениями.
Все вопросы касались Spring, за редким исключением, всего длилось 1.5 часа.
Много говорили о бинах, сервлетах, подробно говорили о самом Hibernate, этапах жизни сущности, proxy.
Узнала много нового, например, что можно использовать environment переменные в пропертиз файле. Выписала себе много новых аннотаций.
Из смешного - забыла о чем один из последних моих проектов, он учебный, с двумя микросервисами. Буквально пару-тройку недель назад его сдала, а сегодня наотрез забыла о чем он 😅
С одной стороны, можно понять, я тут много чем другим занималась это время, но всё равно вышло немного неловко))
Кстати, вчера ещё небольшое достижение получилось, пошла решать задачи на экзамен для стажировки в Тинькофф (уже третья попытка) и получилось побить собственный рекорд решенных задач - в первый раз, весной, решила всего одну задачу, в июне, уже решила две с половиной (половина не отрабатывала на всех примерах входных данных), а в этот раз, вчера, решила уже 4 (с половиной).
Думаю всё дело в том, что тема задач была не какая-то там абстрактная, про каких-нибудь Вовочек-маминых хакеров, а более реалистичная. Можно даже сказать брутальная и жизненная. Во всех задачах герой был Ковбой Джо, не сопереживать которому было просто невозможно 😁
Сегодня у меня было первое техническое собеседование. Пишу поделиться впечатлениями.
Все вопросы касались Spring, за редким исключением, всего длилось 1.5 часа.
Много говорили о бинах, сервлетах, подробно говорили о самом Hibernate, этапах жизни сущности, proxy.
Узнала много нового, например, что можно использовать environment переменные в пропертиз файле. Выписала себе много новых аннотаций.
Из смешного - забыла о чем один из последних моих проектов, он учебный, с двумя микросервисами. Буквально пару-тройку недель назад его сдала, а сегодня наотрез забыла о чем он 😅
С одной стороны, можно понять, я тут много чем другим занималась это время, но всё равно вышло немного неловко))
Кстати, вчера ещё небольшое достижение получилось, пошла решать задачи на экзамен для стажировки в Тинькофф (уже третья попытка) и получилось побить собственный рекорд решенных задач - в первый раз, весной, решила всего одну задачу, в июне, уже решила две с половиной (половина не отрабатывала на всех примерах входных данных), а в этот раз, вчера, решила уже 4 (с половиной).
Думаю всё дело в том, что тема задач была не какая-то там абстрактная, про каких-нибудь Вовочек-маминых хакеров, а более реалистичная. Можно даже сказать брутальная и жизненная. Во всех задачах герой был Ковбой Джо, не сопереживать которому было просто невозможно 😁
🔥7👍1
Всем привет!
Пришел ответ с собеседования - не прошла. Вердикт: "есть пробелы в Spring Security, Spring JPA/Hibernate. Рекомендация: Изучить моменты Spring Security (Authentication, SecurityContext, Principal, GrantedAuthority). Так же подтянуть Hibernate."
Сразу стали вспоминаться вопросы именно по этим двум темам, на которые не ответила:
1. В чём разница между методом save у Hibernate и методом save у JpaRepository?
Вкратце, метод JpaRepository вызывает метод EntityManager.persist() - если сущность сохраняется впервые - либо метод EntityManager.merge() - если сущность обновляется. Метод save у Hibernate специфично ORM фреймворку и не работает со спецификацией JPA (вызывается метод Session.save, статья).
2. В чём разница между аутентификацией и авторизацией в Spring Security?
Аутентификация - процедура проверки подлинности (сравниваются введенный логин и пароль с сохраненным в базе данных)
Авторизация - предоставление прав на определенные действия (прав у админа, например, больше). (Статья)
3. Где хранится Authentication, как мы понимаем, что пользователь именно тот, за кого себя выдает?
Ответ: В SecurityContext. Две статьи на эту тему: раз и два.
Вот так разнятся требования на джунов, где-то спрашивают, зачем переопределять equals&hashCode, а где-то и такие вопросы задаются🤔
Пришел ответ с собеседования - не прошла. Вердикт: "есть пробелы в Spring Security, Spring JPA/Hibernate. Рекомендация: Изучить моменты Spring Security (Authentication, SecurityContext, Principal, GrantedAuthority). Так же подтянуть Hibernate."
Сразу стали вспоминаться вопросы именно по этим двум темам, на которые не ответила:
1. В чём разница между методом save у Hibernate и методом save у JpaRepository?
Вкратце, метод JpaRepository вызывает метод EntityManager.persist() - если сущность сохраняется впервые - либо метод EntityManager.merge() - если сущность обновляется. Метод save у Hibernate специфично ORM фреймворку и не работает со спецификацией JPA (вызывается метод Session.save, статья).
2. В чём разница между аутентификацией и авторизацией в Spring Security?
Аутентификация - процедура проверки подлинности (сравниваются введенный логин и пароль с сохраненным в базе данных)
Авторизация - предоставление прав на определенные действия (прав у админа, например, больше). (Статья)
3. Где хранится Authentication, как мы понимаем, что пользователь именно тот, за кого себя выдает?
Ответ: В SecurityContext. Две статьи на эту тему: раз и два.
Вот так разнятся требования на джунов, где-то спрашивают, зачем переопределять equals&hashCode, а где-то и такие вопросы задаются🤔
👍9
Всем привет!
Сегодня хочу порекомендовать курс со Stepik, называется «Middle Java Developer для МТС Банк». Он бесплатный, проводился для своих и, видимо, остался для остальных, кому интересно. Я вышла на него случайно, еще летом, но занималась по нему не активно. Даже периодически про него совсем забывая.
Вчера, когда сделала пару эндпоинтов для диплома, решила, что можно в честь выходного и отдохнуть от него и вспомнила про этот курс. Пошла читать, там у меня было открыто на Stream API, на моменте, где рассказывалось про метод GroupingBy у стримов. Он работает, как GROUP BY в SQL. В дипломе я его применила до этого, но больше случайно, погуглив. Но после статьи об этом методе с разными способами применения, очень понравились его возможности.
После стримов была ссылка на вебинар и мне очень понравился спикер. Он очень интересно рассказывал, давал интересные задачки на разные неоднозначные ситуации в многопоточности, потом приводил примеры из жизни, где такие ситуации происходят сплошь и рядом, если не учитывать некоторые моменты.
После этого оставшуюся часть дня смотрела другие вебинары с этого курса, благо на степике можно пропускать до любого интересного урока и заниматься, как удобно. Посмотрела вебинары этого спикера на тему Spring Security и интеграционного тестирования. Очень понравилось. В конце курса еще задание есть огромное, большой проект. Думаю сделаю его после диплома.
Диплом медленно идет, потому что заранее не знаешь как, что должно работать. Есть спецификация по эндпоинтам. Делаешь метод, тестируешь по их тестам Postman, оказывается, что в тестах вызывается другой, еще не написанный эндпоинт. Или по спецификации думаешь, что должен быть такой-то ответ, потом методом проб и ошибок в тестах постман, понимаешь, какой же ответ все-таки ожидается на самом деле.
Интереснее, когда есть идея сделать что-то и ты сидишь и думаешь как это сделать. Пишешь сама тесты, знаешь, что хочешь увидеть и видишь, когда что-то идет не так. Тут, наоборот, у тебя есть некоторые детали и ты из них собираешь общую картину, угадывая, как это должно взаимодействовать. Угадывая, потому что все тесты постман написаны со скрытыми деталями, типа {{request body}}, {{uid}}. То есть с одной стороны, test driven development, а с другой, guess driven development. Но делать нечего, надо его писать))
Сегодня хочу порекомендовать курс со Stepik, называется «Middle Java Developer для МТС Банк». Он бесплатный, проводился для своих и, видимо, остался для остальных, кому интересно. Я вышла на него случайно, еще летом, но занималась по нему не активно. Даже периодически про него совсем забывая.
Вчера, когда сделала пару эндпоинтов для диплома, решила, что можно в честь выходного и отдохнуть от него и вспомнила про этот курс. Пошла читать, там у меня было открыто на Stream API, на моменте, где рассказывалось про метод GroupingBy у стримов. Он работает, как GROUP BY в SQL. В дипломе я его применила до этого, но больше случайно, погуглив. Но после статьи об этом методе с разными способами применения, очень понравились его возможности.
После стримов была ссылка на вебинар и мне очень понравился спикер. Он очень интересно рассказывал, давал интересные задачки на разные неоднозначные ситуации в многопоточности, потом приводил примеры из жизни, где такие ситуации происходят сплошь и рядом, если не учитывать некоторые моменты.
После этого оставшуюся часть дня смотрела другие вебинары с этого курса, благо на степике можно пропускать до любого интересного урока и заниматься, как удобно. Посмотрела вебинары этого спикера на тему Spring Security и интеграционного тестирования. Очень понравилось. В конце курса еще задание есть огромное, большой проект. Думаю сделаю его после диплома.
Диплом медленно идет, потому что заранее не знаешь как, что должно работать. Есть спецификация по эндпоинтам. Делаешь метод, тестируешь по их тестам Postman, оказывается, что в тестах вызывается другой, еще не написанный эндпоинт. Или по спецификации думаешь, что должен быть такой-то ответ, потом методом проб и ошибок в тестах постман, понимаешь, какой же ответ все-таки ожидается на самом деле.
Интереснее, когда есть идея сделать что-то и ты сидишь и думаешь как это сделать. Пишешь сама тесты, знаешь, что хочешь увидеть и видишь, когда что-то идет не так. Тут, наоборот, у тебя есть некоторые детали и ты из них собираешь общую картину, угадывая, как это должно взаимодействовать. Угадывая, потому что все тесты постман написаны со скрытыми деталями, типа {{request body}}, {{uid}}. То есть с одной стороны, test driven development, а с другой, guess driven development. Но делать нечего, надо его писать))
🔥8👍2❤1
Всем привет!
Сегодняшний пост посвящается Spring Security.
Что такое Spring Security?
Его описывают, как мощный и хорошо настраиваемый фреймворк для контроля аутентификации и авторизации.
Spring Security - это фреймворк, который перехватывает запросы, аутентифицирует пользователей, применяет правила контроля доступа и защищает ваше приложение от угроз безопасности. Его главная цель убедиться, что ваше приложение защищенно, путем предоставления богатого набора инструментов для аутентификации и авторизации пользователей.
Как работает Spring Security?
Spring Security перехватывает HTTP запросы и пропускает через серию фильтров.
Сначала проверяет аутентифицирован ли пользователь (смотрит вошел ли пользователь, через свой логин/пароль), если нет, то перенаправляет его на страницу входа (для ввода логин/пароля).
Когда пользователь ввел данные, Spring Security сравнивает эти данные с теми, которые хранятся у нас в базе данных.
После аутентификации, Spring Security проверяет какие права и к каким ресурсам можно пустить пользователя (согласно нашей настройки).
Вот так может выглядеть метод, в котором мы прописываем фильтры для проверки пользовательских запросов (для версий Spring 3.0.9 и ниже):
Здесь пока можно увидеть, что для пути /admin будут допущены пользователи с ролью Admin, а к пути /users только пользователи с ролью User, также в этой цепочке фильтров можно увидеть, что к другим эндпоинтам разрешены любые запросы (anyRequest().permitAll()).
Определения взяты из Spring Security in Action by Laurentiu Spilca. Продолжение следует 🤓
Сегодняшний пост посвящается Spring Security.
Что такое Spring Security?
Его описывают, как мощный и хорошо настраиваемый фреймворк для контроля аутентификации и авторизации.
Spring Security - это фреймворк, который перехватывает запросы, аутентифицирует пользователей, применяет правила контроля доступа и защищает ваше приложение от угроз безопасности. Его главная цель убедиться, что ваше приложение защищенно, путем предоставления богатого набора инструментов для аутентификации и авторизации пользователей.
Как работает Spring Security?
Spring Security перехватывает HTTP запросы и пропускает через серию фильтров.
Сначала проверяет аутентифицирован ли пользователь (смотрит вошел ли пользователь, через свой логин/пароль), если нет, то перенаправляет его на страницу входа (для ввода логин/пароля).
Когда пользователь ввел данные, Spring Security сравнивает эти данные с теми, которые хранятся у нас в базе данных.
После аутентификации, Spring Security проверяет какие права и к каким ресурсам можно пустить пользователя (согласно нашей настройки).
Вот так может выглядеть метод, в котором мы прописываем фильтры для проверки пользовательских запросов (для версий Spring 3.0.9 и ниже):
@BeanПодробнее о том, что такое csrf и cors, а также, как изменилась настройка фильтров в более поздних версиях Spring, в следующих постах.
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.cors().disable()
.authorizeHttpRequests((authz) -> {
try {
authz
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/users/**").hasRole("USER")
.anyRequest().permitAll()
.and()
.exceptionHandling()
.authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
} catch (Exception e) {
throw new RuntimeException(e);
}
});
return http.build();
}
Здесь пока можно увидеть, что для пути /admin будут допущены пользователи с ролью Admin, а к пути /users только пользователи с ролью User, также в этой цепочке фильтров можно увидеть, что к другим эндпоинтам разрешены любые запросы (anyRequest().permitAll()).
Определения взяты из Spring Security in Action by Laurentiu Spilca. Продолжение следует 🤓
👍7🎄1
Привет!
Есть любители Ломбок? Делала на днях ревью (на интенсиве) и узнала новую для себя аннотацию- @Cleanup - заменяет try with resources. Очень украшает код.
Например, метод без аннотации:
Есть любители Ломбок? Делала на днях ревью (на интенсиве) и узнала новую для себя аннотацию- @Cleanup - заменяет try with resources. Очень украшает код.
Например, метод без аннотации:
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream(args[0]);
try {
OutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
} finally {
if (out != null) {
out.close();
}
}
} finally {
if (in != null) {
in.close();
}
}
}
А теперь метод с аннотацией:public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
Мне понравилась идея 😊👍8🔥4
Всем привет!
Сегодня будет небольшой апдейт. На прошлой неделе немного выпала из жизни - писала диплом. Вчера отправила на проверку 2 этап. Когда зачтут, останется только добавить свою фичу небольшую и готово.
Думаю буду делать рейтинг событий с лайками, дизлайками и общей 5 звездочной оценкой. По заданию нужно будет самой написать Postman тесты - это будет новый опыт для меня. До этого тестировала там сама свои проекты вручную, проверяя разные запросы на разные эндпоинты, потом уже писала юнит и интеграционные тесты.
Стала потихоньку возвращаться к книжкам, курсу на степике. Сейчас у меня одновременно начато очень много книг, поэтому решила читать по очереди, чтобы не разрываться. Первая в очереди Spring Security in Action, очень стала интересна тема безопасности, столько в ней есть нюансов, что хочется в этом разбираться.
Потом думаю буду дочитывать Kafka в действии и Spring Паттерны. Сегодня попалось в каком-то чате, что есть Kafka Security (streams security) - захотелось посмотреть, почитать.
Но всё сразу читать не получается, буду стараться сохранять очередность))
Сегодня будет небольшой апдейт. На прошлой неделе немного выпала из жизни - писала диплом. Вчера отправила на проверку 2 этап. Когда зачтут, останется только добавить свою фичу небольшую и готово.
Думаю буду делать рейтинг событий с лайками, дизлайками и общей 5 звездочной оценкой. По заданию нужно будет самой написать Postman тесты - это будет новый опыт для меня. До этого тестировала там сама свои проекты вручную, проверяя разные запросы на разные эндпоинты, потом уже писала юнит и интеграционные тесты.
Стала потихоньку возвращаться к книжкам, курсу на степике. Сейчас у меня одновременно начато очень много книг, поэтому решила читать по очереди, чтобы не разрываться. Первая в очереди Spring Security in Action, очень стала интересна тема безопасности, столько в ней есть нюансов, что хочется в этом разбираться.
Потом думаю буду дочитывать Kafka в действии и Spring Паттерны. Сегодня попалось в каком-то чате, что есть Kafka Security (streams security) - захотелось посмотреть, почитать.
Но всё сразу читать не получается, буду стараться сохранять очередность))
🔥7👍2
Всем привет!
На днях в Практикуме был вебинар с нашим наставником группы. Его спросили про JPA и Null параметры. Он предложил вариант сделать дерево условий, если этот пришедший параметр null, то не передавать его в метод репозитория.
Самое интересное, что в нашем случае приходило 7 null параметров в одном из тестов. Кажется, что это 7 условий. Но что если приходит 5 параметров null, а остальные не null? Это дополнительное условие, потому что нет колонок со значением null в нашей таблице событий. Когда я делала этот эндпоинт, я прикинула, что это (минимум) 21 вариация. 14 if-else условий проверки на null на каждый параметр, плюс варианты, когда первые два null, а остальные не null, первый и третий null, а остальные не null. В этом духе.
Естественно, этот момент предусмотрен в Spring Data JPA. Подробнее можно посмотреть в этой статье. Я выпишу пример с коротким объяснением из этой статьи:
Может кому пригодится, если вдруг кто не знал про это.
На днях в Практикуме был вебинар с нашим наставником группы. Его спросили про JPA и Null параметры. Он предложил вариант сделать дерево условий, если этот пришедший параметр null, то не передавать его в метод репозитория.
Самое интересное, что в нашем случае приходило 7 null параметров в одном из тестов. Кажется, что это 7 условий. Но что если приходит 5 параметров null, а остальные не null? Это дополнительное условие, потому что нет колонок со значением null в нашей таблице событий. Когда я делала этот эндпоинт, я прикинула, что это (минимум) 21 вариация. 14 if-else условий проверки на null на каждый параметр, плюс варианты, когда первые два null, а остальные не null, первый и третий null, а остальные не null. В этом духе.
Естественно, этот момент предусмотрен в Spring Data JPA. Подробнее можно посмотреть в этой статье. Я выпишу пример с коротким объяснением из этой статьи:
@Query("SELECT c FROM Customer c WHERE (:name is null or c.name = :name) and (:email is null or c.email = :email)")
List<Customer> findCustomerByNameAndEmail(@Param("name") String name, @Param("email") String email);
В этом случае, если параметр name будет null, условие будет верно всегда и не повлияет на выборку WHERE. По поводу конструкции @Param("name"), в моем случае работало и без нее. Может кому пригодится, если вдруг кто не знал про это.
Baeldung on Kotlin
Spring Data JPA and Null Parameters | Baeldung
Learn different ways to use null parameters with Spring Data JPA queries, including how to make query parameters optional.
👍11🔥1