{"id":485946,"date":"2024-06-20T07:41:54","date_gmt":"2024-06-20T06:41:54","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=qodana&#038;p=485946"},"modified":"2024-06-20T07:42:07","modified_gmt":"2024-06-20T06:42:07","slug":"qodana-2024-1-release","status":"publish","type":"qodana","link":"https:\/\/blog.jetbrains.com\/ko\/qodana\/2024\/06\/qodana-2024-1-release\/","title":{"rendered":"Qodana 2024.1\uc744 \uc0ac\uc6a9\ud558\uc5ec IntelliJ IDEA \ub4f1\uc5d0\uc11c \ub9de\ucda4\ud615 \ucf54\ub4dc \uac80\uc0ac \uc0dd\uc131"},"content":{"rendered":"<p>JetBrains Qodana\ub294 2023\ub144 7\uc6d4 \uacf5\uc2dd \uc0c1\uc6a9 \ub9b4\ub9ac\uc2a4 \uc774\ud6c4 \ucf54\ub4dc \ud488\uc9c8 \ucee4\ubba4\ub2c8\ud2f0\uc5d0\uc11c \ud654\uc81c\ub97c \ubd88\ub7ec\uc77c\uc73c\ucf30\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Qodana\ub294 \ud300\uc744 \uc704\ud55c \uacf5\uc2dd JetBrains \uc815\uc801 \ucf54\ub4dc \ubd84\uc11d \ud50c\ub7ab\ud3fc\uc73c\ub85c, JetBrains IDE \ubc0f \ud300 \ub3c4\uad6c\uc640\uc758 \ud638\ud658\uc131\uc774 \ub6f0\uc5b4\ub0a0 \ubfd0\ub9cc \uc544\ub2c8\ub77c, \uad11\ubc94\uc704\ud55c \uace0\uc720 \uac80\uc0ac\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\uc73c\uba70, \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uc804\ubc18\uc5d0\uc11c <strong>\uc6b0\uc218\ud55c \uace0\uac1d \uc9c0\uc6d0<\/strong>\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>Qodana\uac00 \uc804 \uc138\uacc4\uc801\uc73c\ub85c \ucc44\ud0dd\ub418\uace0 \uc788\ub294 \uc9c0\uae08\uc774 \ubc14\ub85c, \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uacfc \uc5c5\ub370\uc774\ud2b8\ub97c \ubc1c\ud45c\ud558\uc5ec \ud300\uc774 \uadf8 \uc5b4\ub290 \ub54c\ubcf4\ub2e4 \uc218\uc694\uac00 \uae09\uc99d\ud558\ub294 \uc5c5\uacc4\uc5d0\uc11c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \ud488\uc9c8\uc744 \uac15\ud654\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc6b8 \uc218 \uc788\ub294 \uc801\uae30\uc77c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ud300\uc744 \uc704\ud55c \ub9de\ucda4\ud615 \uac80\uc0ac\ub97c \uc0dd\uc131\ud558\uac70\ub098, \uaddc\uc815 \uc900\uc218\ub97c \ud558\uac70\ub098 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \uae30\ubcf8\uc801\uc73c\ub85c \ub77c\uc774\uc120\uc2a4\ub97c \uac10\uc0ac\ud558\uac70\ub098, \ub2e8\uc21c\ud788 \ucf54\ub4dc \ubd84\uc11d \uacb0\uacfc\ub97c \ubcf4\ub2e4 \uc27d\uac8c \ud0d0\uc0c9\ud558\uac70\ub098, \uc6d0\ud558\ub294 \uac83\uc774 \ubb34\uc5c7\uc774\ub4e0, Qodana\ub294 2024.1 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c \uc774\ub7ec\ud55c \uae30\ub2a5\uacfc \uadf8 \uc774\uc0c1\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Qodana \uc0ac\uc6a9\ud574 \ubcf4\uae30\" href=\"https:\/\/qodana.cloud\/onboarding?licensePlan=TRIAL_ULTIMATE_PLUS\" target=\"_blank\" rel=\"noopener noreferrer\"><i class=\"download-icon\"><\/i>Qodana \uc0ac\uc6a9\ud574 \ubcf4\uae30<\/a><\/p>\n<p><!--more--><\/p>\n<p><strong>\ubaa9\ucc28<\/strong><\/p>\n<p><a href=\"#FlexInspect\">FlexInspect<\/a><br \/><a href=\"#Diff-analysis\">qodana-dotnet\uc5d0 \ub300\ud55c \ucc28\uc774\uc810 \ubd84\uc11d<\/a><br \/><a href=\"#License-Audit\">\ubc14\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud65c\uc131\ud654\ub41c \ub77c\uc774\uc120\uc2a4 \uac10\uc0ac<\/a><br \/><a href=\"#Gitlab-code-quality\">GitLab \ucf54\ub4dc \ud488\uc9c8 \ubc0f BitBucket \ucf54\ub4dc \ubd84\uc11d \uc9c0\uc6d0<\/a><br \/><a href=\"#Improved-UX\">IDE \ud50c\ub7ec\uadf8\uc778 UX \uac1c\uc120 \uc0ac\ud56d<\/a><br \/><a href=\"#Default-linter-choice\">qodana.yaml\uc5d0\uc11c \uc815\uc758\ub418\uc9c0 \uc54a\uc740 \uacbd\uc6b0 \uc120\ud0dd\ub418\ub294 \ub514\ud3f4\ud2b8 Linter<\/a><br \/><a href=\"#Custom-name\">qodana.yaml \uad6c\uc131 \ud30c\uc77c\uc758 \uc774\ub984 \uc0ac\uc6a9\uc790 \uc9c0\uc815<\/a><br \/><a href=\"#Book-demo\">\ub370\ubaa8 \uc608\uc57d<\/a><\/p>\n<h2 id=\"FlexInspect\" class=\"wp-block-heading\"><strong>FlexInspect &#8211; \ub9de\ucda4\ud615 \uac80\uc0ac\ub97c \uc791\uc131\ud558\ub294 \uc0c8\ub85c\uc6b4 \ubc29\ubc95<\/strong><\/h2>\n<p>\ud300\uc5d0\ub294 \uc800\ub9c8\ub2e4 \ucf54\ub4dc \ud488\uc9c8\uacfc \uad00\ub828\ub41c \uace0\uc720\ud55c \uc694\uad6c \uc0ac\ud56d\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ud604\uc7ac\ub85c\uc11c\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \uc804\uccb4 \uaddc\uce59 \ubc94\uc704\ub97c \ud3ec\uad04\ud558\ub294 \ub2e8\uc77c \ucf54\ub4dc \ud488\uc9c8 \ub3c4\uad6c\uac00 \uc5c6\uc73c\ubbc0\ub85c, \ud2b9\uc815 \uc694\uad6c \uc0ac\ud56d\uc774 \uc788\ub294 \ud300\uc5d0\uac8c\ub294 \ube48\ud2c8\uc774 \uc0dd\uae38 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c Qodana\uc758 <strong>FlexInspect<\/strong><em>\ub97c \uc0ac\uc6a9\ud558\uba74,<\/em> \ucf54\ub4dc\ub098 \uc800\uc7a5\uc18c\uc5d0 \uc801\uc6a9\ud558\ub824\ub294 \ubaa8\ub4e0 \uaddc\uce59\uc5d0 \ub300\ud574 \ub9de\ucda4\ud615 \ucf54\ub4dc \uac80\uc0ac\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c IntelliJ IDEA\uc5d0\uc11c \ud574\ub2f9 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ub300\ud574 \ub610\ub294 CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc5d0\uc11c Qodana\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ub7ec\ud55c \uac80\uc0ac\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-467620\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/04\/FlexInspect-Kotlin-when-with-else-for-sealed-class_dark-1.png\" alt=\"Qodana\uc758 \ub9de\ucda4\ud615 \ucf54\ub4dc \uac80\uc0ac. \" width=\"3584\" height=\"2042\" \/><figcaption class=\"wp-element-caption\">FlexInspect &#8211; Qodana\uc758 \ub9de\ucda4\ud615 \ucf54\ub4dc \uac80\uc0ac.<\/figcaption><\/figure>\n<p>\uc774\ub7ec\ud55c \ubc29\uc2dd\uc73c\ub85c \ucf54\ub4dc \ubca0\uc774\uc2a4\uc640 \ud300\uacfc \uad00\ub828\ub41c \ud2b9\uc815 \uc774\uc288\ub97c \ud30c\uc545\ud558\uace0, \uc2dc\uac04\uacfc \ub178\ub825\uc744 \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>IntelliJ IDEA \ub0b4\uc5d0\uc11c Kotlin <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/code-inspections.html\" target=\"_blank\" rel=\"noopener\">IntelliJ API<\/a>\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub9de\ucda4\ud615 \uac80\uc0ac\ub97c \uc791\uc131\ud558\ub824\uba74 \ub2e4\uc74c \ub2e8\uacc4\ub97c \ub530\ub974\uc138\uc694.<\/p>\n<ul>\n<li>\uc18c\uc2a4 \ucf54\ub4dc\uc758 AST(\ucd94\uc0c1 \uad6c\ubb38 \ud2b8\ub9ac)\uc5d0 \uc561\uc138\uc2a4\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc0c8\ub85c\uc6b4 \uac80\uc0ac\uac00 \ucf54\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc791\ub3d9\ub418\ub294\uc9c0 \uc2e4\uc2dc\uac04\uc73c\ub85c \ub514\ubc84\uadf8\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc608\uc0c1 \ub3d9\uc791\uc744 \ucda9\uc871\ud558\uc9c0 \uc54a\ub294 \ucf54\ub4dc \uc138\uadf8\uba3c\ud2b8 \uac15\uc870 \ud45c\uc2dc\ub97c \ube44\ub86f\ud558\uc5ec, \uc2e4\uc81c\ub85c \uc2e4\ud589\ub418\ub294 \uc0c8\ub85c\uc6b4 \ub9de\ucda4\ud615 \uac80\uc0ac\ub97c \uad00\ucc30\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\uc774 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uba74 <strong>\ubaa8\ub4e0 IntelliJ \ubc0f Qodana \uac80\uc0ac\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 API\uc778 PSI\uc5d0 \uc561\uc138\uc2a4\ud558\uace0<\/strong>, \ud544\uc694\ud560 \uc218 \uc788\ub294 \ucd94\uac00\uc801\uc778 \ub9de\ucda4\ud615 \uac80\uc0ac\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>IntelliJ IDEA PSI \ubdf0\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc\uc758 AST\uc5d0 \uc561\uc138\uc2a4\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-467631\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/04\/PSIViewer-dark-1.png\" alt=\"\uac15\ud654\ub41c \ucf54\ub4dc \ud488\uc9c8 \ubc0f \ucf54\ub4dc \uac80\ud1a0\uc758 \ub9de\ucda4\ud615 \uac80\uc0ac\ub97c \uc704\ud55c PSI \ubdf0\uc5b4\" width=\"3214\" height=\"1668\" \/><\/p>\n<figcaption class=\"wp-element-caption\">PSI \ubdf0\uc5b4.<\/figcaption>\n<\/figure>\n<p>FlexInspect\uc5d0\uc11c\ub294 Java, Kotlin, JavaScript, TypeScript, PHP, Go, Python, Ruby, SQL, XML, CSS, YAML, JSON, shell, Dockerfile\uc744 \ube44\ub86f\ud55c \ub2e4\uc591\ud55c \uc5b8\uc5b4\ub85c \ucf54\ub4dc\ub97c \ubd84\uc11d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubaa9\ub85d\uc744 \ub298\ub9ac\uae30 \uc704\ud574 \ub178\ub825\ud558\uace0 \uc788\uc73c\ub2c8, \uacc4\uc18d \uc9c0\ucf1c\ubd10 \uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4!<\/p>\n<p><strong>\ucc38\uace0:<\/strong> \ub9de\ucda4\ud615 \uac80\uc0ac\ub97c \uad6c\ud604\ud558\ub824\uba74 Kotlin\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. \uc989, IntelliJ IDEA Ultimate\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ub610\ud55c FlexInspect\uc758 \uccab \ub9b4\ub9ac\uc2a4\uc774\ubbc0\ub85c, \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uacbd\uc6b0 \uc5b8\uc81c\ub4e0\uc9c0 \uc9c0\uc6d0 \ud300\uc5d0 \ubb38\uc758\ud574 \uc8fc\uc138\uc694. qodana-support@jetbrains.com\uc73c\ub85c \ubb38\uc758\ud558\uc5ec \uc9c0\uc6d0\uc744 \ubc1b\uac70\ub098, <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/QD\" target=\"_blank\" rel=\"noopener\">Qodana \uc774\uc288 \ud2b8\ub798\ucee4<\/a>\uc5d0 \ubc84\uadf8 \ubcf4\uace0\uc11c\ub97c \uc81c\ucd9c\ud558\uc138\uc694.<\/p>\n<h2 id=\"Diff-analysis\" class=\"wp-block-heading\"><strong>Qodana for .NET\uc5d0 \ucd94\uac00\ub41c \ucc28\uc774\uc810 \ubd84\uc11d<\/strong><\/h2>\n<p>\uc774\uc81c \uc804\uccb4 \ucf54\ub4dc \ubca0\uc774\uc2a4\ub97c \uc2a4\uce94\ud558\ub294 \ub300\uc2e0 QDnet linter\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc6d0\ud560 \ub54c\ub9cc \ubcd1\ud569 \ubc0f \ud480 \ub9ac\ud018\uc2a4\ud2b8\ub97c \ubd84\uc11d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ubaa8\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubcc0\uacbd \uc138\ud2b8(\uc608: \ubcd1\ud569 \ub610\ub294 \ud480 \ub9ac\ud018\uc2a4\ud2b8)\uc5d0\uc11c \uc99d\ubd84 \ub610\ub294 \ucc28\uc774\uc810 \ubd84\uc11d\uc744 \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code> qodana-github-action<\/code> \uc0ac\uc6a9\uc790\uc758 \uacbd\uc6b0 \uc774 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc790\ub3d9\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n<p><strong>\uc0c1\ud669\ubcc4 \uc0ac\uc6a9 \ubc29\ubc95:<\/strong><\/p>\n<p>\u201c\ubc29\uae08 \ucee4\ubc0b\uc744 \ub9c8\ucce4\uace0 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubd84\uc11d\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4.\u201d<\/p>\n<pre class=\"EnlighterJSRAW\">qodana scan --diff-start=$GIT_START_HASH<\/pre>\n<p>\u201c\ub450 \ucee4\ubc0b \uac04\uc5d0 \uc77c\ub828\uc758 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubd84\uc11d\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4.\u201d<\/p>\n<pre class=\"EnlighterJSRAW\">qodana scan --diff-start=$GIT_HASH_START --diff-end=$GIT_HASH_END<\/pre>\n<p>\u201cCI \uc2e4\ud589\uc5d0 Qodana GitHub \uc561\uc158\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.\u201d<\/p>\n<p>\uc790\ub3d9\uc73c\ub85c \uc791\ub3d9\ub429\ub2c8\ub2e4.<\/p>\n<p><strong>\ucc38\uace0:<\/strong> \uc774 \uae30\ub2a5\uc740 \uc720\ub8cc Qodana for .NET linter\uc5d0\uc11c\ub9cc \uc9c0\uc6d0\ub418\uba70, Qodana for .NET Community linter\uc5d0\uc11c\ub294 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<h2 id=\"License-Audit\" class=\"wp-block-heading\"><strong>\uae30\ubcf8\uc801\uc73c\ub85c \ud65c\uc131\ud654\ub41c \ub77c\uc774\uc120\uc2a4 \uac10\uc0ac<\/strong><\/h2>\n<p>\uc54c\ub9de\uc740 \ub3c4\uad6c\uac00 \uc5c6\ub2e4\uba74 \uaddc\uc815 \uc900\uc218\ub294 \uc545\ubabd\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uc640 \uac19\uc740 \uc774\uc720\ub85c, \ub77c\uc774\uc120\uc2a4 \uac10\uc0ac \uae30\ub2a5\uc774 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc778\uae30\uac00 \ub192\uc2b5\ub2c8\ub2e4. \uc774\uc81c <strong>License Audit(\ub77c\uc774\uc120\uc2a4 \uac10\uc0ac) <\/strong>\uae30\ub2a5\uc774 \uae30\ubcf8\uc801\uc73c\ub85c \ud65c\uc131\ud654\ub429\ub2c8\ub2e4(\uc77c\ubc18\uc801\uc73c\ub85c \uc774 \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud558\ub294 \uc720\uc77c\ud55c \ub77c\uc774\uc120\uc2a4\uc778 Ultimate Plus \ub77c\uc774\uc120\uc2a4\uac00 \uc788\ub294 \uacbd\uc6b0).<\/p>\n<p>Qodana\uac00 \ud574\ub2f9 \ud504\ub85c\uc81d\ud2b8 \uc885\uc18d\uc131 \ub77c\uc774\uc120\uc2a4\uc5d0 \ub300\ud574 \ucc3e\uc740 \ubaa8\ub4e0 \uc815\ubcf4\ub294 Qodana Cloud\uc5d0\uc11c \ud574\ub2f9 \ud504\ub85c\uc81d\ud2b8\uc758 <em>License Audit<\/em> \ud0ed\uc5d0 \uc790\ub3d9\uc73c\ub85c \ud45c\uc2dc\ub418\ubbc0\ub85c, \uc774\ub97c \uc2e4\ud589\ud558\uae30 \uc704\ud574 \ubd84\uc11d\uc744 \uad6c\uc131\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub610\ud55c \uae30\uc874 <strong>\ub77c\uc774\uc120\uc2a4 \uac10\uc0ac<\/strong> \uc0ac\uc6a9\uc790\uac00 \uc804\uccb4 \ubb38\uc81c \ubaa9\ub85d \ub300\uc2e0 <strong>Qodana Cloud UI<\/strong> \ud0ed\uc5d0\uc11c \uac10\uc0ac \uc774\uc288\ub97c \ubcfc \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \uc5ec\ub7ec\ubd84\uacfc \ud300\uc774 \uc804\ubc18\uc801\uc778 \ubb38\uc81c\uc5d0\uc11c \ub77c\uc774\uc120\uc2a4 \uc774\uc288\ub97c \uacc4\uc18d \ud655\uc778\ud558\uace0 \uc2f6\ub2e4\uba74 \uc801\uc808\ud558\uac8c <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/2024.1\/license-audit.html#license-audit-running-feature\" target=\"_blank\" rel=\"noopener\">\uad6c\uc131\uc744 \uc5c5\ub370\uc774\ud2b8<\/a>\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-467585\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/04\/Untitled-6.png\" alt=\"\ucf54\ub4dc \uac80\ud1a0 \ubc0f \ucf54\ub4dc \ubcf4\uc548\uc5d0 \ub300\ud55c \ub77c\uc774\uc120\uc2a4 \uac10\uc0ac. \" width=\"2498\" height=\"1222\" \/><\/p>\n<figcaption class=\"wp-element-caption\">Qodana License Audit.<\/figcaption>\n<\/figure>\n<h2 id=\"Gitlab-code-quality\" class=\"wp-block-heading\"><strong>GitLab \ucf54\ub4dc \ud488\uc9c8 \ubc0f BitBucket \ucf54\ub4dc \uc778\uc0ac\uc774\ud2b8 \uc9c0\uc6d0(\ud480 \ub9ac\ud018\uc2a4\ud2b8 \ub370\ucf54\ub808\uc774\uc158)<\/strong><\/h2>\n<p>2024.1\ubd80\ud130 Qodana linter\ub294 BitBucket Pipelines \ubc0f GitLab CI\uc5d0 \ub300\ud55c \ud480 \ub9ac\ud018\uc2a4\ud2b8 \ub370\ucf54\ub808\uc774\uc158\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc774\uc804\uc5d0\ub294 GitHub Actions\uc5d0\ub9cc \uc774 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c Qodana\ub294 GitHub Actions, GitLab CI \ubc0f BitBucket Pipelines\uc5d0 \ub300\ud55c \ud480 \ub9ac\ud018\uc2a4\ud2b8 \ub610\ub294 \ubcd1\ud569 \uc694\uccad \uc778\ud130\ud398\uc774\uc2a4 \ub0b4\uc5d0\uc11c \ubc14\ub85c \ucf54\ub4dc \ud488\uc9c8\uc5d0 \ub300\ud55c \uc790\ub3d9\ud654\ub41c \uc778\uc0ac\uc774\ud2b8\ub97c \ud1b5\ud574 \ucf54\ub4dc \uac80\ud1a0\ub97c \uac1c\uc120\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc640 \uac19\uc740 \ud1b5\ud569 \ub355\ubd84\uc5d0, \ud480 \ub9ac\ud018\uc2a4\ud2b8 \ub610\ub294 \ubcd1\ud569 \uc694\uccad\uc5d0\uc11c \ubc14\ub85c \ubb38\uc81c \uc124\uba85 \ubc0f \uac00\ub2a5\ud55c \ud574\uacb0\ucc45 \ub610\ub294 \uad8c\uc7a5 \uc0ac\ud56d\uc744 \ud655\uc778\ud558\uace0 \uc774\uc288\uac00 \uac10\uc9c0\ub41c \ud2b9\uc815 \ucf54\ub4dc \uc904\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>\uc774 \uae30\ub2a5\uc744 \ud65c\uc131\ud654\ud558\ub294 \ubc29\ubc95:<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/support.atlassian.com\/bitbucket-cloud\/docs\/code-insights\/\" target=\"_blank\" rel=\"noopener\">BitBucket \ucf54\ub4dc \uc778\uc0ac\uc774\ud2b8<\/a>: \ucd94\uac00 \uad6c\uc131\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. Linter\ub97c 2024.1 \ubc84\uc804\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4.<\/li>\n<li><a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/testing\/code_quality.html\" target=\"_blank\" rel=\"noopener\">GitLab \ucf54\ub4dc \ud488\uc9c8<\/a>: \ucd94\uac00 \uad6c\uc131\uc774 \ud544\uc694\ud569\ub2c8\ub2e4(\ubcf4\uace0\uc11c \ud30c\uc77c \uc704\uce58 \uc9c0\uc815).<\/li>\n<\/ul>\n<p>\u00a0\u00a0\u00a0\u00a0\uc2a4\ud06c\ub9bd\ud2b8:<\/p>\n<pre class=\"EnlighterJSRAW\"> - qodana --results-dir=$CI_PROJECT_DIR\/.qodana\/results\n            --cache-dir=$CI_PROJECT_DIR\/.qodana\/cache<\/pre>\n<p>\u00a0\u00a0\uc544\ud2f0\ud329\ud2b8:<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\ubcf4\uace0\uc11c:<\/p>\n<pre class=\"EnlighterJSRAW\">     codequality: .qodana\/results\/gl-code-quality-report.json<\/pre>\n<figure class=\"wp-block-video\"><video src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/04\/064bfeae-6c61-45bb-9ec4-0865b17ffd3c.mp4\" controls=\"controls\" width=\"300\" height=\"150\"><\/video><\/figure>\n<h2 id=\"Default-linter-choice\" class=\"wp-block-heading\"><strong>qodana.yaml\uc744 \ud1b5\ud574 \uc815\uc758\ub418\uc9c0 \uc54a\uc740 \uacbd\uc6b0 \ub514\ud3f4\ud2b8 linter \uc120\ud0dd<\/strong><\/h2>\n<p>JVM \ubc0f Python \ud504\ub85c\uc81d\ud2b8\uc5d0 \ub300\ud55c \ub514\ud3f4\ud2b8 linter \uc120\ud0dd\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uae30\ub2a5\uc774 \ud48d\ubd80\ud55c \ucd5c\uace0\uae09 \ubd84\uc11d \uae30\ub2a5\uc744 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc81c\uacf5\ud558\uae30 \uc704\ud574, \uc774\uc81c Qodana\ub294 Community \ubc84\uc804\uc758 linter(JVM \ud504\ub85c\uc81d\ud2b8\uc6a9 QDJVMC \ubc0f Python \ud504\ub85c\uc81d\ud2b8\uc6a9 QDPYC) \ub300\uc2e0 Ultimate \ubc84\uc804\uc758 linter(\uac01\uac01 QDJVM \ubc0f QDPY)\ub97c \uae30\ubcf8\uc801\uc73c\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc640 \uac19\uc740 \ubcc0\uacbd\uc5d0 \ub530\ub77c, qodana.yaml \uad6c\uc131\uc774 \ud2b9\uc815 linter \ubc84\uc804\uc744 \uc9c0\uc815\ud558\uc9c0 \uc54a\uace0 Qodana Cloud \ud1a0\ud070\uc774 \uc81c\uacf5\ub418\uc9c0 \uc54a\uc740 \uacbd\uc6b0, Ultimate \ubc84\uc804\uc774 \uc790\ub3d9\uc73c\ub85c \uc0ac\uc6a9\ub418\ubbc0\ub85c Qodana\uc758 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Community \ubc84\uc804\uc744 \uc120\ud638\ud558\ub294 \uacbd\uc6b0 Qodana 2024.1\ub85c \uc5c5\uadf8\ub808\uc774\ub4dc\ud55c \ud6c4 \uc0ac\uc6a9 \ubc84\uc804\uc758 \ubcc0\uacbd\uc744 \ubc29\uc9c0\ud558\ub824\uba74 qodana.yaml \ud30c\uc77c\uc5d0\uc11c \uc774\ub97c \uba85\uc2dc\uc801\uc73c\ub85c \uc815\uc758\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<h2 id=\"Improved-UX\" class=\"wp-block-heading\"><strong>IDE \ud50c\ub7ec\uadf8\uc778\uc6a9 UX \uac1c\uc120<\/strong><\/h2>\n<ol>\n<li>Qodana \uac15\uc870 \ud45c\uc2dc\uac00 \ub354 \uc774\uc0c1 IDE \uac15\uc870 \ud45c\uc2dc\uc640 \uc911\ubcf5\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. IDE\uac00 \uc774\ubbf8 Qodana \ubcf4\uace0\uc11c\uc758 \ubb38\uc81c\ub97c \uac15\uc870 \ud45c\uc2dc\ud55c \uacbd\uc6b0 Qodana \ud50c\ub7ec\uadf8\uc778\uc740 \uc774 \ubb38\uc81c\ub97c \uac15\uc870 \ud45c\uc2dc\ud558\ub824\uace0 \uc2dc\ub3c4\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/li>\n<li>Qodana \ubcf4\uace0\uc11c\uc5d0 \ub098\uc5f4\ub41c \ubb38\uc81c \uc911 \ud558\ub098\ub97c \uc218\uc815\ud558\uac70\ub098 \uad00\ub828 \ucf54\ub4dc \uc870\uac01\uc744 \uc870\uc815\ud558\uba74 Qodana \ud50c\ub7ec\uadf8\uc778\uc774 \ubcf4\uace0\uc11c\uc5d0\uc11c \ubb38\uc81c \uc0c1\ud0dc\ub97c <em>Fixed(\uc218\uc815\ub428)<\/em>(\uc218\uc815\ub41c \uacbd\uc6b0) \ub610\ub294 <em>Not found(\ucc3e\uc744 \uc218 \uc5c6\uc74c)<\/em>(\uad00\ub828 \ucf54\ub4dc \uc870\uac01\uc774 \uc81c\uac70\ub41c \uacbd\uc6b0)\ub85c \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4.\n<p>\uc774\ub7ec\ud55c \ubc29\uc2dd\uc73c\ub85c, \ubcf4\uace0\uc11c\uc5d0\uc11c \uc5b4\ub5a4 \ubb38\uc81c\uac00 \ud574\uacb0\ub418\uc5c8\ub294\uc9c0 \ubc14\ub85c \ud655\uc778\ud558\uace0 \ub098\uba38\uc9c0 \uc791\uc5c5\uc744 \uacc4\uc18d \uc9c4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"wp-block-video\"><video src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/04\/qodana_fixed_upd_dark.mov\" controls=\"controls\" width=\"300\" height=\"150\"><\/video><\/figure>\n<h2 class=\"wp-block-heading\"><strong>\ubb38\uc81c \uc2ec\uac01\ub3c4\uc5d0 \ub530\ub978 \ud488\uc9c8 \uac8c\uc774\ud2b8 \uad6c\uc131<\/strong><\/h2>\n<p>\ub0ae\uc740 \uc2ec\uac01\ub3c4 \uc774\uc288\ub85c \uc778\ud55c \ube4c\ub4dc \uc2e4\ud328\ub97c \uc6d0\ud558\uc9c0\ub294 \uc54a\uc73c\uc2e4 \uac81\ub2c8\ub2e4. \ub2e4\ud589\ud788 \uc774\uc81c \ube4c\ub4dc \uc2e4\ud328\ub97c \uc815\uad50\ud558\uac8c \uc870\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/qodana-dotnet-community.html\" target=\"_blank\" rel=\"noopener\">Qodana Community for .NET<\/a>\uc744 \uc81c\uc678\ud55c \ubaa8\ub4e0 <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/linters.html\" target=\"_blank\" rel=\"noopener\">linter<\/a>\uc5d0\uc11c\ub294 \uac01\uac01\uc758 <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/faq.html#faq-severities\" target=\"_blank\" rel=\"noopener\">\ubb38\uc81c \uc2ec\uac01\ub3c4<\/a>\uc5d0 \ub300\ud574 \ubcc4\ub3c4\uc758 \ud488\uc9c8 \uac8c\uc774\ud2b8\ub97c \uad6c\uc131\ud560 \uc218 \uc788\uc73c\uba70, \ud55c \uac00\uc9c0 \uc124\uc815 \uc81c\ud55c\ub9cc \ucd08\uacfc\ud574\ub3c4 <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/quality-gate.html#quality-gate-project-threshold\" target=\"_blank\" rel=\"noopener\">\ucd1d \ubb38\uc81c \uc218<\/a>\ub97c \ud3ec\ud568\ud55c \ube4c\ub4dc \uc2e4\ud328\uac00 \ubc1c\uc0dd\ud558\uac8c \ub429\ub2c8\ub2e4. <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/qodana-yaml.html\" target=\"_blank\" rel=\"noopener\">qodana.yaml<\/a> \uc2ec\uac01\ub3c4 \uad6c\uc131\uc758 \uc608\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\">failureConditions:\n  severityThresholds:\n    any:  # Total problems\n    critical:  # Critical and other severities\n    high: \n    moderate: \n    low: \n    info: <\/pre>\n<h2 id=\"Custom-name\" class=\"wp-block-heading\"><strong>\uc0ac\uc6a9\uc790 \uc9c0\uc815 <\/strong><strong>qodana.yaml<\/strong><strong> \ud30c\uc77c\uc758 \ub9e4\uac1c\ubcc0\uc218<\/strong><\/h2>\n<p>2024.1 \ubc84\uc804\uc740 \ub3d9\uc77c\ud55c \uc800\uc7a5\uc18c\uc5d0\uc11c \ub2e4\uc591\ud55c \uad6c\uc131\uc73c\ub85c \uc5ec\ub7ec Qodana \ube4c\ub4dc\ub97c \uc2e4\ud589\ud558\ub294 \ud504\ub85c\uc138\uc2a4\ub97c \uac04\uc18c\ud654\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc804 \ubc84\uc804\uc5d0\uc11c Qodana linter\ub294 \uad6c\uc131\uc744 \uc720\uc9c0\ud558\uace0 linter\uc758 \uc791\ub3d9 \ubc29\uc2dd(\uc2e4\ud589\ub418\ub294 \uac80\uc0ac \uc138\ud2b8, \ubd84\uc11d\ud574\uc57c \ud558\ub294 \ud3f4\ub354 \ubc0f \ud30c\uc77c \ub4f1 \ud3ec\ud568)\uc744 \uc815\uc758\ud558\ub294 qodana.yaml \ud30c\uc77c\uc744 \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub530\ub77c\uc11c \ub2e4\ub978 \uad6c\uc131\uc744 \uc0ac\uc6a9\ud558\uc5ec linter\ub85c CI \uc791\uc5c5\uc744 \uc2e4\ud589\ud558\ub824\uba74 qodana.yaml \ud30c\uc77c\uc744 \uad50\uccb4\ud574\uc57c \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub610\ud55c, \uc608\ub97c \ub4e4\uc5b4 JavaScript, PHP \ubc0f Python\uc774 \ud3ec\ud568\ub41c \ubaa8\ub178\ub808\ud3ec\uac00 \uc788\uace0 linter\ubcc4\ub85c \uac01\uac01 \uc138 \uac00\uc9c0 \uc791\uc5c5\uc744 \uc2e4\ud589\ud55c \uacbd\uc6b0, \uc11c\ub85c \ub2e4\ub978 qodana.yaml \ud30c\uc77c\uc744 \uc0ac\uc6a9\ud558\uace0 \uc2f6\uc5b4\ub3c4 \uc774\uc804\uc5d0\ub294 \uadf8\ub807\uac8c \ud560 \uc218 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Qodana 2024.1\ubd80\ud130\ub294 \uc5b4\ub5a0\ud55c \ud30c\uc77c \uc774\ub984\uc774\ub4e0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc73c\uba70 \uc774\ub97c \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud558\uba74 \ub429\ub2c8\ub2e4. \uc774\uc81c \ubaa8\ub4e0 linter\ub294 \uc5b4\ub5a0\ud55c \ud30c\uc77c\uc774\ub4e0 \uad6c\uc131\uc73c\ub85c \uc804\ub2ec\ud560 \uc218 \uc788\ub294 <code>config<\/code>\ub77c\ub294 \uc120\ud0dd\uc801 \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p><strong>\uc0ac\uc6a9 \uc608\uc2dc<\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\">#qodana-cli\nqodana scan --config custom.qodana.yaml\n\n#qodana docker\ndocker run \\\n  -v :\/data\/project \\\n  -v :\/data\/results \\\n  jetbrains\/qodana-jvm:2024.1 \\\n  --config .qodana\/license-check.qodana.yaml<\/pre>\n<p>\uc774\ub294 \ud604\uc7ac \uac00\uc7a5 \uc911\uc694\ud55c \ub0b4\uc6a9 \uc911 \uc77c\ubd80\uc77c \ubfd0\uc774\uba70, \ub354 \ub9ce\uc740 \uae30\ub2a5\uc774 \uace7 \uc81c\uacf5\ub420 \uc608\uc815\uc785\ub2c8\ub2e4. \ub204\ub77d\ub418\uc5c8\ub2e4\uace0 \uc0dd\uac01\ub418\ub294 \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uc744 \uc6d0\ud558\uc2dc\uba74 <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/QD\" target=\"_blank\" rel=\"noopener\">Qodana YouTrack \ubcf4\ub4dc<\/a>\uc5d0\uc11c \uc54c\ub824 \uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \uc804\uccb4 <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/new-in-2024-1.html\" target=\"_blank\" rel=\"noopener\">Qodana 2024.1 \ub9b4\ub9ac\uc2a4 \ubb38\uc11c<\/a>\ub97c \ucc38\uc870\ud574 \uc8fc\uc138\uc694.<\/p>\n<h3 id=\"Book-demo\" class=\"wp-block-heading\"><strong>\uac00\uc7a5 \uba3c\uc800 \ucd5c\uc2e0 \uc18c\uc2dd\uc744 \ud655\uc778\ud558\uc138\uc694<\/strong><\/h3>\n<p><a href=\"https:\/\/twitter.com\/Qodana\" target=\"_blank\" rel=\"noopener\">Twitter<\/a> \ubc0f <a href=\"https:\/\/www.linkedin.com\/showcase\/qodana\" target=\"_blank\" rel=\"noopener\">LinkedIn<\/a>\uc5d0\uc11c Qodana\ub97c \ud314\ub85c\uc6b0\ud558\uac70\ub098 <a href=\"https:\/\/blog.jetbrains.com\/qodana\/\">Qodana \ube14\ub85c\uadf8<\/a>\uc5d0\uc11c \uc81c\ud488\uc758 \uc0c8\ub85c\uc6b4 \uc18c\uc2dd\uc744 \uac00\uc7a5 \uba3c\uc800 \ubcf4\uace0 \ud574\ub2f9 \uc9c0\uc5ed\uc774\ub098 \uc628\ub77c\uc778 \uc0c1\uc5d0\uc11c\uc758 \ud2b9\ubcc4 \ud589\uc0ac\ub97c \ud655\uc778\ud558\uc138\uc694.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Qodana \ub370\ubaa8 \uc608\uc57d\" href=\"https:\/\/www.jetbrains.com\/qodana\/request-a-demo\/\" target=\"_blank\" rel=\"noopener noreferrer\"><i class=\"download-icon\"><\/i>Qodana \ub370\ubaa8 \uc608\uc57d\ud558\uae30<\/a><\/p>\n<p><em>\uac8c\uc2dc\ubb3c \uc6d0\ubb38 \uc791\uc131\uc790<\/em><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":964,"featured_media":485948,"comment_status":"closed","ping_status":"closed","template":"","categories":[6711,4089,947,7119,6815,4113,1065,907],"tags":[228,2547,8472,8473],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/qodana\/485946"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/qodana"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/qodana"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/964"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/comments?post=485946"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/qodana\/485946\/revisions"}],"predecessor-version":[{"id":485980,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/qodana\/485946\/revisions\/485980"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/485948"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=485946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=485946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=485946"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=485946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}