{"id":260,"date":"2020-03-22T15:46:36","date_gmt":"2020-03-22T06:46:36","guid":{"rendered":"http:\/\/www.skyer9.pe.kr\/wordpress\/?p=260"},"modified":"2020-03-22T18:07:07","modified_gmt":"2020-03-22T09:07:07","slug":"%ed%8c%8c%eb%9d%bc%eb%af%b8%ed%84%b0-%ec%b2%b4%ed%81%ac%ed%95%98%ea%b8%b0hibernate-validator","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=260","title":{"rendered":"\ud30c\ub77c\ubbf8\ud130 \uccb4\ud06c\ud558\uae30(hibernate validator)"},"content":{"rendered":"<h1>\ud30c\ub77c\ubbf8\ud130 \uccb4\ud06c\ud558\uae30(hibernate validator)<\/h1>\n<h2>\uac1c\ubc1c\ud658\uacbd<\/h2>\n<ul>\n<li>Spring Boot 2.1.x<\/li>\n<li>Gradle 4.10.2<\/li>\n<\/ul>\n<h2>build.gradle \uc218\uc815<\/h2>\n<p>build.gradle<\/p>\n<pre><code class=\"language-configuration\">......\ndependencies {\n    \/\/ ......\n    compile(&#039;org.hibernate.validator:hibernate-validator&#039;)\n    \/\/ ......\n}\n......<\/code><\/pre>\n<h2>DTO \ud30c\ub77c\ubbf8\ud130 \uccb4\ud06c\ud558\uae30<\/h2>\n<pre><code class=\"language-java\">import javax.validation.constraints.NotEmpty;\n\n@Getter\n@NoArgsConstructor\npublic class PostsSaveRequestDto {\n\n    @Range(min=1, max=20)\n    @NotEmpty(message = &quot;\uc81c\ubaa9\uc740 \ud544\uc218 \uc785\ub2c8\ub2e4&quot;)\n    private String title;\n    @NotEmpty(message = &quot;\ub0b4\uc6a9\uc740 \ud544\uc218 \uc785\ub2c8\ub2e4&quot;)\n    private String content;\n    @NotEmpty(message = &quot;\uc791\uc131\uc790\ub294 \ud544\uc218 \uc785\ub2c8\ub2e4&quot;)\n    private String author;\n\n    @NotEmpty(message = &quot;\ube44\ubc00\ubc88\ud638\ub294 \ud544\uc218 \uc785\ub2c8\ub2e4&quot;)\n    @Pattern(regexp = &quot;((?=.*\\\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})&quot;, message = &quot;\ube44\ubc00 \ubc88\ud638\ub294 6~20\uc790\ub9ac\ub85c \uc22b\uc790\uc640 \ud2b9\uc218 \ubb38\uc790\uac00 \ud3ec\ud568\ub41c \uc601\ubb38 \ub300\uc18c\ubb38\uc790\ub85c \uc785\ub825\ud574 \uc8fc\uc138\uc694&quot;)\n    private String password;\n\n    \/\/ ......\n}<\/code><\/pre>\n<p><code>@NotEmpty<\/code> \uc5b4\ub178\ud14c\uc774\uc158\uc744 \ucd94\uac00\ud568\uc73c\ub85c \uacf5\ubc31\uc774 \uc785\ub825\ub418\ub294 \uac83\uc744 \ubc29\uc9c0\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc815\uaddc\uc2dd\uc744 \uc774\uc6a9\ud574 \ubcf4\ub2e4 \ubcf5\uc7a1\ud55c \uccb4\ud06c\ub97c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-java\">import javax.validation.Valid;\n\n@RequiredArgsConstructor\n@RestController\npublic class PostsApiController {\n\n    private final PostsService postsService;\n\n    @PostMapping(&quot;\/api\/v1\/posts&quot;)\n    public Long save(@Valid @RequestBody PostsSaveRequestDto postsSaveRequestDto) {\n        return postsService.save(postsSaveRequestDto);\n    }\n\n    \/\/ ......\n}<\/code><\/pre>\n<p><code>@Valid<\/code> \ud30c\ub77c\ubbf8\ud130\ub97c \ucd94\uac00\ud558\uc5ec \ud30c\ub77c\ubbf8\ud130 \uccb4\ud06c\ub97c \uc2dc\uc791\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-javascript\">        $.ajax({\n            type : &#039;POST&#039;,\n            url : &#039;\/api\/v1\/posts&#039;,\n            dataType : &#039;json&#039;,\n            contentType : &#039;application\/json; charset=utf-8&#039;,\n            data : JSON.stringify(data)\n        }).done(function() {\n            alert(&#039;\uae00\uc774 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.&#039;);\n            window.location.href = &#039;\/&#039;;\n        }).fail(function(error) {\n            \/\/alert(JSON.stringify(error));\n            if (error.status == 400) {\n                alert(error.responseJSON.errors[0].defaultMessage);\n            } else {\n                alert(&#039;\uc54c \uc218 \uc5c6\ub294 \uc624\ub958\uc785\ub2c8\ub2e4.&#039; + error.status);\n            }\n        });<\/code><\/pre>\n<p>RestController \uc774\uae30\uc5d0 json \uc73c\ub85c \uc624\ub958\uba54\uc2dc\uc9c0\uac00 \ubc18\ud658\ub429\ub2c8\ub2e4.<\/p>\n<h2>@PathVariable \uccb4\ud06c\ud558\uae30<\/h2>\n<p><code>@PathVariable<\/code> \uc5d0 \ub300\ud574\uc11c\ub294 <code>@Valid<\/code> \uac00 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub300\uc2e0, \uc544\ub798\uc640 \uac19\uc774 \uc815\uaddc\uc2dd\uc744 \uc774\uc6a9\ud574 \ud30c\ub77c\ubbf8\ud130 \uccb4\ud06c\ub97c \ud560 \uc218 \uc788\uace0, \ud5c8\uc6a9\ub418\uc9c0 \uc54a\ub294 \ub370\uc774\ud0c0\uac00 \uc804\ub2ec\ub418\uc5c8\uc744 \ub54c, 404 \uc5d0\ub7ec\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-java\">    @GetMapping(&quot;\/posts\/update\/{id:[0-9]+}&quot;)\n    public String postsUpdate(@PathVariable Long id, Model model) {\n        PostsResponseDto dto = postsService.findById(id);\n        model.addAttribute(&quot;post&quot;, dto);\n\n        return &quot;posts-update&quot;;\n    }<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>hibernate validator \ub97c \uc774\uc6a9\ud574\uc11c \ud30c\ub77c\ubbf8\ud130 \uccb4\ud06c\ub97c \ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-260","post","type-post","status-publish","format-standard","hentry","category-spring-boot-2-1"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/260","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=260"}],"version-history":[{"count":5,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/260\/revisions"}],"predecessor-version":[{"id":267,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/260\/revisions\/267"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}