{"componentChunkName":"component---src-templates-post-template-jsx","path":"/history/posts/2020-11-14--002","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":"bda4e70f-6276-595d-b031-a0d494b3b672","html":"<h3>스프링 없는 순수한 DI 컨테이너</h3>\n<ul>\n<li>요청시마다 객체를 새로 생성한다\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/7ba29536b82a71776fec267ced6c97ec/efeb1/002-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: 50%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB2klEQVQoz32SzW7TUBCF/TDwEkWCXbuHhwCp0L5EN7CiK8KKRaMUKVDlASJFitiFKpvGJHHs/FzHThzbuU7s+iexD8y0TVshGMmydeX55pwzV8Ft5XmOf5WUEkEQQAiBzlUHwhDQf+nQVA3tdhv9fh9hGML3fShJkmCz2eB/NZ/PGep6LryFB+lJmMKEO3NhTS1YloXVagXbtqHUajWUy2WGTqdT6LqO4XCIyWRyD3JdFEWBfFtAuALvLt7i4PM+3nx7DZnI3eDlcgml1Wqh2WxyI02YzWYMJnv0jMdjHkA/+54PYQt8vTxH6ccnVH5WEKURUNwA2XK328VoNMLDLD3PYxuO4+wUPixS66ydXe55kd8Dq9UqSqUSh042aUCv14NhGAwiZaQ8zVJkSYbOsIMXp8/x9OQJnn3cgx1Yu0EMHAwGnFuWZdxM26JnvV6zOjoj2/RNDVEYIc5iWH9A19n13wopv0ajwQe08cViwVZJFUHojKB3RZmdX1bwof4eZ60zhGn4OMN6vQ6yTfY0TeM8TdPkxdCCCEx5JmmCYBlANVQcXxzh1ZeXOPx+CD/2H91XhTZJiijg7XaLOI75TpHlu7eqqpwpDaB7GMoQ0peIgog3T/0kiFi/ASOC35jpfiC6AAAAAElFTkSuQmCC'); 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=\"002 01\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/7ba29536b82a71776fec267ced6c97ec/d9199/002-01.png\"\n        srcset=\"/devHistoryBlog/static/7ba29536b82a71776fec267ced6c97ec/8ff5a/002-01.png 240w,\n/devHistoryBlog/static/7ba29536b82a71776fec267ced6c97ec/e85cb/002-01.png 480w,\n/devHistoryBlog/static/7ba29536b82a71776fec267ced6c97ec/d9199/002-01.png 960w,\n/devHistoryBlog/static/7ba29536b82a71776fec267ced6c97ec/07a9c/002-01.png 1440w,\n/devHistoryBlog/static/7ba29536b82a71776fec267ced6c97ec/efeb1/002-01.png 1593w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Configuration</span>\n  <span class=\"token keyword\">static</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AppConfig</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@Bean</span>\n    <span class=\"token class-name\">DataService</span> <span class=\"token function\">dataService</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">DataServiceImpl</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token annotation punctuation\">@Test</span>\n  <span class=\"token annotation punctuation\">@DisplayName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"스프링 없는 순수한 DI 컨테이너\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">pureContainer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">AppConfig</span> appConfig <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">AppConfig</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\">DataService</span> dataService1 <span class=\"token operator\">=</span> appConfig<span class=\"token punctuation\">.</span><span class=\"token function\">dataService</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">DataService</span> dataService2 <span class=\"token operator\">=</span> appConfig<span class=\"token punctuation\">.</span><span class=\"token function\">dataService</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 function\">assertThat</span><span class=\"token punctuation\">(</span>dataService1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">isNotSameAs</span><span class=\"token punctuation\">(</span>dataService2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<h3>싱글톤 컨테이너</h3>\n<ul>\n<li>스프링 컨테이너 덕분에 요청시마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 재사용한다.</li>\n<li>스프링 컨테이너는 싱글톤 컨테이너 역할을 한다.</li>\n<li>이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/e1969ad39cc239852f33e1ec5c1aa642/7bf53/002-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: 50%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABd0lEQVQoz41Sy26CUBTkf9o/aD+g/bNu2XTnxj9w507c6cqFj6iER6KCIggI+ODhtHNSkmJS05OcXC73njkzc66Cn7jdbvgrjscjoiiS1bZtTKdTLJdLTCYTGIYhZ3EcIwxDKHmeoyxLPIr9fo/D4SCFnufBdV3sdjtst1vZE4iA3CvdbhetVgtpmmKz2UjH+XwuKwt5mUX/CTZURqMRer0eyJQAdbIbWdRMyICZJAnSJMUlu3z7RKuAqqoEUCSbpils7oOeFkUh63q9FlDHcYStF3pYOAuEWdjwXxh2Oh2oqoosy7BarUTubDaDruvClAAEIosiL2C7Nt4/3/D88YRX9QVWYDUlW5YlUzufz2J+LY3JQfi+L5OlHMqN4ghja4yhPYTpm9KowXAwGEDTNPlxvV4RBIGwqn3jC+BFBgHZpOnNnYf9fh/tdls2lMxJM38PiD4T9HQ6PZwyCSgspunsQgZ8vFx5WH8TkNMme9pyn1REa0joC9DK7zQR3b2JAAAAAElFTkSuQmCC'); 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=\"002 02\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/e1969ad39cc239852f33e1ec5c1aa642/d9199/002-02.png\"\n        srcset=\"/devHistoryBlog/static/e1969ad39cc239852f33e1ec5c1aa642/8ff5a/002-02.png 240w,\n/devHistoryBlog/static/e1969ad39cc239852f33e1ec5c1aa642/e85cb/002-02.png 480w,\n/devHistoryBlog/static/e1969ad39cc239852f33e1ec5c1aa642/d9199/002-02.png 960w,\n/devHistoryBlog/static/e1969ad39cc239852f33e1ec5c1aa642/07a9c/002-02.png 1440w,\n/devHistoryBlog/static/e1969ad39cc239852f33e1ec5c1aa642/7bf53/002-02.png 1595w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Test</span>\n  <span class=\"token annotation punctuation\">@DisplayName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"스프링 컨테이너와 싱글톤\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">springContainer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">ApplicationContext</span> ac <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">AnnotationConfigApplicationContext</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">AppConfig</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">DataService</span> dataService1 <span class=\"token operator\">=</span> ac<span class=\"token punctuation\">.</span><span class=\"token function\">getBean</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dataService\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">DataService</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">DataService</span> dataService2 <span class=\"token operator\">=</span> ac<span class=\"token punctuation\">.</span><span class=\"token function\">getBean</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dataService\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">DataService</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// 참조값이 동일한 것을 확인</span>\n    <span class=\"token function\">assertThat</span><span class=\"token punctuation\">(</span>dataService1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">isSameAs</span><span class=\"token punctuation\">(</span>dataService2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<h3>싱글톤 방식의 주의점</h3>\n<ul>\n<li>무상태(stateless)로 설계해야 한다.</li>\n</ul>","fields":{"tagSlugs":["/tags//"],"slug":"/history/posts/2020-11-14--002"},"frontmatter":{"title":"[스프링 핵심 원리 리뷰] Singleton Container","tags":[""],"date":"2020-11-14","description":""}}},"pageContext":{"slug":"/history/posts/2020-11-14--002"}},"staticQueryHashes":[]}