{"componentChunkName":"component---src-templates-post-template-jsx","path":"/history/posts/2020-11-10--003","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"a1cc8569-124b-5402-8a20-e90a424970d5","html":"<h2>DTO Class Code Convention</h2>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/cc6f89aaf1252ee4350cc615b916ff3c/c7dcc/003-01.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 641px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 120.41666666666669%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAYAAAD6S912AAAACXBIWXMAABJ0AAASdAHeZh94AAADBElEQVQ4y6VVW3akOgzMbqax8dsGGmiS3Ox/TTUlQb/SmZmP+6FjMLgolUriLdcRMTdczg7/LQbzYLEw5qVge9+wrJ9IKSOmhFwqSm2IkdehIIYEay2MMbpKvOU6IJaGqXjMxaJGizFbDONA0BVtmOC9R9/3cM5ryHXfO11/BEwEdDyUouFhi64zOJ0kOsYv3p/0kKzd6bSvR1zBrutbaTtgyh5fXx2W2aDWPUol4zailkE/WGrl/aBp19TQ8ojgw88MQ/B4HwxGpr00i5YMpmwwEGQ6rxjPMzUszCAouKTuXdC0nwHJQABt73FuBu8szHruKbhHcI6Hdu1Ex2tq9+heU74ytBS5JIttJMvqofu5kDlZWNGve2LyGE8My42hQysGH4sAOtokI8RIdqymHLoBCDP7I/A3QE+9DD5XatccwRLZRabqlKGAaJo30J/ZPqdMD67Ucci85n5myo5FEGAxdyC4gP2J3QFIhgw56Phy6C1cfzAkQPQ9AXcTm4OZ6KmaHmv3UCitcm4TnLBwBht1nGrGedmwzhO+thGXeaAcZ6SQ1Taib8pZW1CY57B/+LlTKL6knfhAgPVF7stz76OCaf8SRI1dm7pA+zs6PvsG6GkP8Vun4lv12C01SVPu1Xf3/e4h5e6Wct2rLMb13hD076L/K262icnjY+swDjtg1x1Mu3tHXAuixXhgbOW9o2AKKPNQAT86zMdwiLRQZOekFHmdVWMxuhZDihILtas6EwXMmgeGOhNjwOdZusTiMlrORw7besI0NiyXT1b9otNG/cjCCFD0SatunsfXCAnxYeEsnMhsSEHHVqMUhZWVAdGT4aMHdR6a1/4+jD2gJ6DvaReCemdp6n3KSJdoP/dGV72WVaaPsYcL7m54MfbKeThRu7kGDMPIdN85Dxcs40ijb5yLC6Z55b9mUw/Kv8bzrA4SdtOLsbMYmyxlT6a5TGjtZV8Y9+7Yf1o0eGsK3PhxT4yHiR3Ui2IVNWn3bGxzWETjavZvBj+MvQPKl1VY8/+M/RsOv+WNoLD9hwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 01\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/cc6f89aaf1252ee4350cc615b916ff3c/c7dcc/003-01.png\"\n        srcset=\"/devHistoryBlog/static/cc6f89aaf1252ee4350cc615b916ff3c/8ff5a/003-01.png 240w,\n/devHistoryBlog/static/cc6f89aaf1252ee4350cc615b916ff3c/e85cb/003-01.png 480w,\n/devHistoryBlog/static/cc6f89aaf1252ee4350cc615b916ff3c/c7dcc/003-01.png 641w\"\n        sizes=\"(max-width: 641px) 100vw, 641px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h3>#1.클래스 정의 방법</h3>\n<ul>\n<li>도메인 또는 리소스 별 DTO 클래스 생성 후(CouponDto), 각 API(Controller 에 정의된 메소드: CreateReq, CreateRes) 에 해당하는 DTO를 InnerClass 로 정의</li>\n<li>CouponDto의 객체 생성을 하지 않으므로 InnerClass는 static 키워드를 명시한다.</li>\n</ul>\n<br>\n<h3>#2.생성자의 접근자는 최소한으로</h3>\n<ul>\n<li>객체 생성이 불필요한 클래스의 기본 생성자 접근자는 Private로 지정<br>\n—> 개별 DTO는 InnerClass로 정의하기 때문에 객체 생성이 불필요하다.  </li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/074fcf83cf622a547fa49db7e0942133/85ff8/003-02.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 467px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 14.166666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABJ0AAASdAHeZh94AAAAlklEQVQI10XMURLCIAwE0N7GgVBSKgVC0Dp6/zOtKR/68SY7SWaX83To3UPVo4lppt5QarCsdnuhFgFvCdIHSuv2p5YV5RBIHujHgJQBIsLyEbIF2YGg2aNkRusV+lA8z7cVC1LaEUIA84bIPLFZ14g48TQLKxO2QEgrIUcPtof9fiAfFXvOiDHOMu89vHM/7prXbvrnL36yXrDoT8t/AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 02\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/074fcf83cf622a547fa49db7e0942133/85ff8/003-02.png\"\n        srcset=\"/devHistoryBlog/static/074fcf83cf622a547fa49db7e0942133/8ff5a/003-02.png 240w,\n/devHistoryBlog/static/074fcf83cf622a547fa49db7e0942133/85ff8/003-02.png 467w\"\n        sizes=\"(max-width: 467px) 100vw, 467px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<br>\n<h3>#3. Request Dto 클래스</h3>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/8da319325ee3518a439824e6331866c8/6114d/003-03.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 623px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 64.16666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABJ0AAASdAHeZh94AAABpUlEQVQ4y42T6XKEIBCE8zjKDYKo7FF5/4fq9OCu2SNJ5UcXJehH98z4EfMMHyJaG7E1Be8VtFEwljKGslCKe1pzz8JSfTUOzjrum+Nc9JFuwCth16axzgqtamyVF1RedPrEsjTMdUGZK3KZMU0FORaUqXboG9D5iBoVTgQtRaMmhaBHJMc1JmSCply6M/n4VQK6rx1oXYDnx6dVYZs1XUT4OHHfw/ClcRgwjuOTk0e9ORRgCgqfjHxeFGLk85QRQoBz9hnwA/RHYBCHdNcYOedMl5VAOnX2Kdor4FUHMNLh5czIjC2upLvWSpef3Sn1O1TOCCy9Vo6jMgdNKXYxoy4bmxV293SaUuI75gD+7pDRegO0QvaaEQ1CmjiPHiWy45Ole4eRjqQxXdKk3qhdw6j6ubg+gIbAlYCWDN2tWNsZ18uGy2nByhmcpwXRJ0ReJvXt88h0krBEi+Ttw2Az2r1mkX+I47zJ/AVeJDPqjO8wL+PFzgtUtL+TCGMqJjuAUiPnOPEyczfre7wBqs/fLep9HYfv+F0PkSN/Iyn+3jX1Z8H/oy+PL4/6+ib2eAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 03\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/8da319325ee3518a439824e6331866c8/6114d/003-03.png\"\n        srcset=\"/devHistoryBlog/static/8da319325ee3518a439824e6331866c8/8ff5a/003-03.png 240w,\n/devHistoryBlog/static/8da319325ee3518a439824e6331866c8/e85cb/003-03.png 480w,\n/devHistoryBlog/static/8da319325ee3518a439824e6331866c8/6114d/003-03.png 623w\"\n        sizes=\"(max-width: 623px) 100vw, 623px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h4>##3-1. @NoArgsConstructor 의 접근자는 Private로 한다.</h4>\n<ul>\n<li>@RequestBody 를 사용하면 Spring 내부에서 Jackson 라이브러리를 사용하여 Deserialize (JSON 데이터와 Request 객체 사이의 변환) 을 한다.</li>\n<li>이때 기본 전략으로 Default Constructor + Reflection 을 사용한다. 이때 최소 접근자는 Private 이다.\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/0edbaa6e53d8d82ac1948d8cbd2130d5/a0209/003-04.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 725px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 11.249999999999998%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAcUlEQVQI1zWMWw6DMAwEuU7tChIS8jAh6k/vf6SpQerHaHal1S7pKOy5EPeMdeFzCXMIw8S7Yu3lrsz5pbaT7Ptmg9rN7T1VWvKcjXVdWe6zmxATNSjzUEp0ZyVvSvdc45tSO3ZeD1sIqCoi+viPiPADV15AE4ryECEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 04\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/0edbaa6e53d8d82ac1948d8cbd2130d5/a0209/003-04.png\"\n        srcset=\"/devHistoryBlog/static/0edbaa6e53d8d82ac1948d8cbd2130d5/8ff5a/003-04.png 240w,\n/devHistoryBlog/static/0edbaa6e53d8d82ac1948d8cbd2130d5/e85cb/003-04.png 480w,\n/devHistoryBlog/static/0edbaa6e53d8d82ac1948d8cbd2130d5/a0209/003-04.png 725w\"\n        sizes=\"(max-width: 725px) 100vw, 725px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<h4>##3-2. Data Validation</h4>\n<ul>\n<li>Bean Validation에서 제공하는 @NotNull, @NotBlank, @Pattern 등을 사용하여 Request Data에 대한 오류를 최소화 한다.</li>\n<li>꼭 @RequestBody 옆에 @Valid 를 명시해줘야 한다.<br>\n<a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/83f137a7f7568267a24cd8ac6094b064/33a7b/003-05.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 12.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAkUlEQVQI11WMWxaCMAwFWQ5Q09Y+kpZQqu5/T1fAx9GPOZmbjxl6D+g3BVdB1YplW1E4oInHulPEQWSG8IycX8RISFmQWRBiAkvdfwlp38NSElrrKEVRq0LbhlULHpvg3hh9v6p0BvngE+TyH0z53AMZA3vxcORBhmCtwzUkuGuE8+F0IotxnDFN5s3h0w/j158BaV+p0FDlkwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 05\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/83f137a7f7568267a24cd8ac6094b064/d9199/003-05.png\"\n        srcset=\"/devHistoryBlog/static/83f137a7f7568267a24cd8ac6094b064/8ff5a/003-05.png 240w,\n/devHistoryBlog/static/83f137a7f7568267a24cd8ac6094b064/e85cb/003-05.png 480w,\n/devHistoryBlog/static/83f137a7f7568267a24cd8ac6094b064/d9199/003-05.png 960w,\n/devHistoryBlog/static/83f137a7f7568267a24cd8ac6094b064/33a7b/003-05.png 1119w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n      </li>\n<li>Validation이 실패할 경우, MethodArgumentNotValidException 의 예외가 발생한다.\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/9d0c349132ff7b8265c54c3ec18f8b51/eba85/003-07.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 28.333333333333332%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABJ0AAASdAHeZh94AAAA8klEQVQY022Q3bKDIBCDfZ0q7g8gVp3W0/d/qJws9LIXmcDM7kfCVJvhagvOK+M4K/3C/TrweZ/43Bf+6PfV8N4NbSvIdUOlcqnwXLpEFcuSMM8zJs0KU8d+vLC1A23fse8NtWRsBITn7CiloNQK84y6NagZUlqxris9EbgMoBCoagSeaM8AHqjtyeWNw4JVpHssJC7HPRZ/KWZ6QhGD82Vzp6xXMKfyuKsGNPWZzIrpm+aXRsIkcHNoLJvQdSjOlDBVtIj/UlNWXLB81VN3Sa8+WSEoPQjUvmABptzLSM3/dRneYZLYgIAQz2M2979VNvsHOkq7d095jcEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 07\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/9d0c349132ff7b8265c54c3ec18f8b51/d9199/003-07.png\"\n        srcset=\"/devHistoryBlog/static/9d0c349132ff7b8265c54c3ec18f8b51/8ff5a/003-07.png 240w,\n/devHistoryBlog/static/9d0c349132ff7b8265c54c3ec18f8b51/e85cb/003-07.png 480w,\n/devHistoryBlog/static/9d0c349132ff7b8265c54c3ec18f8b51/d9199/003-07.png 960w,\n/devHistoryBlog/static/9d0c349132ff7b8265c54c3ec18f8b51/eba85/003-07.png 1054w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<br>\n<h3>#4. Response Dto 클래스</h3>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/dd4f2ddab4b21bea77b93a35005efb67/27524/003-08.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 646px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 46.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABJ0AAASdAHeZh94AAABOElEQVQoz5WSSXbDIBBEfRwz0w1CaLRf7n+nSoPkQdll8V8zFlTBjXNB5AHMHvumMRYNrQ2UeqE6Wut3u6M/48aYXhu3lyCxw74rrKsWcY0YD4hIKsM5J1XarU+MGAgcErzzb9HGLQ0jOAsUsFeNuRiso8E8GExZYaojlvWJOs1IWQ4WMeIECowUM7wPV8EuJrf03mPwIkYGIweUsWKU8UK5z/kQT9v3k6vlL8ECEpxsskbD2TYh1ai+wFp7IH0rts2rL+2/uR4ZNsulwskN2Gs8skEli62mbnN7/mCaFqx1wro06wuW7YF52ZBlL/ERAQvtoOOGaeihtwH2FtEZCV4WpdwJkhPJA0RP/WGaQKtNhE44JXH3JehD6LZV+zJvK/fTyvlNtLp+na8sP5ZPwXbiEfA15P/yC643FlBwuoIjAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 08\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/dd4f2ddab4b21bea77b93a35005efb67/27524/003-08.png\"\n        srcset=\"/devHistoryBlog/static/dd4f2ddab4b21bea77b93a35005efb67/8ff5a/003-08.png 240w,\n/devHistoryBlog/static/dd4f2ddab4b21bea77b93a35005efb67/e85cb/003-08.png 480w,\n/devHistoryBlog/static/dd4f2ddab4b21bea77b93a35005efb67/27524/003-08.png 646w\"\n        sizes=\"(max-width: 646px) 100vw, 646px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h4>##4-1. 객체 생성을 위해 필드가 3개 이상일 경우는 @Builder를 사용한다.</h4>\n<ul>\n<li>@Builder 사용 시 All Arguments Constructor 가 자동으로 생성된다.  </li>\n<li>생성자를 이용한 객체 생성을 막기 위해 생성자를 따로 정의한 후(@AllArgsConstructor) 접근제어자를 Private로 정의한다.<br>\n<a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/c7baa199350d983fb243c2b869cc1743/4d08a/003-09.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 709px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 15.416666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAmElEQVQI1z3Paw6EIAwEYI/jCihQoDwUNHv/M812Nbs/vgxNk0mZKDICV1gijDHjPBf0vsA6YX8MnCNJD621pJP9Y5O32/xtWy0mHxJCbvAxoe8zxqFwSWktCzIr8QKzRWsXau13WcrlxrkiJkb0DKYMcuEpJM5w3qORXBcU2ElpevKQudCKsg+M643aDnj5jTHmpr+U/vsAR01f8shqGNIAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 09\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/c7baa199350d983fb243c2b869cc1743/4d08a/003-09.png\"\n        srcset=\"/devHistoryBlog/static/c7baa199350d983fb243c2b869cc1743/8ff5a/003-09.png 240w,\n/devHistoryBlog/static/c7baa199350d983fb243c2b869cc1743/e85cb/003-09.png 480w,\n/devHistoryBlog/static/c7baa199350d983fb243c2b869cc1743/4d08a/003-09.png 709w\"\n        sizes=\"(max-width: 709px) 100vw, 709px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<h4>##4-2. 객체 생성을 위해 필드가 3개 이상일 경우는 @Builder를 사용한다.</h4>\n<h4>##4-3. @Getter 필요 이유</h4>\n<ul>\n<li>@ResponseBody 를 사용하면 Spring 내부에서 Jackson 라이브러리를 사용하여 Response 객체를 Serialize(ByteCode로 변환) 하는데 이때 getter 메소드를 사용한다.  </li>\n<li>따라서 response 객체는 @Getter 를 사용해야 한다.</li>\n</ul>\n<br>\n<hr>\n<br>\n<h2>MapStruct</h2>\n<ul>\n<li>DTO -> Entity, Entity -> DTO의 객체 매핑을 위한 라이브러리</li>\n</ul>\n<h3>#1. gradle 추가</h3>\n<ul>\n<li>롬복과 함께 사용 시, lombok annotationProcessor 보다 mapstruct annotationProcessor가 먼저 선언이 되야 한다.</li>\n<li>SpringBoot 버전에 호환하는 MapStruct 버전이 존재, 해당부분 확인 필요\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/17bbbd0c849a5fb8341395ca3b978c3f/fbf08/003-10.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 20.833333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAkUlEQVQY02WPaxLDIAiEcx4FxFcck/ufa0uI7TTtj53dAYWPrbQBLQ0xRqgqSikuZrZaAFH0XjT/5LiyKYTw0Fb7PZCIMOfEeZ7uYwzUXlBHNuly067ILaF0W25ZEoOFIHq7D8yLUESQUnK6q8lMt9snWpkW1YP6y/8Ij+Nwun10J7xI3mRtZmgVey++4PfcSy8nq3wd02Z9uwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 10\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/17bbbd0c849a5fb8341395ca3b978c3f/d9199/003-10.png\"\n        srcset=\"/devHistoryBlog/static/17bbbd0c849a5fb8341395ca3b978c3f/8ff5a/003-10.png 240w,\n/devHistoryBlog/static/17bbbd0c849a5fb8341395ca3b978c3f/e85cb/003-10.png 480w,\n/devHistoryBlog/static/17bbbd0c849a5fb8341395ca3b978c3f/d9199/003-10.png 960w,\n/devHistoryBlog/static/17bbbd0c849a5fb8341395ca3b978c3f/fbf08/003-10.png 962w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<br>\n<h3>#2. Mapper Interface 생성</h3>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/aec804f2711a670a547440659818a3ef/7b1dc/003-11.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 956px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 23.75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA8klEQVQY002QSXLFIAxEfR4zisFmsk1+XJX7n6gjtPqLLgHVPLW0hZgxu8ZVDJ5W8F4dz7gxP3945ovWb8SUEWJCPk6p5ANSyDDWQqmdpbDvSs4bsaFnx8CEn1Exa0Y/G67rxbgm7vkRSIhRgBSi3FM+4CkgWAVyGrv6AmrrQDHLpxgIwVmWgzWaAQuWpUaGSEKGLuBKTkbBm5VwF23L6D2htIFyJh474Pc+8PSI2QijnRi9oZWMWitqvxiUUNl/lgrHzZXWMMaIttV9RZc9sSzvJyQejd+OaFkGJRm0bJGil4SeCGl5eQLLe/Tes5+4OvwDBgugNqNYuUEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 11\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/aec804f2711a670a547440659818a3ef/7b1dc/003-11.png\"\n        srcset=\"/devHistoryBlog/static/aec804f2711a670a547440659818a3ef/8ff5a/003-11.png 240w,\n/devHistoryBlog/static/aec804f2711a670a547440659818a3ef/e85cb/003-11.png 480w,\n/devHistoryBlog/static/aec804f2711a670a547440659818a3ef/7b1dc/003-11.png 956w\"\n        sizes=\"(max-width: 956px) 100vw, 956px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h4>##2-1. @Mapper 사용</h4>\n<ul>\n<li>매핑 정책(Policy)과 전략(Strategy)를 설정할 수 있다.  </li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>정책</th>\n<th>값</th>\n<th>설명</th>\n<th>예시</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>unmappedSourcePolicy</td>\n<td>IGNORE(default), WARN, ERROR</td>\n<td>Source의 필드가 Target에 매핑되지 않을 때 정책이다.</td>\n<td>ERROR로 설정하면 매핑 시 Source.aField가 사용되지 않는다면 컴파일 오류가 발생시킨다.</td>\n</tr>\n<tr>\n<td>unmappedTargetPolicy</td>\n<td>IGNORE, WARN(default), ERROR</td>\n<td>Target의 필드가 매핑되지 않을 때 정책이다.</td>\n<td>ERROR로 설정하면 매핑 시 Target.aField에 값이 매핑되지 않는다면 컴파일 오류가 발생시킨다.</td>\n</tr>\n<tr>\n<td>typeConversionPolicy</td>\n<td>IGNORE(default), WARN, ERROR</td>\n<td>타입 변환 시 유실이 발생할 수 있을 때 정책이다.</td>\n<td>ERROR로 설정하면 long에서 int로 값을 넘길 때 값에 유실이 발생할 수 있다. 이런 경우에 컴파일 오류를 발생시킨다.</td>\n</tr>\n</tbody>\n</table>\n<table>\n<thead>\n<tr>\n<th>전략</th>\n<th>값</th>\n<th>설명</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>nullValueMappingStrategy</td>\n<td>RETURN<em>NULL(default), RETURN</em>DEFAULT</td>\n<td>Source가 null일 때 정책이다.</td>\n</tr>\n<tr>\n<td>nullValuePropertyMappingStrategy</td>\n<td>SET<em>TO</em>NULL(default), SET<em>TO</em>DEFAULT, IGNORE</td>\n<td>Source의 필드가 null일 때 정책이다.</td>\n</tr>\n</tbody>\n</table>\n<h4>##2-2. INSTANCE 생성</h4>\n<ul>\n<li>빌드 시점에 CouponMapper 를 상속받은 CouponMapperImpl(구현체) 클래스가 생성된다.</li>\n<li>따라서 이 구현체를 사용할 수 있는 객체를 생성한다.</li>\n</ul>\n<br>\n<h3>#3. Mapper 사용</h3>\n<h4>#3-1. Dto to Entity 또는 Entity to Dto 선언부 생성</h4>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/e12d18b9ab88729fb7fee6f030ace81a/5bf79/003-12.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 8.75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAdElEQVQI1yXOURLDIAgE0NxHZyrRiLLYNNPe/0pbmn4wfABv2R6lUCfYe6dr4Xs1vlB5QQjdOc1oAIcqVQfNn2xHpw7jhLPWypQSc853bUX2e2BYcdS5HEQAPv7oicbLD34iCKYBnjc4Y18jROIhEWGJ/sO/mE9BjaqO7VwAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 12\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/e12d18b9ab88729fb7fee6f030ace81a/d9199/003-12.png\"\n        srcset=\"/devHistoryBlog/static/e12d18b9ab88729fb7fee6f030ace81a/8ff5a/003-12.png 240w,\n/devHistoryBlog/static/e12d18b9ab88729fb7fee6f030ace81a/e85cb/003-12.png 480w,\n/devHistoryBlog/static/e12d18b9ab88729fb7fee6f030ace81a/d9199/003-12.png 960w,\n/devHistoryBlog/static/e12d18b9ab88729fb7fee6f030ace81a/5bf79/003-12.png 966w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h4>#3-2. @Getter, @Builder 설정</h4>\n<ul>\n<li>변환과정에서 꺼내오는 객체(source)에는 Getter가 있어야 하고, 변환해서 저장하고자 하는 객체(target)에는 Builder 혹은 Setter가 있어야 하는데 Setter는 지양한다.  </li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/bb9e9e4e6fcc0f2a3d120848bf434620/9d576/003-13.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 541px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 16.249999999999996%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABJ0AAASdAHeZh94AAAAgUlEQVQI143OMRLDMAgEQH8n4BlLFhghRXHy/0ddsKqkc7FzBQzcUtSQi2JLO6oRxiCoEIg4/OY9ixwVWa6DBb0R3i+aeanG4QH3mPUPzBpSjsetw6pPqhUufUopY7ka7npES4EmwikM2RjPwjgSw4LnFRJ73ge8DfRTwSvP9sz/vlNfXncPyFC2AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 13\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/bb9e9e4e6fcc0f2a3d120848bf434620/9d576/003-13.png\"\n        srcset=\"/devHistoryBlog/static/bb9e9e4e6fcc0f2a3d120848bf434620/8ff5a/003-13.png 240w,\n/devHistoryBlog/static/bb9e9e4e6fcc0f2a3d120848bf434620/e85cb/003-13.png 480w,\n/devHistoryBlog/static/bb9e9e4e6fcc0f2a3d120848bf434620/9d576/003-13.png 541w\"\n        sizes=\"(max-width: 541px) 100vw, 541px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/77b064f1f1b366f0858f879197b871f0/ca12d/003-14.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 647px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 131.25%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAABYlAAAWJQFJUiTwAAACqklEQVRIx51V23biMAzkc+r73UmcANv+/z9pR04IgeVsSx90bGIzHmnG8inmgXys1JqlZRZkrSIhFEmJUUrMBeZyC8z77zWEXNeUUvt4WgFLB7xeJOUkO6hzkpw1GANpbcgYg+/uHsZj3ZPB2g3sAXBZLP25CmqTpLlJmkZB89IQXzROMw2Isc3UlgsNudJSChVkZo19AiwDBYC26ug6KBqSopYB2Eaaz/hzy+R8AFNP1rk+N1pRMEhXyZ72Q8oJgKkCNAQ6z40qTl5P033URj3WcZsL1FhJ9QC2AzJLPr04RckxA30Q4r75VTyv3wG9gyAfFIOACOJh43egLwEdAC+XDLUTip13lr8G5JSVtqgZLIFRSfnSZ28x/DwLOjcBgezmNYf0D0zfZRgNjA1ThxAp5ULJwzIHn/2E5Yktc2NYqwCQ7KKwVW4pH9X+DvQOCIbnKhGKalAUYZ8c+DbApz5is+z3+62UDVJmIyu1GXdjpN+wz5Mokq4NDCMMbiV5axFhY/fTlA8MvZa4o6oHA7IgDKh/a5uKGpaiaBwVmd4Xtx74lsrHu1wrukzrbauU1Tbcori7/OvB1+Doh5UCM0S38V6AmVxFEZt1xMcW4jHkmsFxD2dzGttC0+ULPTHTdUJTRU/0ToOx7wYPMcGbGYd5ipjHlPu3AEdElIl/90uAYOud6thomM9kAJDBbgq6+4//NKFDxxgBFvpmbq4emfSGC0DvIBofiuDRwBU9ZQ6Nu8vKtmRoygsFmHlBx3ZG97RudZPbwyUOj9gteG3v2AaAHqcWb5AKUuuCjP2RSqVSGcb+piQw/p/au8oMaNmHsAt7jx8frhN/E0/t/1vbMEMWwVu9Axo2NQzuzJP/Ds3iVZwK0mGlLp8LfFjQB/HeQlFWtRefhXgj/gK0HyB0aRafRwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 14\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/77b064f1f1b366f0858f879197b871f0/ca12d/003-14.png\"\n        srcset=\"/devHistoryBlog/static/77b064f1f1b366f0858f879197b871f0/8ff5a/003-14.png 240w,\n/devHistoryBlog/static/77b064f1f1b366f0858f879197b871f0/e85cb/003-14.png 480w,\n/devHistoryBlog/static/77b064f1f1b366f0858f879197b871f0/ca12d/003-14.png 647w\"\n        sizes=\"(max-width: 647px) 100vw, 647px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/ed749df7538d664edec5d824a180da2d/977f7/003-15.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 547px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 22.083333333333332%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAnUlEQVQY042PWQ7CMAxEexxiQ5qFNM6GuP+lBrepBEh88DGaKFZenpe4CcJ9g7UOtRj0RoiBYAyDmUDEGvo7y/0EXhX4GAZjEIrQhPHZtPcbvJ9/5QDGlLFb2pDU7qJQQqukthNcxEDEo7UnSulwPiBLRcqCXLT1fY4FNels9RN4rOwCxBN6ZCTHs1fWO8bmLZJ+Wvs4YDdrv4w/zV8UKXzJaofKyAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"003 15\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/ed749df7538d664edec5d824a180da2d/977f7/003-15.png\"\n        srcset=\"/devHistoryBlog/static/ed749df7538d664edec5d824a180da2d/8ff5a/003-15.png 240w,\n/devHistoryBlog/static/ed749df7538d664edec5d824a180da2d/e85cb/003-15.png 480w,\n/devHistoryBlog/static/ed749df7538d664edec5d824a180da2d/977f7/003-15.png 547w\"\n        sizes=\"(max-width: 547px) 100vw, 547px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<br>\n<h5>201203 수정사항</h5>\n<ul>\n<li>Dto 클래스 내 Mapper 호출 메소드 명 변경<br>\n—> createReqToEntity() -> toEntity()<br>\n—> entityToCreateRes() -> of()  </li>\n<li>Response Dto 클래스 내 Validation 제거<br>\n— res Dto 클래스 serialize 전 validation 로직 없음  </li>\n<li>MethodArgumentNotValidException 이미지 추가</li>\n</ul>","fields":{"tagSlugs":["/tags/dto/"],"slug":"/history/posts/2020-11-10--003"},"frontmatter":{"title":"[Code Convention] DTO Class","tags":["dto"],"date":"2020-11-10","description":""}}},"pageContext":{"slug":"/history/posts/2020-11-10--003"}},"staticQueryHashes":[]}