{"componentChunkName":"component---src-templates-post-template-jsx","path":"/history/posts/2020-11-14--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":"d52685d5-bc59-5517-857d-36c25cfc0f0c","html":"<h3># @Configuration과 바이트코드 조작의 마법</h3>\n<ul>\n<li>@Configuration 사용 시 ‘CGLIB’ 라는 바이트코드 조작 라이브러리를 사용하여 클래스 구성한다.</li>\n<li>때문에 여러 곳에서 특정 Bean의 객체 생성을 유도하더라도 싱글톤이 보장되도록 해준다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/cb0780cfe66b9bbd0ac218383ed6a687/0bdcb/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: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 53.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABXElEQVQoz41TW07CUBDtHojug28fiS6GJWh0BX4a3YX/LoAP/oQWAgk1KaShUqDQAiGRtrc9csbcIiqESU46mTtzZubcWyPPcxzCYrFAGIaYz+eYTqdot9toNptotVrodDpyFkWRgDkGDliWZQiCQBJZwGLf9zEcDuU7Go12yBgzlFLFNPQJbUmSSPKxxgbGbDZDr9eD4ziYTCZCkKbpH0I25MSp2pzlENDXcdp4PP4mNE0TjUZDAvsIdZHEVQKVqR1pCkI6q9VK9NGT7Fs5+oxQeang/OkMl88XuH+92wy6zRdC3iJXpaAUltAdfxKmcYqu10X5oYzT2xOUbkq4frxCEAZYr9dbDS3LkqdQr9dB37btfwk9z0Pf6cP/8FF9q6Jm1uC8O7C7ttx6QcgJl8tlAa6v1yahluLoWz6UQEI2PNYonaHf3m9w7TiOMRgM5A/hA98HEjHHdV18AfEmQn6hcQjlAAAAAElFTkSuQmCC'); 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/cb0780cfe66b9bbd0ac218383ed6a687/d9199/003-01.png\"\n        srcset=\"/devHistoryBlog/static/cb0780cfe66b9bbd0ac218383ed6a687/8ff5a/003-01.png 240w,\n/devHistoryBlog/static/cb0780cfe66b9bbd0ac218383ed6a687/e85cb/003-01.png 480w,\n/devHistoryBlog/static/cb0780cfe66b9bbd0ac218383ed6a687/d9199/003-01.png 960w,\n/devHistoryBlog/static/cb0780cfe66b9bbd0ac218383ed6a687/07a9c/003-01.png 1440w,\n/devHistoryBlog/static/cb0780cfe66b9bbd0ac218383ed6a687/0bdcb/003-01.png 1579w\"\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 annotation punctuation\">@Configuration</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AppConfig</span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token annotation punctuation\">@Bean</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">MemberService</span> <span class=\"token function\">memberService</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\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><span class=\"token string\">\"call AppConfig.memberService\"</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\">MemberServiceImpl</span><span class=\"token punctuation\">(</span><span class=\"token function\">memberRepository</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token annotation punctuation\">@Bean</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">OrderService</span> <span class=\"token function\">orderService</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\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><span class=\"token string\">\"call AppConfig.orderService\"</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\">OrderServiceImpl</span><span class=\"token punctuation\">(</span><span class=\"token function\">memberRepository</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n \n  <span class=\"token annotation punctuation\">@Bean</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">MemberRepository</span> <span class=\"token function\">memberRepository</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\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><span class=\"token string\">\"call AppConfig.memberRepository\"</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\">MemoryMemberRepository</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></code></pre></div>\n<ul>\n<li>\n<p>출력결과</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">call AppConfig.memberService\ncall AppConfig.memberRepository\ncall AppConfig.orderService</code></pre></div>\n</li>\n</ul>\n<hr>\n<h4># AppConfig@CGLIB 예상 코드</h4>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Bean</span>\n<span class=\"token keyword\">public</span> <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\">if</span><span class=\"token punctuation\">(</span>dataService 가 이미 스프링 컨테이너에 등록되어 있으면<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> 스프링 컨테이너에서 찾아서 변환<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    기존 로직을 호출하여 dataService를 생성하고 스프링 컨테이너에 등록\n    <span class=\"token keyword\">return</span> 반환\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<hr>\n<ul>\n<li>\n<p>@Configuration 삭제 시 출력결과는</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">call AppConfig.memberService\ncall AppConfig.memberRepository\ncall AppConfig.orderService\ncall AppConfig.memberRepository\ncall AppConfig.memberRepository</code></pre></div>\n</li>\n</ul>","fields":{"tagSlugs":["/tags//"],"slug":"/history/posts/2020-11-14--003"},"frontmatter":{"title":"[스프링 핵심 원리 리뷰] @Configuration","tags":[""],"date":"2020-11-14","description":""}}},"pageContext":{"slug":"/history/posts/2020-11-14--003"}},"staticQueryHashes":[]}