{"componentChunkName":"component---src-templates-post-template-jsx","path":"/history/posts/2021-01-25--001","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":"6bcdb1bd-f59b-5fe1-a9fb-10c44eb9fabb","html":"<p><span class=\"title__sub1\"> #JPA에서 가장 중요한 2가지 </span></p>\n<ul>\n<li>객체와 관계형 데이터베이스 매핑</li>\n<li>영속 컨텍스트 (매커니즘)</li>\n</ul>\n<p><span class=\"title__sub1\"> #Entity Manager Factory 와 Entity Manager </span></p>\n<ul>\n<li>Factory에서 Entity Manager 생성</li>\n<li>Manager에서 DB Connection을 사용</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/796220b97cd1d89e69e4bab3f897de77/56e36/001-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: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 60%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABaUlEQVQoz3WSWa+CQAyF5///Nd94wBAEF5BFVEQ2l2hvvt6UcBcnaWamy+k5nXHv91tYp9NJjsej1HUt5/NZDd9qtZLlcilRFGnM4pfLRfPJYYGDOQOsqkoTm6bRZHbunufJYrEQ3/e1GEDiGGfq/gWkuOs6GYZB+r6frG1buV6vGs+yTMIwVLYAAYr/IyCFgAA8N3ywKctSgiBQUBSY/I+AsIEhNo6j3O93KYpC4jjW4sPh8EMF+X9miAOzQdMZORTnea7yLG5jMDWAG6AtBwhOmCAJsPV6rbJ44f1+r3FjT6MkSSY/BJ7Pp+6ocoDw/BSYHALs3HmIzWajPlghHR8E7EvRwL6Qm/85kukECxpRkKapsqaBjWe73eo4AMJMITgOgLlkwCjgIZCONBoBvtvt1IdxhhUjYz0eD3m9Xt+SAbEZ3W433bnPfci3HTCYMwb7NtOj2AEmvCjsfhsznO8AIhUVAM+/zRdQw42UZm+aQwAAAABJRU5ErkJggg=='); 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=\"001 01\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/796220b97cd1d89e69e4bab3f897de77/d9199/001-01.png\"\n        srcset=\"/devHistoryBlog/static/796220b97cd1d89e69e4bab3f897de77/8ff5a/001-01.png 240w,\n/devHistoryBlog/static/796220b97cd1d89e69e4bab3f897de77/e85cb/001-01.png 480w,\n/devHistoryBlog/static/796220b97cd1d89e69e4bab3f897de77/d9199/001-01.png 960w,\n/devHistoryBlog/static/796220b97cd1d89e69e4bab3f897de77/07a9c/001-01.png 1440w,\n/devHistoryBlog/static/796220b97cd1d89e69e4bab3f897de77/56e36/001-01.png 1750w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p><span class=\"title__sub1\"> # 영속성 컨텍스트 </span></p>\n<ul>\n<li>엔티티를 영구저장하는 환경이라는 뜻</li>\n<li>논리적인 개념</li>\n<li>엔티티 매니저를 통해 영속성 컨텍스트에 접근</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/6cdcc3d9ecfda713e2edfeb4ecea79be/21482/001-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: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 42.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABc0lEQVQoz31Sy5KCQAzk/z/Ci/oFHvwArfLi6yC+KBWkSlhFAXnJAPYmWcfaw7pT1TUJkzRJJ8bz+cSnMxwO0ev15G61Wmi324ii6M9YzWNop65ruZumkYeqqjAYDNDv94Ww2+2i0+ngfD7LO8dpcJ6GEJZlidFohOl0ivV6jfF4jNVqhfl8juVyiclkIj5jNpsJTNPEdruF7/tI0/Rd5bvCPM9RFIWQa5uRZRmSJBFoO47jt/94PAgllKp+COtXyXXdUJs1/jscxwRpmhFZTj9XKJUiMoXgesXtFsL4Ik0sy8J+v8fhcIBtO1JhFMW4cxVkH+hbSMO4UtJut4PjOBRny805jmMjDEMhNTzPx2azJWxIEwuLhYlLEOB+T0Qbz/NwPLq4UQL7moyJXNeltyPBofg7IpLC4OkqmmiSpKIZn/o1aZ7g6XQSOyW9uHKOZ52L4iFt6/Yvl0C6MD7t0+/91OukXnoxIWvJpFxEnhfic8w3YGWq05VFy/EAAAAASUVORK5CYII='); 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=\"001 02\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/6cdcc3d9ecfda713e2edfeb4ecea79be/d9199/001-02.png\"\n        srcset=\"/devHistoryBlog/static/6cdcc3d9ecfda713e2edfeb4ecea79be/8ff5a/001-02.png 240w,\n/devHistoryBlog/static/6cdcc3d9ecfda713e2edfeb4ecea79be/e85cb/001-02.png 480w,\n/devHistoryBlog/static/6cdcc3d9ecfda713e2edfeb4ecea79be/d9199/001-02.png 960w,\n/devHistoryBlog/static/6cdcc3d9ecfda713e2edfeb4ecea79be/21482/001-02.png 1350w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p><span class=\"title__sub1\"> # 엔티티의 생명주기 </span></p>\n<ul>\n<li><span class=\"text-mark__red\">비영속 (new/transient) </span>\n— 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태</li>\n<li><span class=\"text-mark__red\">영속 (managed)</span>\n— 영속성 컨텍스트에 관리되는 상태</li>\n<li><span class=\"text-mark__red\">준영속 (detached)</span>\n— 영속성 컨텍스트에 저장되었다가 분리된 상태</li>\n<li><span class=\"text-mark__red\">삭제 (removed)</span>\n— 삭제된 상태</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/98c14163f5b2716eb8e8d530b04856f8/36eca/001-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: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 71.66666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABR0lEQVQ4y4WTba+CMAyF+f8/Dr4bXkRARUF5U1DQ3jxLRoA7pEmzjXZn57TFEoN9v99xrapK0jSV6/Uq9/tdPp/PLGdp1hbg7XaTIAiUn89n6ft+jJlAfwJqNofDQS6Xyyy+ylAHp66BkGjbtux2O2maRp3zPJ/lLh8wMtT2eDwUoO/7Ute1kp9lmRFwZPh+v6XrOnm9XmqFnb6oDbnIXivP1K2yLJWU/X6vWADE5TAM5XQ6qUbQEM5RFI215Jvruv9riCxGg9qwwlgbe+JxHIvneephQMnVK6zIwdu2Xe/ytC6oYA6nDx2PR/UQDUMJ+6IozF3WYCQkSTJjxZBjqOEhx3HUN+KcLVNhNSBDDBuSkcseH4ZhlEkOMRSsSl6OAiy15OfzqZrHN3zzT5kyZIRgR9e5TN1g9XNstv5l2OgGMJ8moOmdP2MRQbjgo7ZpAAAAAElFTkSuQmCC'); 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=\"001 03\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/98c14163f5b2716eb8e8d530b04856f8/d9199/001-03.png\"\n        srcset=\"/devHistoryBlog/static/98c14163f5b2716eb8e8d530b04856f8/8ff5a/001-03.png 240w,\n/devHistoryBlog/static/98c14163f5b2716eb8e8d530b04856f8/e85cb/001-03.png 480w,\n/devHistoryBlog/static/98c14163f5b2716eb8e8d530b04856f8/d9199/001-03.png 960w,\n/devHistoryBlog/static/98c14163f5b2716eb8e8d530b04856f8/07a9c/001-03.png 1440w,\n/devHistoryBlog/static/98c14163f5b2716eb8e8d530b04856f8/36eca/001-03.png 1526w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// 비영속</span>\n<span class=\"token class-name\">Member</span> member <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Member</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nmember<span class=\"token punctuation\">.</span><span class=\"token function\">setId</span><span class=\"token punctuation\">(</span><span class=\"token number\">100L</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nmember<span class=\"token punctuation\">.</span><span class=\"token function\">setUserName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"member1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">//영속</span>\nentityManager<span class=\"token punctuation\">.</span><span class=\"token function\">persist</span><span class=\"token punctuation\">(</span>member<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태</span>\nentityManager<span class=\"token punctuation\">.</span><span class=\"token function\">detach</span><span class=\"token punctuation\">(</span>member<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">//객체를 삭제한 상태(DB에서 삭제)</span>\nentityManager<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span>member<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><span class=\"title__sub1\"> # 영속성 컨텍스트의 이점 </span>\n<span class=\"title__sub2\">1) 1차 캐시</span></p>\n<ul>\n<li>1차 캐시는 한 트랜젝션에서만 허용된다.</li>\n<li>성능보다는 매커니즘에 이점에 있다.</li>\n<li>1차 캐시에서 조회\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/5a9d8c885d4d60229e8c8f111bfc1075/b5a09/001-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: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABRElEQVQoz22S646CQAxGef838ycxJqgo3rgoXlFAjfptTrMlmN0mzZR2OP2mM4F+7fP5mGPn81m73U7H41GHw0Fpmmq9Xmuz2XzFWZZZve/Bf0BAl8tFbduqrmtNJhONRiNFUaTpdNrF8/nc6jh79/u9Agf1gafTyVSy8Xa76fF46Pl86n6/q2ka+5kY9z3kDaie9RX2gTjHK8tSq9VKs9nMRpLn+V/g+/0WDozVZ1hVlSm5Xq/abrcGGY/HBgI+GAwUhqGKorDxdEDUJElig14sFlbkB7pTI08dIOoYPDlmGcexXQ5NvxS+Xi9zZsWKCn4ECHy5XFoD1LCi2JuS4zQdkOPRDQV05pgoGQ6HnSoUuHERNHajBpC8PRsSyHbpGJ2A8+ZQy2WgihhFODFO3mdO/HXLbjwbh/kx3R3Y/2ZlBAj5Adv49Wnk6xpZAAAAAElFTkSuQmCC'); 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=\"1차 캐시에서 조회\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/5a9d8c885d4d60229e8c8f111bfc1075/d9199/001-04.png\"\n        srcset=\"/devHistoryBlog/static/5a9d8c885d4d60229e8c8f111bfc1075/8ff5a/001-04.png 240w,\n/devHistoryBlog/static/5a9d8c885d4d60229e8c8f111bfc1075/e85cb/001-04.png 480w,\n/devHistoryBlog/static/5a9d8c885d4d60229e8c8f111bfc1075/d9199/001-04.png 960w,\n/devHistoryBlog/static/5a9d8c885d4d60229e8c8f111bfc1075/b5a09/001-04.png 1360w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n<li>데이터베이스에서 조회\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/89ad050cd24740b61c36a3eb4c014aef/0486e/001-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: 43.75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABN0lEQVQoz3WS0Y6CQAxF+f9Pw/hgQgwqgoCIighBQFCgu6fJGNxkm5QZSjm97Ywlv/Z+v+V+v0tZlurX61VOp5OkafrlJqcoCl2xaZpkbhaPtm01uWka3R+PR1mv17LdbmW/38tut5PNZqOQ5/OpeXme/w9E4ePxkNfrpcCu66Tve6nr+qMKkIERnwPnbpF0OBzEdV1VlCSJAuI4Vg+CQMIwVKWMoqqqL+Bfs1AFbLlcim3b+vPlctEiwABEUSSLxUK/MT/T8jAM2hGrUastoxKIORBgqOOdls0ciZv2syzTfyh2u920AG5RjQAg5sg7JwqEw+EbygASA0ARYCijw/P5rK5AkhzH0UTP87R9rgxuqpJsYigEtlqtxPd9dWIfhWYOJHMgtGr2KMTZG0c9OazjOOoNmdsPg0mnQoY7iNQAAAAASUVORK5CYII='); 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=\"데이터베이스에서 조회\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/89ad050cd24740b61c36a3eb4c014aef/d9199/001-05.png\"\n        srcset=\"/devHistoryBlog/static/89ad050cd24740b61c36a3eb4c014aef/8ff5a/001-05.png 240w,\n/devHistoryBlog/static/89ad050cd24740b61c36a3eb4c014aef/e85cb/001-05.png 480w,\n/devHistoryBlog/static/89ad050cd24740b61c36a3eb4c014aef/d9199/001-05.png 960w,\n/devHistoryBlog/static/89ad050cd24740b61c36a3eb4c014aef/07a9c/001-05.png 1440w,\n/devHistoryBlog/static/89ad050cd24740b61c36a3eb4c014aef/29114/001-05.png 1920w,\n/devHistoryBlog/static/89ad050cd24740b61c36a3eb4c014aef/0486e/001-05.png 2008w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n       </li>\n</ul>\n<p><span class=\"title__sub2\"> 2) 동일성 보장 </span></p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">Member</span> a <span class=\"token operator\">=</span> entityManager<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Member</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"member1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token class-name\">Member</span> b <span class=\"token operator\">=</span> entityManager<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Member</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"member1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">==</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 동일성 비교 true</span></code></pre></div>\n<p><span class=\"title__sub2\"> 3) 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind) </span></p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">EntityManager</span> entityManager <span class=\"token operator\">=</span> entityManagerFactory<span class=\"token punctuation\">.</span><span class=\"token function\">createEntityManager</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token class-name\">EntityTransaction</span> transaction <span class=\"token operator\">=</span> entityManager<span class=\"token punctuation\">.</span><span class=\"token function\">getTransaction</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">//엔티티 매니저는 데이터 변경 시 트랜잭션을 시작해야 한다.</span>\ntransaction<span class=\"token punctuation\">.</span><span class=\"token function\">begin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nentityManager<span class=\"token punctuation\">.</span><span class=\"token function\">persist</span><span class=\"token punctuation\">(</span>memberA<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nentityManager<span class=\"token punctuation\">.</span><span class=\"token function\">persist</span><span class=\"token punctuation\">(</span>memberB<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.</span>\n\n<span class=\"token comment\">//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.</span>\ntransaction<span class=\"token punctuation\">.</span><span class=\"token function\">commit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<br/>\n<ul>\n<li>entityManager.persist(memberA/B);\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/6a39605d2fbb606cce225caafc123e1f/c2d9c/001-06.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: 115.41666666666669%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAYAAAALHW+jAAAACXBIWXMAABYlAAAWJQFJUiTwAAACaElEQVQ4y23VCU8rMQwE4P3/Pw6QoOK+b2jLfR9Bn6VZpa9vJbPdxBl7xo4Zvr6+2sPDQ7u/v2/Pz89lj4+P7eDgoG1tbbXd3d22t7dX77Ozs9rj//T0VL+Z5/f3t97D5+dngXF6eXkZ7ejoqG1vb7f9/f0C3NjYqCD87u7uRlsC9CcgwF9fX9t8Ph+dmb3b29vaCwt2fn5eAQLIhpOTk7a5uVn0dnZ2Cuj6+rodHx+XWUMVi9lsVr8B+S0Y//4Zbm5uih5DDS0mI860Auabra6ulgwABQ5lGb+9vbVBmj5CezqdNkGY7/f393IEbA2YDFOcANtzdiwKA+AwR4ccRpumvh0kkd8Yydi5BAM+pG36KqN6eXnZLi4uSjMgAIADoOva2tpYdc/Hx0eDtQQY+jJlKis6YJnKAvjp6WkBCrBQlADSxOG+F31HK8/Pz0/Ro+v393cFCODYNgDTEjmcmxNLhflEfGBk6QErQ5Es0getGOerq6sFs6YgjA/amCwAWgDY06UjfTS83mQKATB3vb81C4A2UPQOqLcgaNlDEwNUI0ko03RBQxv6S6vQSETtolW8AdFPoGicO85/ScPJZFLXyTRZWVkpbaIZQG/ggOxllNkLg3RAZRjKek7E9Bc69qzLGgPU7Qsss9xltFP5Ic4pRn9HUU3Dc/atUIeHhwXe32WAdZdT5QDKipNDBqzqahNauiEOob2+vl7rskNXQMksAcb6MU8vATLSBDI/BYiG49ULYA/Wj7NMErQcBmoKxTIPx6I4DDBz71/LcFDpCC9bhbO29D/FIVFVL1fqf5ZRxi8GsG9szx8Kyszrvr6KQgAAAABJRU5ErkJggg=='); 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=\"001 06\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/6a39605d2fbb606cce225caafc123e1f/d9199/001-06.png\"\n        srcset=\"/devHistoryBlog/static/6a39605d2fbb606cce225caafc123e1f/8ff5a/001-06.png 240w,\n/devHistoryBlog/static/6a39605d2fbb606cce225caafc123e1f/e85cb/001-06.png 480w,\n/devHistoryBlog/static/6a39605d2fbb606cce225caafc123e1f/d9199/001-06.png 960w,\n/devHistoryBlog/static/6a39605d2fbb606cce225caafc123e1f/c2d9c/001-06.png 1326w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n<li>transaction.commit();\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/79ccf2f419dc41d24a05841bf2285535/7ef4c/001-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: 57.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABbklEQVQoz3WTjaqCQBCFff8nCwyCIMuCQksts1/NCsSJ78CEdLkLw46zZ8+cmR2DqqqsaRp7PB623+9tPp/L1uu1LZdLWywWirdtK9ztdtPO6vv+zx4cj0eBn8+nlWUpAgg3m42tViuL41jx9/stTF3XsiHRcAXn81lAskL8er10mUvX69Xu97t2cKfTSeYKu64Tnuq4I4UoQSVBgBDhE+Py5XKROenhcNA5C2yapjabzXSOoGA6nao0LhMAjNEr1BF3cvrtqlFHgqIo1CZXHuBA4L0BzDeq8P0xiHmC3W4nZXme23g8tiiKRC5CsuPQeBQkSSKf0kjgSjHvKzHvoRORUCVnWaZMk8nEttut/DAMbTQaqRzvqV+AmDHyVpAYUnBfQoIQcYA6ZhDjzAmHZfsD4POyrl5jQz8gRA1AdmaPvqAYIGROOBzs36WxcfkoA0wfiUE8HHqMmfsd7KF9FWKUhyL/9tivESfJf3/KB7DJj3oMb8FgAAAAAElFTkSuQmCC'); 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=\"001 07\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/79ccf2f419dc41d24a05841bf2285535/d9199/001-07.png\"\n        srcset=\"/devHistoryBlog/static/79ccf2f419dc41d24a05841bf2285535/8ff5a/001-07.png 240w,\n/devHistoryBlog/static/79ccf2f419dc41d24a05841bf2285535/e85cb/001-07.png 480w,\n/devHistoryBlog/static/79ccf2f419dc41d24a05841bf2285535/d9199/001-07.png 960w,\n/devHistoryBlog/static/79ccf2f419dc41d24a05841bf2285535/07a9c/001-07.png 1440w,\n/devHistoryBlog/static/79ccf2f419dc41d24a05841bf2285535/7ef4c/001-07.png 1748w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<p><span class=\"title__sub2\"> 4) 변경 감지 (Dirty Checking) </span></p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">EntityManager</span> entityManager <span class=\"token operator\">=</span> entityManagerFactory<span class=\"token punctuation\">.</span><span class=\"token function\">createEntityManager</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token class-name\">EntityTransaction</span> transaction <span class=\"token operator\">=</span> entityManager<span class=\"token punctuation\">.</span><span class=\"token function\">getTransaction</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">//영속 엔티티 조회</span>\n<span class=\"token class-name\">Member</span> memberA <span class=\"token operator\">=</span> entityManager<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Member</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"memberA\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">//영속 엔티티 데이터 수정</span>\nmemberA<span class=\"token punctuation\">.</span><span class=\"token function\">setUsername</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"hi\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nmemberA<span class=\"token punctuation\">.</span><span class=\"token function\">setAge</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">//커밋하는 순간 데이터베이스에 UPDATE SQL을 보낸다.</span>\ntransaction<span class=\"token punctuation\">.</span><span class=\"token function\">commit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/f948d2a79296874c2fcb74192171d7ed/37c35/001-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: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 60.83333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABgklEQVQoz22S646CUAyEef83wx+GaEy8i1dURBDvN7r5JukucT1JpUI7M53TYLfbGbHf7y3Pc1ssFjYcDm08HitGo5HFcWxZluk7ddS/32/jVFVl9ROkaWpFUdj1erX7/W6bzcYmk4nNZjOBkxNlWSoul4sAX6/Xd0BYiSRJBMJztVpJCU+aIUEpgOv12hBRB6xHMJ/PVYyK5XKp4B3A5DRDNJ1O9Q4CiPz8UzgYDKzf78uv0+mk0RmL/Hw+2/F4FKgrxks8RS3gHKyill55yBhcBEp7vZ4I3FsKaXg8HiICCKUohgA7AIaIZ8CP++jjUowKB6WR96hEud84QtrttuoOh4PIpNAZu92ubbdbFYZhKKXkzWZT/1EDICLoYyr8xS6sgUgKaWJFAEMRSn3/yDudjrVaLRG7QvwCBDu4GNTdbrc/QF8HX24uC1BGjaLIGo2GwPEUQF/sz/N7KUinAQKU+HL7fvK/PvLz+fy+hxRhOuOSAwABuSuvB9/55vv3uYc/z36HbbdVIcAAAAAASUVORK5CYII='); 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=\"001 08\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/f948d2a79296874c2fcb74192171d7ed/d9199/001-08.png\"\n        srcset=\"/devHistoryBlog/static/f948d2a79296874c2fcb74192171d7ed/8ff5a/001-08.png 240w,\n/devHistoryBlog/static/f948d2a79296874c2fcb74192171d7ed/e85cb/001-08.png 480w,\n/devHistoryBlog/static/f948d2a79296874c2fcb74192171d7ed/d9199/001-08.png 960w,\n/devHistoryBlog/static/f948d2a79296874c2fcb74192171d7ed/07a9c/001-08.png 1440w,\n/devHistoryBlog/static/f948d2a79296874c2fcb74192171d7ed/37c35/001-08.png 1810w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p><span class=\"title__sub2\"> 5) 지연 로딩 (Lazy Loading) </span>  </p>\n<ul>\n<li>추후 뒤에서 다시 정리</li>\n</ul>\n<p><span class=\"title__sub1\"> # 플러시 </span></p>\n<ul>\n<li>영속성 컨텍스트의 변경 내용을 데이터베이스에 반영</li>\n<li>플러시가 발생되면 1차 캐시에 있는 정보가 사라지는게 아니라 쓰기 지연 SQL 저장소에 있는 SQL이 실행된다.</li>\n<li>JPQL을 사용하면 자동으로 flush가 날라가고 해당 쿼리가 실행된다.</li>\n<li>트랜잭션이라는 작업 단위가 중요! (커밋 직전에만 동기화 하면 된다.)</li>\n</ul>\n<br>","fields":{"tagSlugs":["/tags/jpa/"],"slug":"/history/posts/2021-01-25--001"},"frontmatter":{"title":"영속성 관리 - 내부 동작 방식","tags":["jpa"],"date":"2021-01-25","description":"자바 ORM 표준 JPA 프로그래밍 강의 복습"}}},"pageContext":{"slug":"/history/posts/2021-01-25--001"}},"staticQueryHashes":[]}