{"id":16947,"date":"2023-04-11T20:20:33","date_gmt":"2023-04-11T16:50:33","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/"},"modified":"2023-04-11T20:20:33","modified_gmt":"2023-04-11T16:50:33","slug":"kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/","title":{"rendered":"Kotlin CRUD Rest Api \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Spring Boot\u060c Hibernate\u060c Postgres\u060c Docker \u0648 Docker Compose"},"content":{"rendered":"<div data-article-id=\"1432603\" id=\"article-body\">\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 CRUD Rest API \u062f\u0631 Kotlin \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645\u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632:<\/p>\n<ul>\n<li>\u0686\u06a9\u0645\u0647 \u0628\u0647\u0627\u0631\u0647<\/li>\n<li>\u06af\u0631\u06cc\u062f\u0644<\/li>\n<li>\u062e\u0648\u0627\u0628 \u0632\u0645\u0633\u062a\u0627\u0646\u06cc<\/li>\n<li>Postgres<\/li>\n<li>\u062f\u0627\u06a9\u0631<\/li>\n<li>Docker Compose<\/li>\n<\/ul>\n<p>\u0627\u06af\u0631 \u0646\u0633\u062e\u0647 \u0648\u06cc\u062f\u06cc\u0648\u06cc\u06cc \u0631\u0627 \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc \u062f\u0647\u06cc\u062f:<\/p>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=BbT1PCAOS2s\" rel=\"nofollow noopener\" target=\"_blank\">https:\/\/www.youtube.com\/watch?v=BbT1PCAOS2s<\/a><br \/>\n<\/iframe>\n<\/p>\n<p>\u062a\u0645\u0627\u0645 \u06a9\u062f\u0647\u0627 \u062f\u0631 \u0645\u062e\u0632\u0646 GitHub \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a (\u0644\u06cc\u0646\u06a9 \u062f\u0631 \u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u0648\u06cc\u062f\u06cc\u0648): https:\/\/youtube.com\/live\/BbT1PCAOS2s<\/p>\n<hr\/>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%8F%81_%D9%85%D8%B9%D8%B1%D9%81%DB%8C\" >\ud83c\udfc1 \u0645\u0639\u0631\u0641\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%D8%A7%D9%84%D8%B2%D8%A7%D9%85%D8%A7%D8%AA\" >\u0627\u0644\u0632\u0627\u0645\u0627\u062a:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%9A%80_%DB%8C%DA%A9_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%AC%D8%AF%DB%8C%D8%AF_Kotlin_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\ud83d\ude80 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062c\u062f\u06cc\u062f Kotlin \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%B1%D8%A7_%DA%A9%D8%AF%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\" >\ud83d\udc69\u200d\ud83d\udcbb \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%94%97_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D8%A7%D8%AA%D8%B5%D8%A7%D9%84_%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87_%D8%AF%D8%A7%D8%AF%D9%87\" >\ud83d\udd17 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%93%81_%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1_%D9%85%D9%86%D8%A8%D8%B9_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\ud83d\udcc1 \u0633\u0627\u062e\u062a\u0627\u0631 \u0645\u0646\u0628\u0639 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#Userkt\" >User.kt<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#UserRepositorykt\" >UserRepository.kt<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#UserControllerkt\" >UserController.kt<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%90%B3_%D8%AF%D8%A7%DA%A9%D8%B1%D8%B3%D8%A7%D8%B2%DB%8C\" >\ud83d\udc33 \u062f\u0627\u06a9\u0631\u0633\u0627\u0632\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%90%8B_%D8%AF%D8%A7%DA%A9%D8%B1%D9%81%D8%A7%DB%8C%D9%84\" >\ud83d\udc0b \u062f\u0627\u06a9\u0631\u0641\u0627\u06cc\u0644<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%90%99_docker-composeyml\" >\ud83d\udc19 docker-compose.yml<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%B1%D8%A7_%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D8%AF_%D9%88_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\" >\u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f \u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%92%BD_%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87_%D8%AF%D8%A7%D8%AF%D9%87_Postgres_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\" >\ud83d\udcbd \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%8F%97%EF%B8%8F_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%B1%D8%A7_%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D8%AF\" >\ud83c\udfd7\ufe0f \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%8F%83%E2%80%8D%E2%99%82%EF%B8%8F_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\" >\ud83c\udfc3\u200d\u2642\ufe0f \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%A7%AA_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%B1%D8%A7_%D8%AA%D8%B3%D8%AA_%DA%A9%D9%86%DB%8C%D8%AF\" >\ud83e\uddea \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062a\u0633\u062a \u06a9\u0646\u06cc\u062f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%93%9D_%DB%8C%DA%A9_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\ud83d\udcdd \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%93%9D_%D9%87%D9%85%D9%87_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%A7%D9%86_%D8%B1%D8%A7_%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA_%DA%A9%D9%86%DB%8C%D8%AF\" >\ud83d\udcdd \u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%93%9D_%DB%8C%DA%A9_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA_%DA%A9%D9%86%DB%8C%D8%AF\" >\ud83d\udcdd \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%93%9D_%DB%8C%DA%A9_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%B1%D8%A7_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2_%DA%A9%D9%86%DB%8C%D8%AF\" >\ud83d\udcdd \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%93%9D_%D8%AD%D8%B0%D9%81_%DB%8C%DA%A9_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\" >\ud83d\udcdd \u062d\u0630\u0641 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%D8%AA%D8%B3%D8%AA_%D9%86%D9%87%D8%A7%DB%8C%DB%8C\" >\u062a\u0633\u062a \u0646\u0647\u0627\u06cc\u06cc<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/nabfollower.com\/blog\/kotlin-crud-rest-api-using-spring-boot-hibernate-postgres-docker-and-docker-compose-1cnl\/#%F0%9F%8F%81%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\ud83c\udfc1\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%F0%9F%8F%81_%D9%85%D8%B9%D8%B1%D9%81%DB%8C\"><\/span>\n<p>  \ud83c\udfc1 \u0645\u0639\u0631\u0641\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0637\u0631\u062d\u06cc \u0627\u0632 \u0645\u0639\u0645\u0627\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p><\/p>\n<p>\u0645\u0627 5 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a \u0627\u0635\u0644\u06cc CRUD \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f:<\/p>\n<ul>\n<li>\u0627\u064a\u062c\u0627\u062f \u0643\u0631\u062f\u0646<\/li>\n<li>\u0647\u0645\u0647 \u0627\u0634 \u0631\u0627 \u0628\u062e\u0648\u0627\u0646<\/li>\n<li>\u06cc\u06a9\u06cc \u0631\u0627 \u0628\u062e\u0648\u0627\u0646\u06cc\u062f<\/li>\n<li>\u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc<\/li>\n<li>\u062d\u0630\u0641<\/li>\n<\/ul>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0631\u0627\u062d\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0627 \u0637\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<ol>\n<li>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Spring Initializr \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Spring Boot \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f<\/li>\n<li>User.kt\u060c UserRepository.kt \u0648 UserService.kt \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u062f\u0627\u06a9\u0631 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647\u060c docker-compose.yml \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0627 Postman \u0648 Tableplus \u062a\u0633\u062a \u06a9\u0646\u06cc\u062f<\/li>\n<\/ol>\n<p>\u0645\u0627 \u0628\u0627 \u06cc\u06a9 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645 \u0647\u0645\u0631\u0627\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0648\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u0622\u0646 \u0647\u0645\u0631\u0627\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D9%84%D8%B2%D8%A7%D9%85%D8%A7%D8%AA\"><\/span>\n<p>  \u0627\u0644\u0632\u0627\u0645\u0627\u062a:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>Kotlin \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a<\/li>\n<li>Docker \u0646\u0635\u0628 \u0634\u062f\u0647 \u0648 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0627\u0633\u062a <\/li>\n<li>(\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc): \u067e\u0633\u062a\u0686\u06cc \u0648 Tableplus \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f\u060c \u0627\u0645\u0627 \u0647\u0631 \u0627\u0628\u0632\u0627\u0631 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u06a9\u0627\u0631 \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f<\/li>\n<\/ul>\n<p>\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc: \u06a9\u062f VS \u0628\u0627 \u067e\u0633\u0648\u0646\u062f\u0647\u0627\u06cc \u0632\u06cc\u0631:<\/p>\n<ul>\n<li>\u0628\u0633\u062a\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0641\u0632\u0648\u062f\u0646\u06cc \u062c\u0627\u0648\u0627<\/li>\n<li>\u0628\u0633\u062a\u0647 \u0627\u0644\u062d\u0627\u0642\u06cc \u0628\u0648\u062a \u0628\u0647\u0627\u0631<\/li>\n<\/ul>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%F0%9F%9A%80_%DB%8C%DA%A9_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%AC%D8%AF%DB%8C%D8%AF_Kotlin_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \ud83d\ude80 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062c\u062f\u06cc\u062f Kotlin \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0631\u0627\u0647 \u0647\u0627\u06cc \u0632\u06cc\u0627\u062f\u06cc \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062c\u062f\u06cc\u062f Kotlin \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u060c \u0627\u0645\u0627 \u0645\u0646 \u0627\u0632 Spring Initializr \u062f\u0631 VS Code \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0627\u06cc\u062f \u0628\u0633\u062a\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0641\u0632\u0648\u062f\u0646\u06cc \u062c\u0627\u0648\u0627 \u0648 \u0628\u0633\u062a\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0641\u0632\u0648\u062f\u0646\u06cc Spring Boot \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<p>VS Code \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u0631\u0648\u06cc \u062f\u06a9\u0645\u0647 &#8220;\u0627\u06cc\u062c\u0627\u062f \u067e\u0631\u0648\u0698\u0647 \u062c\u0627\u0648\u0627&#8221; \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_180_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u062f\u06a9\u0645\u0647 \u0627\u06cc\u062c\u0627\u062f \u067e\u0631\u0648\u0698\u0647 \u062c\u0627\u0648\u0627\" loading=\"lazy\" width=\"800\" height=\"483\" title=\"\"><\/p>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0631 \u0628\u0627\u0644\u0627\u06cc \u0635\u0641\u062d\u0647 \u0628\u0627\u0632 \u0645\u06cc \u0634\u0648\u062f.  \u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u0631\u0648\u06cc \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f:<\/p>\n<ul>\n<li>\u0686\u06a9\u0645\u0647 \u0628\u0647\u0627\u0631\u0647<\/li>\n<li>\u06af\u0631\u06cc\u062f\u0644<\/li>\n<li>3.0.5 (\u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062f\u0631 \u0622\u06cc\u0646\u062f\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u062f)<\/li>\n<li>\u06a9\u0627\u062a\u0644\u06cc\u0646<\/li>\n<li>com.example (\u0641\u0642\u0637 \u0631\u0648\u06cc enter \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f)<\/li>\n<li>\u062f\u0645\u0648 (\u0641\u0642\u0637 \u0631\u0648\u06cc enter \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f)<\/li>\n<li>\u0634\u06cc\u0634\u0647 <\/li>\n<li>\u062c\u0627\u0648\u0627 17<\/li>\n<\/ul>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u062f\u06cc\u06af\u0631 \u0628\u0627\u0632 \u0645\u06cc \u0634\u0648\u062f.  \u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u0631\u0648\u06cc \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f:<\/p>\n<ul>\n<li>Spring Web (\u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0628\u0647 \u0627\u06cc\u062c\u0627\u062f Rest API)<\/li>\n<li>Spring Data JPA (\u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0628\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Hibernate)<\/li>\n<li>\u062f\u0631\u0627\u06cc\u0648\u0631 PostgreSQL (\u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0628\u0647 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 Postgres)<\/li>\n<\/ul>\n<p>\u0633\u067e\u0633 \u0628\u0627\u06cc\u062f \u067e\u0648\u0634\u0647 \u0627\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062f\u0631 \u0622\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u06cc\u06a9 \u067e\u0648\u0634\u0647 \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f \u0648 \u0631\u0648\u06cc \u00abGenerate into this folder\u00bb \u0633\u0627\u0639\u062a \u06a9\u0646\u06cc\u062f.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_745_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u062f\u06a9\u0645\u0647 \u0627\u06cc\u062c\u0627\u062f \u067e\u0631\u0648\u0698\u0647 \u062c\u0627\u0648\u0627\" loading=\"lazy\" width=\"800\" height=\"527\" title=\"\"><\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0631\u0648\u06cc \u062f\u06a9\u0645\u0647 \u0633\u0645\u062a \u0631\u0627\u0633\u062a \u067e\u0627\u06cc\u06cc\u0646 \u0635\u0641\u062d\u0647 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u067e\u0631\u0648\u0698\u0647 \u062f\u0631 \u06cc\u06a9 \u067e\u0646\u062c\u0631\u0647 \u062c\u062f\u06cc\u062f \u0628\u0627\u0632 \u0634\u0648\u062f.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_884_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u062f\u06a9\u0645\u0647 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u062f\u0631 \u0633\u0645\u062a \u0686\u067e \u067e\u0627\u06cc\u06cc\u0646 VS Code\" loading=\"lazy\" width=\"800\" height=\"426\" title=\"\"><\/p>\n<p>\u0645\u0627 \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u067e\u0631\u0648\u0698\u0647 \u062a\u0645\u0627\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645.<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%B1%D8%A7_%DA%A9%D8%AF%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \ud83d\udc69\u200d\ud83d\udcbb \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0648 \u0645\u0631\u062d\u0644\u0647 \u0628\u0631\u0627\u06cc \u06a9\u062f\u0646\u0648\u06cc\u0633\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f:<\/p>\n<ul>\n<li>\u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631\u060c UserRepository \u0648 UserService \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%94%97_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D8%A7%D8%AA%D8%B5%D8%A7%D9%84_%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87_%D8%AF%D8%A7%D8%AF%D9%87\"><\/span>\n<p>  \ud83d\udd17 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0627\u0632 \u06a9\u0646 <code>application.properties<\/code> \u0641\u0627\u06cc\u0644 \u062f\u0631 <code>src\/main\/resources<\/code> \u067e\u0648\u0634\u0647 (\u0628\u0627\u06cc\u062f \u062e\u0627\u0644\u06cc \u0628\u0627\u0634\u062f).<\/p>\n<p>\u0645\u0637\u0627\u0644\u0628 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>spring.datasource.url=${DB_URL}\nspring.datasource.username=${PG_USER}\nspring.datasource.password=${PG_PASSWORD}\n\nspring.jpa.hibernate.ddl-auto=update\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u0648\u0636\u06cc\u062d:<\/p>\n<ul>\n<li>\n<p><code>spring.datasource.url<\/code>: \u0622\u062f\u0631\u0633 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647. <\/p>\n<\/li>\n<li>\n<p><code>spring.datasource.username<\/code>: \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647. <\/p>\n<\/li>\n<li>\n<p><code>spring.datasource.password<\/code>: \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 <\/p>\n<\/li>\n<li>\n<p><code>spring.jpa.hibernate.ddl-auto<\/code>: \u0631\u0648\u0634\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u0645.  \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f <code>update<\/code> \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u062c\u062f\u0627\u0648\u0644 \u062f\u0631 \u0635\u0648\u0631\u062a \u0639\u062f\u0645 \u0648\u062c\u0648\u062f\u060c \u0648 \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u0622\u0646\u0647\u0627 \u062f\u0631 \u0635\u0648\u0631\u062a \u0648\u062c\u0648\u062f.<\/p>\n<\/li>\n<li>\n<p><code>spring.jpa.properties.hibernate.dialect<\/code>: \u06af\u0648\u06cc\u0634 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647.  \u0645\u0627 \u0627\u0632 PostgreSQL \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0628\u0639\u062f\u0627\u064b \u0627\u0632 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f (\u0648 \u06a9\u0645\u06cc \u0645\u0634\u06a9\u0644 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f).<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%93%81_%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1_%D9%85%D9%86%D8%A8%D8%B9_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \ud83d\udcc1 \u0633\u0627\u062e\u062a\u0627\u0631 \u0645\u0646\u0628\u0639 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06cc\u06a9 \u067e\u0648\u0634\u0647 \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>users<\/code> \u062f\u0631 <code>demo<\/code> \u067e\u0648\u0634\u0647 (\u06cc\u0627 \u0647\u0631 \u0646\u0627\u0645 \u062f\u06cc\u06af\u0631\u06cc \u06a9\u0647 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0631\u0627 \u0646\u0627\u0645\u06af\u0630\u0627\u0631\u06cc \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f).<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u067e\u0648\u0634\u0647 \u0633\u0647 \u0641\u0627\u06cc\u0644 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<ul>\n<li><code>User.kt<\/code><\/li>\n<li><code>UserRepository.kt<\/code><\/li>\n<li><code>UserController.kt<\/code><\/li>\n<\/ul>\n<p>\u067e\u0648\u0634\u0647 \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0634\u0628\u06cc\u0647 \u0627\u06cc\u0646 \u0628\u0627\u0634\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_586_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0648\u0634\u0647\" loading=\"lazy\" width=\"800\" height=\"475\" title=\"\"><\/p>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0641\u0627\u06cc\u0644 \u0647\u0627 \u0631\u0627 \u067e\u0631 \u06a9\u0646\u06cc\u0645.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Userkt\"><\/span>\n<p>  User.kt<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0641\u0627\u06cc\u0644 User.kt \u062d\u0627\u0648\u06cc \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u0645\u062d\u062a\u0648\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f (\u0646\u0627\u0645 \u0628\u0633\u062a\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u0637\u0627\u0628\u0642\u062a \u0628\u0627 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f):<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"k\">package<\/span> <span class=\"nn\">com.example.demo.users<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"nn\">jakarta.persistence.*<\/span>\n\n<span class=\"nd\">@Entity<\/span>\n<span class=\"nd\">@Table<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"users\"<\/span><span class=\"p\">)<\/span>\n<span class=\"kd\">data class<\/span> <span class=\"nc\">User<\/span><span class=\"p\">(<\/span>\n    <span class=\"nd\">@Id<\/span>\n    <span class=\"nd\">@GeneratedValue<\/span><span class=\"p\">(<\/span><span class=\"n\">strategy<\/span> <span class=\"p\">=<\/span> <span class=\"nc\">GenerationType<\/span><span class=\"p\">.<\/span><span class=\"nc\">IDENTITY<\/span><span class=\"p\">)<\/span>\n    <span class=\"kd\">val<\/span> <span class=\"py\">id<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Long<\/span><span class=\"p\">,<\/span>\n    <span class=\"kd\">val<\/span> <span class=\"py\">name<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span><span class=\"p\">,<\/span>\n    <span class=\"kd\">val<\/span> <span class=\"py\">email<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span>\n<span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u0648\u0636\u06cc\u062d:<\/p>\n<ul>\n<li>\n<p><code>@Entity<\/code>: decorator \u0628\u0647 Hibernate \u0628\u06af\u0648\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u06cc\u06a9 \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0627\u0633\u062a.<\/p>\n<\/li>\n<li>\n<p><code>@Table<\/code>: decorator \u0628\u0631\u0627\u06cc \u06af\u0641\u062a\u0646 Hibernate \u0646\u0627\u0645 \u062c\u062f\u0648\u0644 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 (&#8220;users in this case&#8221;).<\/p>\n<\/li>\n<li>\n<p><code>@Id<\/code>: \u062f\u06a9\u0648\u0631\u0627\u062a\u0648\u0631 \u0628\u0647 Hibernate \u0628\u06af\u0648\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u0641\u06cc\u0644\u062f \u06a9\u0644\u06cc\u062f \u0627\u0635\u0644\u06cc \u0627\u0633\u062a.<\/p>\n<\/li>\n<li>\n<p><code>@GeneratedValue<\/code>: \u062f\u06a9\u0648\u0631\u0627\u062a\u0648\u0631 \u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0627\u06cc\u0634 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0634\u0646\u0627\u0633\u0647 \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062c\u062f\u06cc\u062f\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<\/li>\n<\/ul>\n<p>\u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0633\u0647 \u0641\u06cc\u0644\u062f \u062e\u0648\u0627\u0647\u062f \u062f\u0627\u0634\u062a: <code>id<\/code>\u060c <code>name<\/code> \u0648 <code>email<\/code>.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"UserRepositorykt\"><\/span>\n<p>  UserRepository.kt<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0641\u0627\u06cc\u0644 UserRepository.kt \u0634\u0627\u0645\u0644 \u0631\u0627\u0628\u0637\u06cc \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f <code>UserRepository.kt<\/code> \u0648 \u0645\u062d\u062a\u0648\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f (\u0627\u06af\u0631 \u0627\u0632 \u0628\u0633\u062a\u0647 \u062f\u06cc\u06af\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0646\u0627\u0645 \u0628\u0633\u062a\u0647 \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f):<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"k\">package<\/span> <span class=\"nn\">com.example.demo.users<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.data.repository.CrudRepository<\/span>\n\n<span class=\"kd\">interface<\/span> <span class=\"nc\">UserRepository<\/span> <span class=\"p\">:<\/span> <span class=\"nc\">CrudRepository<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">User<\/span><span class=\"p\">,<\/span> <span class=\"nc\">Long<\/span><span class=\"p\">&gt;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u0648\u0636\u06cc\u062d:<\/p>\n<ul>\n<li>\n<code>interface UserRepository<\/code>: \u0631\u0627\u0628\u0637\u06cc \u06a9\u0647 \u0634\u0627\u0645\u0644 \u0645\u062a\u062f\u0647\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a.  \u0627\u0632 \u0646\u0648\u0639 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f <code>CrudRepository<\/code>.  \u0627\u06cc\u0646 \u06cc\u06a9 \u0631\u0627\u0628\u0637 \u0639\u0645\u0648\u0645\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0634\u0627\u0645\u0644 \u0631\u0648\u0634 \u0647\u0627\u06cc \u0627\u0633\u0627\u0633\u06cc \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a.  \u06cc\u06a9 \u0646\u0648\u0639 \u062e\u0648\u0627\u0647\u062f \u062f\u0627\u0634\u062a <code>User<\/code> \u0648 \u06cc\u06a9 <code>Int<\/code> (\u0646\u0648\u0639 \u06a9\u0644\u06cc\u062f \u0627\u0635\u0644\u06cc).<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"UserControllerkt\"><\/span>\n<p>  UserController.kt<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0641\u0627\u06cc\u0644 UserController.kt \u062d\u0627\u0648\u06cc Rest API \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f <code>UserController.kt<\/code> \u0648 \u0645\u062d\u062a\u0648\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f (\u0627\u06af\u0631 \u0627\u0632 \u0628\u0633\u062a\u0647 \u062f\u06cc\u06af\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0646\u0627\u0645 \u0628\u0633\u062a\u0647 \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f):<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"k\">package<\/span> <span class=\"nn\">com.example.demo.users<\/span>\n\n\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.beans.factory.annotation.Autowired<\/span>\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.http.HttpStatus<\/span>\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.http.ResponseEntity<\/span>\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.*<\/span>\n\n<span class=\"nd\">@RestController<\/span>\n<span class=\"nd\">@RequestMapping<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/api\/users\"<\/span><span class=\"p\">)<\/span>\n<span class=\"kd\">class<\/span> <span class=\"nc\">UserController<\/span><span class=\"p\">(<\/span><span class=\"nd\">@Autowired<\/span> <span class=\"k\">private<\/span> <span class=\"kd\">val<\/span> <span class=\"py\">userRepository<\/span><span class=\"p\">:<\/span> <span class=\"nc\">UserRepository<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n\n    <span class=\"nd\">@GetMapping<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">fun<\/span> <span class=\"nf\">getAllUsers<\/span><span class=\"p\">():<\/span> <span class=\"nc\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">User<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">=<\/span>\n        <span class=\"n\">userRepository<\/span><span class=\"p\">.<\/span><span class=\"nf\">findAll<\/span><span class=\"p\">().<\/span><span class=\"nf\">toList<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"nd\">@PostMapping<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">fun<\/span> <span class=\"nf\">createUser<\/span><span class=\"p\">(<\/span><span class=\"nd\">@RequestBody<\/span> <span class=\"n\">user<\/span><span class=\"p\">:<\/span> <span class=\"nc\">User<\/span><span class=\"p\">):<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">User<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">val<\/span> <span class=\"py\">createdUser<\/span> <span class=\"p\">=<\/span> <span class=\"n\">userRepository<\/span><span class=\"p\">.<\/span><span class=\"nf\">save<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">(<\/span><span class=\"n\">createdUser<\/span><span class=\"p\">,<\/span> <span class=\"nc\">HttpStatus<\/span><span class=\"p\">.<\/span><span class=\"nc\">CREATED<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"nd\">@GetMapping<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/{id}\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">fun<\/span> <span class=\"nf\">getUserById<\/span><span class=\"p\">(<\/span><span class=\"nd\">@PathVariable<\/span><span class=\"p\">(<\/span><span class=\"s\">\"id\"<\/span><span class=\"p\">)<\/span> <span class=\"n\">userId<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Int<\/span><span class=\"p\">):<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">User<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">val<\/span> <span class=\"py\">user<\/span> <span class=\"p\">=<\/span> <span class=\"n\">userRepository<\/span><span class=\"p\">.<\/span><span class=\"nf\">findById<\/span><span class=\"p\">(<\/span><span class=\"n\">userId<\/span><span class=\"p\">).<\/span><span class=\"nf\">orElse<\/span><span class=\"p\">(<\/span><span class=\"k\">null<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">user<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span><span class=\"p\">)<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">,<\/span> <span class=\"nc\">HttpStatus<\/span><span class=\"p\">.<\/span><span class=\"nc\">OK<\/span><span class=\"p\">)<\/span>\n               <span class=\"k\">else<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">(<\/span><span class=\"nc\">HttpStatus<\/span><span class=\"p\">.<\/span><span class=\"nc\">NOT_FOUND<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"nd\">@PutMapping<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/{id}\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">fun<\/span> <span class=\"nf\">updateUserById<\/span><span class=\"p\">(<\/span><span class=\"nd\">@PathVariable<\/span><span class=\"p\">(<\/span><span class=\"s\">\"id\"<\/span><span class=\"p\">)<\/span> <span class=\"n\">userId<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Int<\/span><span class=\"p\">,<\/span> <span class=\"nd\">@RequestBody<\/span> <span class=\"n\">user<\/span><span class=\"p\">:<\/span> <span class=\"nc\">User<\/span><span class=\"p\">):<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">User<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span>\n\n        <span class=\"kd\">val<\/span> <span class=\"py\">existingUser<\/span> <span class=\"p\">=<\/span> <span class=\"n\">userRepository<\/span><span class=\"p\">.<\/span><span class=\"nf\">findById<\/span><span class=\"p\">(<\/span><span class=\"n\">userId<\/span><span class=\"p\">).<\/span><span class=\"nf\">orElse<\/span><span class=\"p\">(<\/span><span class=\"k\">null<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">existingUser<\/span> <span class=\"p\">==<\/span> <span class=\"k\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">return<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">(<\/span><span class=\"nc\">HttpStatus<\/span><span class=\"p\">.<\/span><span class=\"nc\">NOT_FOUND<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"kd\">val<\/span> <span class=\"py\">updatedUser<\/span> <span class=\"p\">=<\/span> <span class=\"n\">existingUser<\/span><span class=\"p\">.<\/span><span class=\"nf\">copy<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span> <span class=\"p\">=<\/span> <span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">email<\/span> <span class=\"p\">=<\/span> <span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"n\">email<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">userRepository<\/span><span class=\"p\">.<\/span><span class=\"nf\">save<\/span><span class=\"p\">(<\/span><span class=\"n\">updatedUser<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">(<\/span><span class=\"n\">updatedUser<\/span><span class=\"p\">,<\/span> <span class=\"nc\">HttpStatus<\/span><span class=\"p\">.<\/span><span class=\"nc\">OK<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"nd\">@DeleteMapping<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/{id}\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">fun<\/span> <span class=\"nf\">deleteUserById<\/span><span class=\"p\">(<\/span><span class=\"nd\">@PathVariable<\/span><span class=\"p\">(<\/span><span class=\"s\">\"id\"<\/span><span class=\"p\">)<\/span> <span class=\"n\">userId<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Int<\/span><span class=\"p\">):<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">User<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"n\">userRepository<\/span><span class=\"p\">.<\/span><span class=\"nf\">existsById<\/span><span class=\"p\">(<\/span><span class=\"n\">userId<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">return<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">(<\/span><span class=\"nc\">HttpStatus<\/span><span class=\"p\">.<\/span><span class=\"nc\">NOT_FOUND<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span>\n        <span class=\"n\">userRepository<\/span><span class=\"p\">.<\/span><span class=\"nf\">deleteById<\/span><span class=\"p\">(<\/span><span class=\"n\">userId<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">(<\/span><span class=\"nc\">HttpStatus<\/span><span class=\"p\">.<\/span><span class=\"nc\">NO_CONTENT<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u0648\u0636\u06cc\u062d:<\/p>\n<ul>\n<li>\n<p><code>@RestController<\/code>: \u062f\u06a9\u0648\u0631\u0627\u062a\u0648\u0631 \u0628\u0631\u0627\u06cc \u0628\u0647\u0627\u0631.<\/p>\n<\/li>\n<li>\n<p><code>@RequestMapping<\/code>: \u0628\u0631\u0627\u06cc \u06af\u0641\u062a\u0646 \u0628\u0647 Spring url \u067e\u0627\u06cc\u0647 Rest API.  \u062f\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f <code>\/api\/users<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>@Autowired<\/code>: \u0628\u0647 \u0628\u0647\u0627\u0631 \u0628\u06af\u0648\u06cc\u0645 \u06a9\u0647 \u062a\u0632\u0631\u06cc\u0642 \u06a9\u0646\u062f <code>UserRepository<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0633\u067e\u0633 \u0645\u0627 \u067e\u0646\u062c \u0631\u0648\u0634 \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0627\u0631\u06cc\u0645:<\/p>\n<ul>\n<li>\n<code>getAllUsers<\/code>: \u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646.<\/li>\n<li>\n<code>createUser<\/code>: \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u062c\u062f\u06cc\u062f.<\/li>\n<li>\n<code>getUserById<\/code>: \u0628\u0631\u0627\u06cc \u0628\u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627 \u0634\u0646\u0627\u0633\u0647.<\/li>\n<li>\n<code>updateUserById<\/code>: \u0628\u0631\u0627\u06cc \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627 \u0634\u0646\u0627\u0633\u0647.<\/li>\n<li>\n<code>deleteUserById<\/code>: \u0628\u0631\u0627\u06cc \u062d\u0630\u0641 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627 \u0634\u0646\u0627\u0633\u0647.<\/li>\n<\/ul>\n<p>Rest API \u0645\u0627 \u0628\u0631\u0627\u06cc Dockerized \u0622\u0645\u0627\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%F0%9F%90%B3_%D8%AF%D8%A7%DA%A9%D8%B1%D8%B3%D8%A7%D8%B2%DB%8C\"><\/span>\n<p>  \ud83d\udc33 \u062f\u0627\u06a9\u0631\u0633\u0627\u0632\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u062e\u0634 \u0633\u0631\u06af\u0631\u0645 \u06a9\u0646\u0646\u062f\u0647: Dockerization.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u067e\u0631\u0648\u0698\u0647 \u06a9\u0627\u062a\u0644\u06cc\u0646 \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u062f\u0631 \u062f\u0627\u062e\u0644 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0628\u0633\u0627\u0632\u0645. <\/p>\n<p>\u06af\u0632\u06cc\u0646\u0647 \u062f\u06cc\u06af\u0631 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u0628\u0633\u0627\u0632\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0641\u0627\u06cc\u0644 jar \u0631\u0627 \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u06a9\u067e\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%90%8B_%D8%AF%D8%A7%DA%A9%D8%B1%D9%81%D8%A7%DB%8C%D9%84\"><\/span>\n<p>  \ud83d\udc0b \u062f\u0627\u06a9\u0631\u0641\u0627\u06cc\u0644<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>Dockerfile<\/code> \u062f\u0631 \u0631\u06cc\u0634\u0647 \u067e\u0631\u0648\u0698\u0647<\/p>\n<p>\u0645\u0637\u0627\u0644\u0628 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f (\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062f\u0631 \u0646\u0638\u0631\u0627\u062a \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a):<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight docker\"><code><span class=\"c\"># Start with a base image containing Java runtime<\/span>\n<span class=\"k\">FROM<\/span><span class=\"s\"> amazoncorretto:17-alpine-jdk<\/span>\n\n<span class=\"c\"># Create a directory<\/span>\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/app<\/span>\n\n<span class=\"c\"># Copy all the files from the current directory to the image<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> . .<\/span>\n\n<span class=\"c\"># build the project avoiding tests<\/span>\n<span class=\"k\">RUN <\/span>.\/gradlew clean build <span class=\"nt\">-x<\/span> <span class=\"nb\">test<\/span>\n\n<span class=\"c\"># Expose port 8080<\/span>\n<span class=\"k\">EXPOSE<\/span><span class=\"s\"> 8080<\/span>\n\n<span class=\"c\"># Run the jar file<\/span>\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"java\", \"-jar\", \".\/build\/libs\/demo-0.0.1-SNAPSHOT.jar\"]<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u26a0\ufe0f \u0628\u062e\u0634 \u063a\u06cc\u0631\u0645\u0639\u0645\u0648\u0644 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u062e\u0637\u0648\u0637 ARG \u0647\u0633\u062a\u0646\u062f.  \u0622\u0646\u0647\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u0647\u0627 \u0628\u0647 \u062a\u0635\u0648\u06cc\u0631 Docker \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f.  \u0622\u0646\u0647\u0627 \u062f\u0631 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0646\u062f <code>docker-compose.yml<\/code> \u0641\u0627\u06cc\u0644.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%90%99_docker-composeyml\"><\/span>\n<p>  \ud83d\udc19 docker-compose.yml<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645 <code>docker-compose.yml<\/code> \u0641\u0627\u06cc\u0644 \u062f\u0631 \u0631\u06cc\u0634\u0647 \u067e\u0631\u0648\u0698\u0647<\/p>\n<p>\u0645\u0637\u0627\u0644\u0628 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f (\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062f\u0631 \u0646\u0638\u0631\u0627\u062a \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a):<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">3.9'<\/span>\n\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span> \n  <span class=\"na\">kotlinapp<\/span><span class=\"pi\">:<\/span> \n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">kotlinapp<\/span>\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># this is the build context: .  <\/span>\n      <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\n      <span class=\"na\">dockerfile<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Dockerfile<\/span>\n      <span class=\"na\">args<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># these are the arguments that are passed to the dockerfile<\/span>\n        <span class=\"na\">DB_URL<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${DB_URL}<\/span> \n        <span class=\"na\">PG_USER<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${PG_USER}<\/span>\n        <span class=\"na\">PG_PASSWORD<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${PG_PASSWORD}<\/span>\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># port exposed to the host machine<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">8080:8080\"<\/span>\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># these are the environment variables that are passed to the dockerfile<\/span>\n      <span class=\"na\">DB_URL<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jdbc:postgresql:\/\/db:5432\/postgres<\/span>\n      <span class=\"na\">PG_USER<\/span><span class=\"pi\">:<\/span> <span class=\"s\">postgres<\/span>\n      <span class=\"na\">PG_PASSWORD<\/span><span class=\"pi\">:<\/span> <span class=\"s\">postgres<\/span>\n    <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># this is the dependency on the db service<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">db<\/span>\n  <span class=\"na\">db<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">db<\/span>\n    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">postgres:12<\/span>\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># environment variables for the Postgres container<\/span>\n      <span class=\"na\">POSTGRES_USER<\/span><span class=\"pi\">:<\/span> <span class=\"s\">postgres<\/span>\n      <span class=\"na\">POSTGRES_PASSWORD<\/span><span class=\"pi\">:<\/span> <span class=\"s\">postgres<\/span>\n      <span class=\"na\">POSTGRES_DB<\/span><span class=\"pi\">:<\/span> <span class=\"s\">postgres<\/span>\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># port exposed to the host machine<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">5432:5432\"<\/span>\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># volume used to persist data<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">pgdata:\/var\/lib\/postgresql\/data<\/span>\n\n<span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># volume creation<\/span>\n  <span class=\"na\">pgdata<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">{}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%B1%D8%A7_%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D8%AF_%D9%88_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f \u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u0645 \u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u0645.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%F0%9F%92%BD_%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87_%D8%AF%D8%A7%D8%AF%D9%87_Postgres_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \ud83d\udcbd \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>docker compose up <span class=\"nt\">-d<\/span> db\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0627\u0633\u062a\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>docker compose logs\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>docker ps -a\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06af\u0631 \u062e\u0631\u0648\u062c\u06cc \u0645\u0627\u0646\u0646\u062f \u062e\u0631\u0648\u062c\u06cc \u0632\u06cc\u0631 \u0627\u0633\u062a\u060c \u062e\u0648\u0628 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0648\u06cc\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_628_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u062f\u0627\u06a9\u0631 ps -a\" loading=\"lazy\" width=\"800\" height=\"312\" title=\"\"><\/p>\n<p>\u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0686\u0646\u06cc\u0646 \u0686\u06cc\u0632\u06cc \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f\u060c \u0634\u0645\u0627 \u062e\u0648\u0628 \u0647\u0633\u062a\u06cc\u062f \u06a9\u0647 \u0628\u0631\u0648\u06cc\u062f.<\/p>\n<p>\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0627\u0636\u0627\u0641\u06cc\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TablePlus (\u06cc\u0627 \u0647\u0631 \u0645\u0634\u062a\u0631\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u06cc\u06af\u0631) \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u062f.<\/p>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0632\u06cc\u0631 \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<ul>\n<li>\u0645\u06cc\u0632\u0628\u0627\u0646: localhost<\/li>\n<li>\u0628\u0646\u062f\u0631: 5432<\/li>\n<li>\u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647: postgres<\/li>\n<li>\u06a9\u0627\u0631\u0628\u0631: postgres<\/li>\n<li>\u0631\u0645\u0632 \u0639\u0628\u0648\u0631: postgres<\/li>\n<\/ul>\n<p>\u0633\u067e\u0633 \u0628\u0631 \u0631\u0648\u06cc \u0622\u0646 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <code>Test Connection<\/code> \u062f\u06a9\u0645\u0647.  \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062a\u0635\u0644 \u0627\u0633\u062a \u0627\u0645\u0627 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u062e\u0627\u0644\u06cc \u0627\u0633\u062a.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_668_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u062c\u062f\u0648\u0644 \u067e\u0644\u0627\u0633\" loading=\"lazy\" width=\"800\" height=\"694\" title=\"\"><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%8F%97%EF%B8%8F_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%B1%D8%A7_%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D8%AF\"><\/span>\n<p>  \ud83c\udfd7\ufe0f \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062f\u0631 \u062f\u0627\u062e\u0644 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0628\u0633\u0627\u0632\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>docker compose build\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u062e\u0631\u0648\u062c\u06cc \u0628\u0627\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0628\u0627\u0634\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_738_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u0633\u0627\u062e\u062a docker compose\" loading=\"lazy\" width=\"800\" height=\"558\" title=\"\"><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%8F%83%E2%80%8D%E2%99%82%EF%B8%8F_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \ud83c\udfc3\u200d\u2642\ufe0f \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>docker compose up kotlinapp\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0627\u06cc\u0646 \u0628\u0627\u06cc\u062f \u062e\u0631\u0648\u062c\u06cc \u0628\u0627\u0634\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_646_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"docker compose up kotlinapp\" loading=\"lazy\" width=\"800\" height=\"468\" title=\"\"><\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%F0%9F%A7%AA_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%B1%D8%A7_%D8%AA%D8%B3%D8%AA_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \ud83e\uddea \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062a\u0633\u062a \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u0645.  \u0645\u0627 \u0627\u0632 Postman \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f\u060c \u0627\u0645\u0627 \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0647\u0631 \u0627\u0628\u0632\u0627\u0631 \u062f\u06cc\u06af\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%93%9D_%DB%8C%DA%A9_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \ud83d\udcdd \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u062c\u062f\u06cc\u062f\u060c a \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>POST request to localhost:8080\/api\/users<\/code>.<\/p>\n<p>\u0628\u062f\u0646\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0627\u06cc\u062f \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0628\u0627\u0634\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"aaa\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"email\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"aaa@mail\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062e\u0631\u0648\u062c\u06cc \u0628\u0627\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0628\u0627\u0634\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_929_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u06a9\u0627\u0631\u0628\u0631 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f\" loading=\"lazy\" width=\"800\" height=\"475\" title=\"\"><\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u062f\u0648 \u06a9\u0627\u0631\u0628\u0631 \u062f\u06cc\u06af\u0631 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645\u060c \u06cc\u06a9 <code>POST request to localhost:8080\/api\/users<\/code>.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"bbb\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"email\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"bbb@mail\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"ccc\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"email\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"ccc@mail\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%93%9D_%D9%87%D9%85%D9%87_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%A7%D9%86_%D8%B1%D8%A7_%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \ud83d\udcdd \u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u060c \u06cc\u06a9 \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f <code>GET request to localhost:8000\/api\/users<\/code>.<\/p>\n<p>\u062e\u0631\u0648\u062c\u06cc \u0628\u0627\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0628\u0627\u0634\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_200_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f\" loading=\"lazy\" width=\"800\" height=\"530\" title=\"\"><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%93%9D_%DB%8C%DA%A9_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \ud83d\udcdd \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631\u060c a <code>GET request to localhost:8000\/api\/users\/{id}<\/code>.<\/p>\n<p>\u0645\u062b\u0644\u0627 <code>GET request to localhost:8000\/api\/users\/1<\/code>.<\/p>\n<p>\u062e\u0631\u0648\u062c\u06cc \u0628\u0627\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0628\u0627\u0634\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_391_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u06a9\u0627\u0631\u0628\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f\" loading=\"lazy\" width=\"800\" height=\"325\" title=\"\"><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%93%9D_%DB%8C%DA%A9_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%B1%D8%A7_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \ud83d\udcdd \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631\u060c \u06cc\u06a9 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>PUT request to localhost:8000\/api\/users\/{id}<\/code>.<\/p>\n<p>\u0645\u062b\u0644\u0627 <code>PUT request to localhost:8000\/api\/users\/2<\/code>.<\/p>\n<p>\u0628\u062f\u0646\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0627\u06cc\u062f \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0628\u0627\u0634\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"Francesco\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"email\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"francesco@mail\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062e\u0631\u0648\u062c\u06cc \u0628\u0627\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0628\u0627\u0634\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_451_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f\" loading=\"lazy\" width=\"800\" height=\"475\" title=\"\"><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%F0%9F%93%9D_%D8%AD%D8%B0%D9%81_%DB%8C%DA%A9_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\"><\/span>\n<p>  \ud83d\udcdd \u062d\u0630\u0641 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc \u062d\u0630\u0641 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631\u060c \u06cc\u06a9 \u0639\u0644\u0627\u0645\u062a \u0628\u0632\u0646\u06cc\u062f <code>DELETE request to localhost:8000\/api\/users\/{id}<\/code>.<\/p>\n<p>\u0645\u062b\u0644\u0627 <code>DELETE request to localhost:8000\/api\/users\/1<\/code>.<\/p>\n<p>\u062f\u0631 \u067e\u0633\u062a\u0686\u06cc \u0628\u0627\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0622\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_486_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u062d\u0630\u0641 \u06a9\u0646\u06cc\u062f\" loading=\"lazy\" width=\"800\" height=\"276\" title=\"\"><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AA%D8%B3%D8%AA_%D9%86%D9%87%D8%A7%DB%8C%DB%8C\"><\/span>\n<p>  \u062a\u0633\u062a \u0646\u0647\u0627\u06cc\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u062a\u0633\u062a \u0646\u0647\u0627\u06cc\u06cc\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TablePlus \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1681231833_211_Kotlin-CRUD-Rest-Api-\u0628\u0627-\u0627\u0633\u062a\u0641\u0627\u062f\u0647-\u0627\u0632-Spring-Boot\u060c-Hibernate\u060c.png\" alt=\"\u062c\u062f\u0648\u0644 \u067e\u0644\u0627\u0633\" loading=\"lazy\" width=\"800\" height=\"597\" title=\"\"><\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%F0%9F%8F%81%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  \ud83c\udfc1\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0627 \u0633\u0627\u062e\u062a\u06cc\u0645\u0634!  \u0645\u0627 \u06cc\u06a9 CRUD rest API \u062f\u0631 Kotlin \u0633\u0627\u062e\u062a\u0647\u200c\u0627\u06cc\u0645 \u06a9\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632:<\/p>\n<ul>\n<li>\u0686\u06a9\u0645\u0647 \u0628\u0647\u0627\u0631\u0647<\/li>\n<li>\u06af\u0631\u06cc\u062f\u0644<\/li>\n<li>\u062e\u0648\u0627\u0628 \u0632\u0645\u0633\u062a\u0627\u0646\u06cc<\/li>\n<li>Postgres<\/li>\n<li>\u062f\u0627\u06a9\u0631<\/li>\n<li>Docker Compose<\/li>\n<\/ul>\n<p>\u0627\u06af\u0631 \u0646\u0633\u062e\u0647 \u0648\u06cc\u062f\u06cc\u0648\u06cc\u06cc \u0631\u0627 \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc \u062f\u0647\u06cc\u062f:<\/p>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=BbT1PCAOS2s\" rel=\"nofollow noopener\" target=\"_blank\">https:\/\/www.youtube.com\/watch?v=BbT1PCAOS2s<\/a><br \/>\n<\/iframe>\n<\/p>\n<p>\u062a\u0645\u0627\u0645 \u06a9\u062f\u0647\u0627 \u062f\u0631 \u0645\u062e\u0632\u0646 GitHub \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a (\u0644\u06cc\u0646\u06a9 \u062f\u0631 \u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u0648\u06cc\u062f\u06cc\u0648): https:\/\/youtube.com\/live\/BbT1PCAOS2s<\/p>\n<p>\u0647\u0645\u06cc\u0646. <\/p>\n<p>\u0627\u06af\u0631 \u0633\u0648\u0627\u0644\u06cc \u062f\u0627\u0631\u06cc\u062f\u060c \u062f\u0631 \u0632\u06cc\u0631 \u0646\u0638\u0631 \u062f\u0647\u06cc\u062f.<\/p>\n<p>\u0641\u0631\u0627\u0646\u0686\u0633\u06a9\u0648<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 CRUD Rest API \u062f\u0631 Kotlin \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645\u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632: \u0686\u06a9\u0645\u0647 \u0628\u0647\u0627\u0631\u0647 \u06af\u0631\u06cc\u062f\u0644 \u062e\u0648\u0627\u0628 \u0632\u0645\u0633\u062a\u0627\u0646\u06cc Postgres \u062f\u0627\u06a9\u0631 Docker Compose \u0627\u06af\u0631 \u0646\u0633\u062e\u0647 \u0648\u06cc\u062f\u06cc\u0648\u06cc\u06cc \u0631\u0627 \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc \u062f\u0647\u06cc\u062f: \u062a\u0645\u0627\u0645 \u06a9\u062f\u0647\u0627 \u062f\u0631 \u0645\u062e\u0632\u0646 GitHub \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a (\u0644\u06cc\u0646\u06a9 \u062f\u0631 \u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u0648\u06cc\u062f\u06cc\u0648): https:\/\/youtube.com\/live\/BbT1PCAOS2s \ud83c\udfc1 \u0645\u0639\u0631\u0641\u06cc \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0637\u0631\u062d\u06cc \u0627\u0632 \u0645\u0639\u0645\u0627\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645 \u0622\u0645\u062f\u0647 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":16949,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-16947","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/16947","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=16947"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/16947\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/16949"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=16947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=16947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=16947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}