{"id":1520,"date":"2020-12-14T19:32:18","date_gmt":"2020-12-14T10:32:18","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=1520"},"modified":"2022-06-09T15:21:47","modified_gmt":"2022-06-09T06:21:47","slug":"jpa-%ec%97%90%ec%84%9c-%ed%94%84%eb%a1%9c%ec%8b%9c%ec%a0%80procedure-%ed%98%b8%ec%b6%9c","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=1520","title":{"rendered":"JPA \uc5d0\uc11c \ud504\ub85c\uc2dc\uc800(procedure) \ud638\ucd9c"},"content":{"rendered":"<h1>JPA \uc5d0\uc11c \ud504\ub85c\uc2dc\uc800(procedure) \ud638\ucd9c<\/h1>\n<p><a href=\"https:\/\/www.baeldung.com\/spring-data-jpa-stored-procedures\">\ucc38\uc870<\/a><\/p>\n<h2>\ud504\ub85c\uc2dc\uc800 \uc0dd\uc131<\/h2>\n<pre><code class=\"language-sql\">DROP PROCEDURE IF EXISTS getUserList;\nDELIMITER $$\nCREATE procedure getUserList(IN _pageNo INT, IN _pageSize INT, IN _userId VARCHAR(32), IN _userName VARCHAR(64), IN _email VARCHAR(64), IN _useyn VARCHAR(1), OUT RESULT INT)\nBEGIN\n    DECLARE _OFFSET INT;\n\n    SET _OFFSET = _pageNo * _pageSize;\n\n    SELECT COUNT(*)\n    INTO RESULT\n    FROM\n        db_users.tbl_users u\n    WHERE\n        1 = 1\n        AND (_userId = &#039;&#039; OR u.user_id = _userId)\n        AND (_userName = &#039;&#039; OR u.user_name = _userName)\n        AND (_email = &#039;&#039; OR u.email = _email)\n        AND (_useyn = &#039;&#039; OR u.useyn = _useyn);\n\n    SELECT *\n    FROM\n        db_users.tbl_users u\n    WHERE\n        1 = 1\n        AND (_userId = &#039;&#039; OR u.user_id = _userId)\n        AND (_userName = &#039;&#039; OR u.user_name = _userName)\n        AND (_email = &#039;&#039; OR u.email = _email)\n        AND (_useyn = &#039;&#039; OR u.useyn = _useyn)\n    ORDER BY\n        u.user_key DESC\n    LIMIT _OFFSET, _pageSize;\nEND $$\nDELIMITER ;<\/code><\/pre>\n<h2>\uc5d4\ud130\ud2f0 \uc218\uc815<\/h2>\n<p><code>NamedStoredProcedureQuery<\/code> \uc5b4\ub178\ud14c\uc774\uc158\uc744 \ucd94\uac00\ud574 \uc900\ub2e4. <code>resultClasses<\/code> \uc5d0 \ub9ac\ud134\ub418\ub294 \uac12\uc744 \uc800\uc7a5\ud560 \ud074\ub798\uc2a4\ub97c \uc9c0\uc815\ud574 \uc900\ub2e4.<\/p>\n<pre><code class=\"language-java\">@NamedStoredProcedureQuery(\n        name = Users.NamedQuery_GetUserList,\n        procedureName = &quot;db_users.getUserList&quot;,\n        resultClasses = Users.class,\n        parameters = {\n                @StoredProcedureParameter(name = &quot;_pageNo&quot;, type = Integer.class, mode = ParameterMode.IN),\n                @StoredProcedureParameter(name = &quot;_pageSize&quot;, type = Integer.class, mode = ParameterMode.IN),\n                @StoredProcedureParameter(name = &quot;_userId&quot;, type = String.class, mode = ParameterMode.IN),\n                @StoredProcedureParameter(name = &quot;_userName&quot;, type = String.class, mode = ParameterMode.IN),\n                @StoredProcedureParameter(name = &quot;_email&quot;, type = String.class, mode = ParameterMode.IN),\n                @StoredProcedureParameter(name = &quot;_useyn&quot;, type = String.class, mode = ParameterMode.IN),\n                @StoredProcedureParameter(name = &quot;RESULT&quot;, type = Integer.class, mode = ParameterMode.OUT),\n        }\n)\n@Getter\n@NoArgsConstructor\n@Entity\n@Table(name = &quot;tbl_users&quot;, catalog = &quot;db_users&quot;)\npublic class Users extends BaseTimeEntity {\n\n    public static final String NamedQuery_GetUserList = &quot;getUserList&quot;;\n\n    \/\/ ......\n}<\/code><\/pre>\n<h2>\uc11c\ube44\uc2a4 \ucd94\uac00<\/h2>\n<pre><code class=\"language-java\">public class UsersService {\n\n    \/\/ ......\n\n    @PersistenceContext\n    private final EntityManager entityManager;\n\n    @Transactional(readOnly = true)\n    @Cacheable(value=&quot;Users&quot;)\n    public ApiResponseWithPaging search(Pageable pageable, UsersRequestDto usersRequestDto) {\n        StoredProcedureQuery spq =\n                entityManager.createNamedStoredProcedureQuery(Users.NamedQuery_GetUserList);\n        spq.setParameter(&quot;_pageNo&quot;, pageable.getPageNumber());\n        spq.setParameter(&quot;_pageSize&quot;, pageable.getPageSize());\n        spq.setParameter(&quot;_userId&quot;, usersRequestDto.getUserId());\n        spq.setParameter(&quot;_userName&quot;, usersRequestDto.getUserName());\n        spq.setParameter(&quot;_email&quot;, usersRequestDto.getEmail());\n        spq.setParameter(&quot;_useyn&quot;, usersRequestDto.getUseyn());\n        spq.execute();\n\n        @SuppressWarnings(&quot;unchecked&quot;)\n        List&lt;Object&gt; results = toDto(spq.getResultList());\n        int totalCount = (int) spq.getOutputParameterValue(&quot;RESULT&quot;);\n\n        return new ApiResponseWithPaging(ResponseCode.OK, results, pageable, totalCount);\n    }\n    \/\/ ......\n}<\/code><\/pre>\n<h2>repository \uc5d0 \ucd94\uac00<\/h2>\n<p>\uc544\ub798\uc758 \ubc29\uc2dd\uc73c\ub85c repository \uc5d0\uc11c \ud504\ub85c\uc2dc\uc800\ub97c \ud638\ucd9c\ud560 \uc218 \uc788\ub2e4.<br \/>\nOUTPUT \uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4.<br \/>\n\uac80\uc0c9\uacb0\uacfc\uc5d0 totalCount \ub4f1 OUTPUT \ud574\uc57c \ud560 \ub370\uc774\ud0c0\ub97c \ucd94\uac00\ud558\uba74,<br \/>\n\ub370\uc774\ud0c0\ub97c \ubc1b\uc544 \uc62c \uc218 \uc788\ub2e4.<\/p>\n<pre><code class=\"language-sql\">SELECT *, @totalCount as totalCount\nFROM \ud14c\uc774\ube14\uba85<\/code><\/pre>\n<p>JDBC URL \uc5d0 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\ub97c master \ub85c \uc124\uc815\ud55c \uacbd\uc6b0,<br \/>\n\ubaa8\ub4e0 \ub17c\ub9ac \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc758 \ud504\ub85c\uc2dc\uc800\ub97c \ud638\ucda0\ud560 \uc218 \uc788\ub2e4.<\/p>\n<pre><code class=\"language-java\">@Repository\npublic interface OrderMasterRepository extends JpaRepository&lt;OrderMaster, Integer&gt; {\n\n    Optional&lt;OrderMaster&gt; findByOrderserial(String orderserial);\n\n    \/\/ \ub300\uad04\ud638 \uc55e\ub4a4\uc5d0 \uacf5\ubc31\ubb38\uc790\uac00 \uc788\uc5b4\uc57c \ud55c\ub2e4.(MySQL)\n    @Query(value = &quot;{ CALL db_order.dbo.usp_Ten_Order_GetOrderMasterListJpa(:pageNo, :pageSize, :userid, :orderserial) }&quot;, nativeQuery = true)\n    List&lt;OrderMaster&gt; GetOrderMasterList(\n            @Param(&quot;pageNo&quot;) Integer pageNo,\n            @Param(&quot;pageSize&quot;) Integer pageSize,\n            @Param(&quot;userid&quot;) String userid,\n            @Param(&quot;orderserial&quot;) String orderserial);\n}<\/code><\/pre>\n<h2>repository \ub9ac\ud134\uac12\uc774 Entity \uac00 \uc544\ub2d0 \uacbd\uc6b0<\/h2>\n<p>\uacb0\uacfc\uac12\uc774 \uc5d4\ud130\ud2f0\uac00 \uc544\ub2cc \uacbd\uc6b0,<br \/>\n\uc544\ub798\ucc98\ub7fc interface \ub97c \ucd94\uac00\ud574 \uc900\ub2e4.<\/p>\n<pre><code class=\"language-java\">public interface OrderMasterRepository extends JpaRepository&lt;OrderMaster, Integer&gt; {\n\n    \/\/ MS-SQL\n    @Query(value = &quot;exec [db_order].[dbo].[usp_Refine_Order]&quot;, nativeQuery = true)\n    ResponseOnly RefineOrders();\n\n    public static interface ResponseOnly {\n        String getResult();\n        String getMessage();\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>JPA \uc5d0\uc11c \ud504\ub85c\uc2dc\uc800(procedure) \ud638\ucd9c \ucc38\uc870 \ud504\ub85c\uc2dc\uc800 \uc0dd\uc131 DROP PROCEDURE IF EXISTS getUserList; DELIMITER $$ CREATE procedure getUserList(IN _pageNo INT, IN _pageSize INT, IN _userId VARCHAR(32), IN _userName VARCHAR(64), IN _email VARCHAR(64), IN _useyn VARCHAR(1), OUT RESULT INT) BEGIN DECLARE _OFFSET INT; SET _OFFSET = _pageNo * _pageSize; SELECT COUNT(*) INTO RESULT FROM db_users.tbl_users u WHERE\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=1520\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[],"class_list":["post-1520","post","type-post","status-publish","format-standard","hentry","category-spring-boot-2-5"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1520","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=1520"}],"version-history":[{"count":6,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1520\/revisions"}],"predecessor-version":[{"id":5585,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1520\/revisions\/5585"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}