<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>버리야 날자</title>
    <link>https://flyburi.tistory.com/</link>
    <description>IT관련, 프로그래밍, 책/영화/연극/뮤지컬 리뷰, 사는 이야기등을 담는 버리의 공간입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 12 Apr 2026 13:13:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>버리야</managingEditor>
    <image>
      <title>버리야 날자</title>
      <url>https://tistory1.daumcdn.net/tistory/72714/attach/54054580e00f44dda728d4d5037f9a91</url>
      <link>https://flyburi.tistory.com</link>
    </image>
    <item>
      <title>[Docker] no space left on device 해결 - Mac</title>
      <link>https://flyburi.tistory.com/630</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Mac에서 Docker로 elasticsearch를 실행하려고 하니, 'no space left on device' 오류를 만났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705607132833&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-&amp;gt; Please restart Elasticsearch to activate any plugins installed
Exception in thread &quot;main&quot; java.nio.file.FileSystemException: /tmp/elasticsearch-11008505465111459062: No space left on device
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:100)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:438)
at java.base/java.nio.file.Files.createDirectory(Files.java:699)
at java.base/java.nio.file.TempFileHelper.create(TempFileHelper.java:134)
at java.base/java.nio.file.TempFileHelper.createTempDirectory(TempFileHelper.java:171)
at java.base/java.nio.file.Files.createTempDirectory(Files.java:1017)
at org.elasticsearch.tools.launchers.Launchers.createTempDirectory(Launchers.java:55)
at org.elasticsearch.tools.launchers.TempDirectory.main(TempDirectory.java:43)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;docker desktop 에서의 no space left on device&amp;nbsp; 해결 방법&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker desktop &amp;gt; 상단의 톱니바퀴(Preferences) 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1513&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk8KN4/btsDASKVaWl/FZRyuzcZHfmkAuQsjo6SwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk8KN4/btsDASKVaWl/FZRyuzcZHfmkAuQsjo6SwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk8KN4/btsDASKVaWl/FZRyuzcZHfmkAuQsjo6SwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk8KN4%2FbtsDASKVaWl%2FFZRyuzcZHfmkAuQsjo6SwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1513&quot; height=&quot;246&quot; data-origin-width=&quot;1513&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Preferences &amp;gt; Resources &amp;gt; Advanced 에서, Disk Image size를 늘려주기 &amp;gt; 적용을 위해 Docker desktop 재시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(캡쳐 화면에서 80GB로 변경했다. 용량이 많이 남아서..)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eGOUdl/btsDGINinHL/h43fJMrioEMgKckdfNIIck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eGOUdl/btsDGINinHL/h43fJMrioEMgKckdfNIIck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eGOUdl/btsDGINinHL/h43fJMrioEMgKckdfNIIck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeGOUdl%2FbtsDGINinHL%2Fh43fJMrioEMgKckdfNIIck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1512&quot; height=&quot;702&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그외 해결방법,&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요없는 컨테이너와 이미지 삭제를 하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker&amp;nbsp;system&amp;nbsp;df&amp;nbsp;-v&amp;nbsp;명령을&amp;nbsp;실행하여&amp;nbsp;상세한&amp;nbsp;공간&amp;nbsp;사용&amp;nbsp;정보를&amp;nbsp;확인하거나,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker image ls 나&amp;nbsp; docker container ls -a 명령을 실행하여 이미지와 컨테이너 목록을 확인 다. 불필요한 객체가 많으면 docker system prune 명령을 실행하여 정리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Desktop은 맥 파일 시스템에 있는 단일 &quot;disk image&quot; 파일에 리눅스 컨테이너와 이미지를 저장한다. 이는 리눅스에서 Docker가 컨테이너와 이미지를 /var/lib/docker 디렉토리에 저장하는 것과 다르다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Docker Desktop&amp;nbsp;디스크 이미지 파일 위치찾기 :&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Preferences &amp;gt; Resources &amp;gt; Advanced &amp;gt; Disk Image location 확인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고하면 좋을 macfaqs :&amp;nbsp;&lt;a href=&quot;https://docs.docker.com/desktop/faqs/macfaqs/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.docker.com/desktop/faqs/macfaqs/&lt;/a&gt;&lt;/p&gt;</description>
      <category>backend</category>
      <category>docker</category>
      <category>docker desktop</category>
      <category>Docker error</category>
      <category>elasticsearch</category>
      <category>error</category>
      <category>MAC</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/630</guid>
      <comments>https://flyburi.tistory.com/630#entry630comment</comments>
      <pubDate>Fri, 19 Jan 2024 05:09:34 +0900</pubDate>
    </item>
    <item>
      <title>OpenAI GPT Store 출시 소식 및 팀 구독 추가</title>
      <link>https://flyburi.tistory.com/629</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;OpenAI&amp;nbsp;GPT&amp;nbsp;Store&amp;nbsp;출시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드디어, OpenAI가 GTP 스토어를 출시했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI가 최근 GPT 스토어를 선보이며 기술 업계에 새로운 전환점을 마련했습니다. 이번 출시는 인공지능 기술의 접근성과 유연성을 한 차원 높이는 중요한 발걸음으로, ChatGPT Plus, Team, Enterprise 사용자들에게 새로운 기회의 문을 열어주고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GPT Store의 탄생 배경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GTPs를 출시 이후에 두달동안 &lt;b&gt;300만개 이상의 GPTs&lt;/b&gt;가 생성되었습니다. 이러한 폭발적인 반응을 바탕으로, OpenAI는 사용자들이 유용하고 인기 있는 GPT를 쉽게 찾을 수 있도록 이 스토어를 제공한다고 &lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://openai.com/blog/introducing-the-gpt-store&quot;&gt;공식 블로그&lt;/a&gt;에 발표를 했습니다. 이는 사용자 생성 GPT의 허브 역할을 하며, 다양한 파트너 및 커뮤니티에 의해 개발된 GPT를 포함하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주간&amp;nbsp;GPT&amp;nbsp;소개와&amp;nbsp;개인화된&amp;nbsp;접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GPT 스토어는 ChatGPT Plus, Team, Enterprise 사용자를 대상&lt;/b&gt;으로 다양한 사용자 생성 GPT를 제공합니다. 스토어에는 파트너 및 커뮤니티에 의해 개발된 다양한 GPT가 포함되어 있으며, 매주 새로운 GPT를 특징으로 소개합니다. 또한, 사용자들은 자신들의 GPT를 스토어에 공유할 수 있으며, GPT 빌더들은 이용자 참여에 따라 수익을 얻을 수 있는 프로그램도 시작할 예정입니다. ChatGPT Team 고객은 개인화된 GPT 접근을 제공받으며, 엔터프라이즈 고객에게는 추가 관리 기능이 제공될 예정입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://chat.openai.com/gpts&quot;&gt;https://chat.openai.com/gpts&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1105&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kHB9u/btsDlmwTrky/10VKbKyJtjk4ihATnfyCS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kHB9u/btsDlmwTrky/10VKbKyJtjk4ihATnfyCS1/img.png&quot; data-alt=&quot;OpenAI blog의 GPTs 소개 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHB9u/btsDlmwTrky/10VKbKyJtjk4ihATnfyCS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkHB9u%2FbtsDlmwTrky%2F10VKbKyJtjk4ihATnfyCS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1105&quot; height=&quot;684&quot; data-origin-width=&quot;1105&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OpenAI blog의 GPTs 소개 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자 참여와 GPT 빌더 수익 프로그램&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자신의 GPT를 store에 공유하기&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Save your GPT for&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Everyone&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;Anyone with a link&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;will not be shown in the store).&lt;/li&gt;
&lt;li&gt;Verify your Builder Profile (&lt;b&gt;Settings&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Builder profile&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Enable your name or a verified website&lt;/b&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GPT 빌더 수익 프로그램&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1분기에는 GPT 빌더 수익 프로그램을 시작할 예정이고 첫번째로 미국 builders에게 먼저 사용자 참여를 기반으로 비용을 지불받는다고 합니다. 결제 기준에 대한 자세한 내용은 추후 확정되는 대로 안내가 될 예정이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;팀 Plan의 추가 기능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxGxEP/btsDkDTjja7/h7NOiOwJl81HASggJKKqgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxGxEP/btsDkDTjja7/h7NOiOwJl81HASggJKKqgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxGxEP/btsDkDTjja7/h7NOiOwJl81HASggJKKqgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxGxEP%2FbtsDkDTjja7%2Fh7NOiOwJl81HASggJKKqgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;641&quot; height=&quot;569&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번&amp;nbsp;GPT&amp;nbsp;스토어&amp;nbsp;출시와&amp;nbsp;함께,&amp;nbsp;팀&amp;nbsp;Plan이라는&amp;nbsp;새로운&amp;nbsp;서비스도&amp;nbsp;선보였습니다.&amp;nbsp;이는&amp;nbsp;GPT-4,&amp;nbsp;DALL&amp;middot;E,&amp;nbsp;Browsing,&amp;nbsp;Advanced&amp;nbsp;Data&amp;nbsp;분석&amp;nbsp;등과&amp;nbsp;같은&amp;nbsp;도구를&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;기능을&amp;nbsp;제공합니다.&amp;nbsp;팀&amp;nbsp;Plan은&amp;nbsp;workspace에서&amp;nbsp;GPT&amp;nbsp;생성&amp;nbsp;및&amp;nbsp;공유,&amp;nbsp;workspace&amp;nbsp;관리를&amp;nbsp;위한&amp;nbsp;관리자&amp;nbsp;콘솔&amp;nbsp;제공&amp;nbsp;등,&amp;nbsp;팀&amp;nbsp;작업의&amp;nbsp;효율성을&amp;nbsp;높이는&amp;nbsp;다양한&amp;nbsp;기능을&amp;nbsp;포함하고&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 plan에 더 자세히 알고 싶다면, &lt;a href=&quot;https://openai.com/chatgpt/team&quot;&gt;https://openai.com/chatgpt/team&lt;/a&gt;&amp;nbsp;에서 확인하세요&lt;/p&gt;
&lt;figure id=&quot;og_1704919816426&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ChatGPT Team&quot; data-og-description=&quot;A customized, always-improving superassistant for every member of your&amp;nbsp;team.&quot; data-og-host=&quot;openai.com&quot; data-og-source-url=&quot;https://openai.com/chatgpt/team&quot; data-og-url=&quot;https://openai.com/chatgpt/team&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bF6wvn/hyU2fgSUwf/S2KYQONGMPdQstUjK9wcT0/img.jpg?width=1000&amp;amp;height=562&amp;amp;face=0_0_1000_562,https://scrap.kakaocdn.net/dn/emST6s/hyU2f8ZL8W/SbBNhHqkCzIKwLSOwy9WlK/img.jpg?width=1000&amp;amp;height=562&amp;amp;face=0_0_1000_562,https://scrap.kakaocdn.net/dn/w8ovc/hyU2tsEACp/Y8kfi34Kve9kMupukHKJLk/img.jpg?width=8&amp;amp;height=10&amp;amp;face=0_0_8_10&quot;&gt;&lt;a href=&quot;https://openai.com/chatgpt/team&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://openai.com/chatgpt/team&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bF6wvn/hyU2fgSUwf/S2KYQONGMPdQstUjK9wcT0/img.jpg?width=1000&amp;amp;height=562&amp;amp;face=0_0_1000_562,https://scrap.kakaocdn.net/dn/emST6s/hyU2f8ZL8W/SbBNhHqkCzIKwLSOwy9WlK/img.jpg?width=1000&amp;amp;height=562&amp;amp;face=0_0_1000_562,https://scrap.kakaocdn.net/dn/w8ovc/hyU2tsEACp/Y8kfi34Kve9kMupukHKJLk/img.jpg?width=8&amp;amp;height=10&amp;amp;face=0_0_8_10');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ChatGPT Team&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A customized, always-improving superassistant for every member of your&amp;nbsp;team.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;openai.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI의&amp;nbsp;GPT&amp;nbsp;Store&amp;nbsp;출시는&amp;nbsp;인공지능&amp;nbsp;분야에서의&amp;nbsp;혁신적인&amp;nbsp;이정표로,&amp;nbsp;사용자&amp;nbsp;및&amp;nbsp;개발자&amp;nbsp;커뮤니티에&amp;nbsp;새로운&amp;nbsp;기회를&amp;nbsp;제공합니다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;기술의&amp;nbsp;발전뿐만&amp;nbsp;아니라,&amp;nbsp;사용자들의&amp;nbsp;창의적인&amp;nbsp;아이디어가&amp;nbsp;현실로&amp;nbsp;구현될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;플랫폼이&amp;nbsp;될&amp;nbsp;것으로&amp;nbsp;기대됩니다.&lt;/p&gt;</description>
      <category>AI</category>
      <category>AI</category>
      <category>ChatGPT</category>
      <category>ChatGPT Team</category>
      <category>GPT</category>
      <category>gptstore</category>
      <category>GPT스토어출시</category>
      <category>OpenAI</category>
      <category>생성형ai</category>
      <category>오픈AI</category>
      <category>인공지능</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/629</guid>
      <comments>https://flyburi.tistory.com/629#entry629comment</comments>
      <pubDate>Thu, 11 Jan 2024 05:55:44 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] Big Data Tools - Kafka IntelliJ Plugin</title>
      <link>https://flyburi.tistory.com/628</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 필수가 되어버린 event driven 개발을 하다보면, Kafka를 사용할 때가 많은데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka 클러스터에 연결하여 메세지를 produce한다던가 consume을 UI를 통해서 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IntelliJ 에서 Preferences &amp;gt; Plugins &amp;gt; Marketplace에서&amp;nbsp; 'Big Data Tools'를 검색하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://plugins.jetbrains.com/plugin/12494-big-data-tools&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://plugins.jetbrains.com/plugin/12494-big-data-tools&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1692777552994&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Big Data Tools - IntelliJ IDEs Plugin | Marketplace&quot; data-og-description=&quot;A bundle of plugins for data engineers and other specialists engaged with big data workloads. Installed in your favorite JetBrains IDE, Big Data Tools helps develop...&quot; data-og-host=&quot;plugins.jetbrains.com&quot; data-og-source-url=&quot;https://plugins.jetbrains.com/plugin/12494-big-data-tools&quot; data-og-url=&quot;https://plugins.jetbrains.com/plugin/12494-big-data-tools&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/f8TC7/hyTILgoXtd/Q2VV83KTWMmhmXr1mmHio1/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/djTCgx/hyTIGsCwYz/40sbVL3If1iVCwagZnQIq0/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600&quot;&gt;&lt;a href=&quot;https://plugins.jetbrains.com/plugin/12494-big-data-tools&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://plugins.jetbrains.com/plugin/12494-big-data-tools&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/f8TC7/hyTILgoXtd/Q2VV83KTWMmhmXr1mmHio1/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/djTCgx/hyTIGsCwYz/40sbVL3If1iVCwagZnQIq0/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Big Data Tools - IntelliJ IDEs Plugin | Marketplace&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A bundle of plugins for data engineers and other specialists engaged with big data workloads. Installed in your favorite JetBrains IDE, Big Data Tools helps develop...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;plugins.jetbrains.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;669&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYzgDo/btsr3b1mcey/kwHzUUML5QB9W2mCjrVGgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYzgDo/btsr3b1mcey/kwHzUUML5QB9W2mCjrVGgK/img.png&quot; data-alt=&quot;출처 : jetbrains 홈페이지 (https://plugins.jetbrains.com/plugin/21704-kafka)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYzgDo/btsr3b1mcey/kwHzUUML5QB9W2mCjrVGgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYzgDo%2Fbtsr3b1mcey%2FkwHzUUML5QB9W2mCjrVGgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1061&quot; height=&quot;669&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : jetbrains 홈페이지 (https://plugins.jetbrains.com/plugin/21704-kafka)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpdW37/btsr4XIhZ1B/mM6kX95Yp2oTQ90S96iPA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpdW37/btsr4XIhZ1B/mM6kX95Yp2oTQ90S96iPA0/img.png&quot; data-alt=&quot;출처 : jetbrains 홈페이지 (https://plugins.jetbrains.com/plugin/21704-kafka)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpdW37/btsr4XIhZ1B/mM6kX95Yp2oTQ90S96iPA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpdW37%2Fbtsr4XIhZ1B%2FmM6kX95Yp2oTQ90S96iPA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1061&quot; height=&quot;663&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;663&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : jetbrains 홈페이지 (https://plugins.jetbrains.com/plugin/21704-kafka)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;message 내용을 직접 보고 싶다면 위 화면과 같이 topic을 선택하여 consumer를 만들어서 start consuming을 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 나오지 않는다면, Range&amp;nbsp;and&amp;nbsp;Filters&amp;nbsp;&amp;gt;&amp;nbsp;Start&amp;nbsp;from 을 조절해서 선택해주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>backend</category>
      <category>Event Driven</category>
      <category>Kafka</category>
      <category>kafka consumer</category>
      <category>kafka producer</category>
      <category>kafka topic</category>
      <category>kafka ui</category>
      <category>인텔리제이</category>
      <category>인텔리제이플러그인</category>
      <category>카프카</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/628</guid>
      <comments>https://flyburi.tistory.com/628#entry628comment</comments>
      <pubDate>Wed, 23 Aug 2023 20:09:51 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 코틀린 MapStruct 적용 및 사용하기 (feat.gradle)</title>
      <link>https://flyburi.tistory.com/627</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서버 작업을 하면 빈번하게 필요한 Model과 DTO 변환을 필드 선언만 해놓으면 자동으로 변환해주는 MapStruct를 Java 작업할때 많이 사용하는데요. Kotlin에서도 적용해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Kotlin MapStruct 적용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle.kts 파일에 추가해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1662064759797&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// build.gradle.kts

plugins {
	kotlin(&quot;kapt&quot;) version &quot;1.7.10&quot;
}

subprojects {
	apply(plugin = &quot;kotlin-kapt&quot;)

	dependencies {
        implementation(&quot;org.mapstruct:mapstruct:1.5.2.Final&quot;)
        kapt(&quot;org.mapstruct:mapstruct-processor:1.5.2.Final&quot;)
        kaptTest(&quot;org.mapstruct:mapstruct-processor:1.5.2.Final&quot;)
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Kotlin MapStruct 사용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 Person(Model) 과 PersonDto(DTO)간의 매핑이 필요한다고 하면,&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;data class Person(var firstName: String?, var lastName: String?, var phoneNumber: String?, var birthdate: LocalDate?)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;data class PersonDto(var firstName: String?, var lastName: String?, var phone: String?, var birthdate: LocalDate?)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MapStruct Converter를 interface로 생성을 해줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MapStruct Mapper 정의&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;import org.mapstruct.Mapper

@Mapper
interface PersonConverter {

    @Mapping(source = &quot;phoneNumber&quot;, target = &quot;phone&quot;)
    fun convertToDto(person: Person) : PersonDto

    @InheritInverseConfiguration
    fun convertToModel(personDto: PersonDto) : Person

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mapper를 정의한후에 build를 해주면 자동으로 @Mapper 붙인 interface 이름에 Impl이 붙은 클래스가 generate 된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kotlin-annotation-processing 은 dependency에 추가한 kapt에 의해 동작하는 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한건, &lt;a href=&quot;https://kotlinlang.org/docs/kapt.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;kotlin 공식 홈페이지를 참고&lt;/a&gt;해주세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MapStruct는 선언된 Model과 DTO간의 이름이 같다면 자동으로 매핑을 해주고, 이름이 다를 경우는 @Mapping annotation을 이용해서 정의를 해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MapStruct Mapper를 사용하여 convert 해주기&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;val converter = Mappers.getMapper(PersonConverter::class.java) // or PersonConverterImpl()

val person = Person(&quot;Samuel&quot;, &quot;Jackson&quot;, &quot;0123 334466&quot;, LocalDate.of(1948, 12, 21))

val personDto = converter.convertToDto(person)
println(personDto)

val personModel = converter.convertToModel(personDto)
println(personModel)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin 1.1부터 반복적인 annotation 은 지원되지 않아서, @Mapping을 여러개 사용해야할 때는 Mapping-Annotation을 감싼 @Mappings를 사용해서 선언해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;  @Mappings(
        Mapping(source = &quot;majorVersion&quot;, target = &quot;major&quot;),
        Mapping(source = &quot;minorVersion&quot;, target = &quot;minor&quot;),
        Mapping(source = &quot;patchVersion&quot;, target = &quot;patch&quot;),
        Mapping(source = &quot;normalVersion&quot;, target = &quot;normal&quot;),
        Mapping(source = &quot;preReleaseVersion&quot;, target = &quot;preRelease&quot;)
)
fun convertToDto(version: Version): VersionDto&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;더 자세히..&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MapStruct 공식 홈페이지 :&amp;nbsp;&lt;a href=&quot;https://mapstruct.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mapstruct.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662065981038&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MapStruct &amp;ndash; Java bean mappings, the easy way!&quot; data-og-description=&quot;Java bean mappings, the easy way! Get started Download&quot; data-og-host=&quot;mapstruct.org&quot; data-og-source-url=&quot;https://mapstruct.org/&quot; data-og-url=&quot;https://mapstruct.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cYdq3Q/hyPEP8JNFW/YSIVhUTQrFxeaHllCkJmqk/img.png?width=2177&amp;amp;height=600&amp;amp;face=0_0_2177_600&quot;&gt;&lt;a href=&quot;https://mapstruct.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mapstruct.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cYdq3Q/hyPEP8JNFW/YSIVhUTQrFxeaHllCkJmqk/img.png?width=2177&amp;amp;height=600&amp;amp;face=0_0_2177_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MapStruct &amp;ndash; Java bean mappings, the easy way!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java bean mappings, the easy way! Get started Download&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mapstruct.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mapstruct 공식 github에서 mapstruct-kotlin의 아주 간단한 예제를 확인하실 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/mapstruct/mapstruct-examples/tree/main/mapstruct-kotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/mapstruct/mapstruct-examples/tree/main/mapstruct-kotlin&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662065986170&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - mapstruct/mapstruct-examples: Examples for using MapStruct&quot; data-og-description=&quot;Examples for using MapStruct. Contribute to mapstruct/mapstruct-examples development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/mapstruct/mapstruct-examples/tree/main/mapstruct-kotlin&quot; data-og-url=&quot;https://github.com/mapstruct/mapstruct-examples&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IxHKt/hyPECBxyCR/a6KjSs99W1c7PbIB7tLHFK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/mapstruct/mapstruct-examples/tree/main/mapstruct-kotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/mapstruct/mapstruct-examples/tree/main/mapstruct-kotlin&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IxHKt/hyPECBxyCR/a6KjSs99W1c7PbIB7tLHFK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - mapstruct/mapstruct-examples: Examples for using MapStruct&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Examples for using MapStruct. Contribute to mapstruct/mapstruct-examples development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>backend/Kotlin</category>
      <category>converter</category>
      <category>DTO</category>
      <category>gradle</category>
      <category>java</category>
      <category>kapt</category>
      <category>Kotlin</category>
      <category>Mapper</category>
      <category>mapstruct</category>
      <category>코틀린</category>
      <category>프로그래밍</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/627</guid>
      <comments>https://flyburi.tistory.com/627#entry627comment</comments>
      <pubDate>Fri, 2 Sep 2022 09:00:06 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] 안드로이드 스튜디오 ios emulator 빈 화면 해결 - blank white screen 오류</title>
      <link>https://flyburi.tistory.com/626</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;flutter 및 앱 개발 초보인 저는 flutter 프로젝트를 최초 생성후 ios emulator 로 앱 실행을 해보았었는데, 그땐 잘 나왔는데 어느날 한참 후 다시 실행을 시켜보니 화면이 그냥 하얗게만 나왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당황했지만, 구글링을 해보며 언제나 그렇듯 해결책을 찾아 봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;939&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nq6bt/btrKZ10KMO1/6LpkzkItTIXQWdKJeBU8q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nq6bt/btrKZ10KMO1/6LpkzkItTIXQWdKJeBU8q0/img.png&quot; data-alt=&quot;ios emulator blank white screen&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nq6bt/btrKZ10KMO1/6LpkzkItTIXQWdKJeBU8q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnq6bt%2FbtrKZ10KMO1%2F6LpkzkItTIXQWdKJeBU8q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;939&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;939&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ios emulator blank white screen&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시나 다시 xcode 관련 설정이 안된게 있나 확인하려고 flutter doctor를 실행해보았지만, 다 정상이네요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgv2YC/btrKZnQHM27/mUj5oQXYaKjuyffN9hpyYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgv2YC/btrKZnQHM27/mUj5oQXYaKjuyffN9hpyYk/img.png&quot; data-alt=&quot;flutter doctor 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgv2YC/btrKZnQHM27/mUj5oQXYaKjuyffN9hpyYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgv2YC%2FbtrKZnQHM27%2FmUj5oQXYaKjuyffN9hpyYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;311&quot; height=&quot;267&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flutter doctor 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flutter clean (시간이 조금..걸립니다.) 을 해보고 다시 에뮬레이터를 시작 후 앱 실행을 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flutter clean 작업시에는 무슨일을 하는지 간단히 나오네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnjbJp/btrK1g4b80R/xk1fS1UN6XByYboy16Slq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnjbJp/btrK1g4b80R/xk1fS1UN6XByYboy16Slq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnjbJp/btrK1g4b80R/xk1fS1UN6XByYboy16Slq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnjbJp%2FbtrK1g4b80R%2Fxk1fS1UN6XByYboy16Slq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;160&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짜잔, flutter clean을 한번 해주고 나니 정상적으로 화면이 떴네요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbsWZg/btrK2mLLXrB/qLuADcEa0DWjqg2XONQbS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbsWZg/btrK2mLLXrB/qLuADcEa0DWjqg2XONQbS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbsWZg/btrK2mLLXrB/qLuADcEa0DWjqg2XONQbS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbsWZg%2FbtrK2mLLXrB%2FqLuADcEa0DWjqg2XONQbS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;742&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flutter github issues에도 blank white screen 관련 많은 질문과 답변들이 있는걸로 봐서 흔히 겪는 현상인 것 같네요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/flutter/flutter/issues/22188&quot;&gt;https://github.com/flutter/flutter/issues/22188&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661892988528&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Blank white screen on launching my flutter app on iOS  &amp;middot; Issue #22188 &amp;middot; flutter/flutter&quot; data-og-description=&quot;Steps to Reproduce Run the app on the iPhoneX simulator or my iPhone 6s.(The app and the developer are all verified) The app runs Pod install and installs the application When the app launches a bl...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/flutter/flutter/issues/22188&quot; data-og-url=&quot;https://github.com/flutter/flutter/issues/22188&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EXOAm/hyPC0PSzWJ/SUAN16MKc2T4lErPjeWwNK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/flutter/flutter/issues/22188&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/flutter/flutter/issues/22188&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EXOAm/hyPC0PSzWJ/SUAN16MKc2T4lErPjeWwNK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Blank white screen on launching my flutter app on iOS &amp;middot; Issue #22188 &amp;middot; flutter/flutter&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Steps to Reproduce Run the app on the iPhoneX simulator or my iPhone 6s.(The app and the developer are all verified) The app runs Pod install and installs the application When the app launches a bl...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Mobile/앱개발_Flutter_ios_android</category>
      <category>AndroidStudio</category>
      <category>blankwhitescreen</category>
      <category>emulator</category>
      <category>flutter</category>
      <category>flutterclean</category>
      <category>IOS</category>
      <category>iosEmulator</category>
      <category>앱개발</category>
      <category>에뮬레이터</category>
      <category>플러터</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/626</guid>
      <comments>https://flyburi.tistory.com/626#entry626comment</comments>
      <pubDate>Thu, 1 Sep 2022 09:00:06 +0900</pubDate>
    </item>
    <item>
      <title>[Android Studio] Emulator 새창으로 띄우기 - Emulator Launch in tool window</title>
      <link>https://flyburi.tistory.com/625</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Android Studio에서 Emulator를 이용해서 개발하다 보면 Emulator가 새창에서 실행이 될때가 있는데, 항상 새창에서 실행되게 하는 방법입니다. 처음에 아무 Emulator 기본설정은&amp;nbsp; 하지 않으면 아래 화면처럼 답답하게 나오죠.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;993&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ECRjE/btrKVUV7SIq/EqYrKICllKaSXsIWsOyRk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ECRjE/btrKVUV7SIq/EqYrKICllKaSXsIWsOyRk0/img.png&quot; data-alt=&quot;Emulator&amp;amp;amp;nbsp;Dock Pinned&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ECRjE/btrKVUV7SIq/EqYrKICllKaSXsIWsOyRk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FECRjE%2FbtrKVUV7SIq%2FEqYrKICllKaSXsIWsOyRk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;993&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;993&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Emulator&amp;amp;nbsp;Dock Pinned&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 원하는 모습은 아래 화면처럼 Emulator가 단독으로 실행되는것처럼 떠있는 상태입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Standalone application 으로 떠 있는 화면)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;931&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l4nOh/btrKWBIRfKT/i1cvVzDIsS1124pQm9fk51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l4nOh/btrKWBIRfKT/i1cvVzDIsS1124pQm9fk51/img.png&quot; data-alt=&quot;Emulator Launch in tool window&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l4nOh/btrKWBIRfKT/i1cvVzDIsS1124pQm9fk51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl4nOh%2FbtrKWBIRfKT%2Fi1cvVzDIsS1124pQm9fk51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;413&quot; height=&quot;761&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;931&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Emulator Launch in tool window&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 View Mode가 Dock Pinned 로 되어있습니다. 여기서 Float 도 해보고, Window를 선택해봤지만 원하는 모습이 아니었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egF5AH/btrK2tIYi1h/4B6dIoQTCBKcUweJkCzkQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egF5AH/btrK2tIYi1h/4B6dIoQTCBKcUweJkCzkQ0/img.png&quot; data-alt=&quot;Emulator&amp;amp;amp;nbsp;Dock Pinned&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egF5AH/btrK2tIYi1h/4B6dIoQTCBKcUweJkCzkQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegF5AH%2FbtrK2tIYi1h%2F4B6dIoQTCBKcUweJkCzkQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;503&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Emulator&amp;amp;nbsp;Dock Pinned&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;View Mode : Float 로 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekpWOU/btrKWBB4yna/ABKVkJNXieK1lTX52shdgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekpWOU/btrKWBB4yna/ABKVkJNXieK1lTX52shdgK/img.png&quot; data-alt=&quot;Emulator Float&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekpWOU/btrKWBB4yna/ABKVkJNXieK1lTX52shdgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekpWOU%2FbtrKWBB4yna%2FABKVkJNXieK1lTX52shdgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;373&quot; height=&quot;537&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Emulator Float&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Android Studio -&amp;gt; Preference -&amp;gt; Tools -&amp;gt; Emulator&lt;span style=&quot;background-color: #ffffff; color: #232629;&quot;&gt;&lt;span&gt; 를 선택후, 오른쪽에 &lt;/span&gt;&lt;/span&gt;&quot;Launch in tool window&quot; 항목 체크해제!&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Apply 적용후, 기존에 Emulator가 동작중이었다면 다시 restart를 해줍니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp4pyQ/btrK2t3gKUp/ygI7ZxsRn4OK3GCogxvK00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp4pyQ/btrK2t3gKUp/ygI7ZxsRn4OK3GCogxvK00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp4pyQ/btrK2t3gKUp/ygI7ZxsRn4OK3GCogxvK00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp4pyQ%2FbtrK2t3gKUp%2FygI7ZxsRn4OK3GCogxvK00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;706&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짜잔~&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;931&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l4nOh/btrKWBIRfKT/i1cvVzDIsS1124pQm9fk51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l4nOh/btrKWBIRfKT/i1cvVzDIsS1124pQm9fk51/img.png&quot; data-alt=&quot;Emulator Launch in tool window 설정 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l4nOh/btrKWBIRfKT/i1cvVzDIsS1124pQm9fk51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl4nOh%2FbtrKWBIRfKT%2Fi1cvVzDIsS1124pQm9fk51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;338&quot; height=&quot;623&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;931&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Emulator Launch in tool window 설정 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Mobile/앱개발_Flutter_ios_android</category>
      <category>Android</category>
      <category>AndroidStudio</category>
      <category>appdevelope</category>
      <category>emulator</category>
      <category>EmulatorViewMode</category>
      <category>flutter</category>
      <category>안드로이드스튜디오</category>
      <category>앱개발</category>
      <category>에뮬레이터</category>
      <category>에뮬레이터뷰모드</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/625</guid>
      <comments>https://flyburi.tistory.com/625#entry625comment</comments>
      <pubDate>Wed, 31 Aug 2022 09:00:27 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 코틀린 값 비교 - Equality Checks</title>
      <link>https://flyburi.tistory.com/624</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin에서 == 연산자는 값이 같은지 비교하고, === 연산자는 참조값이 같은지 비교하는데 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a == b 처럼 쓰면 아래처럼 컴파일 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1661505784064&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (a == null) b == null else a.equals(b)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 초 간단 예제를 봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set, list 모두 동일한 결과이고 == 는 순서에 상관없이 set에 값이 같으면 true, === 는 객체 자체가 같은지 비교하니까 false로 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list는 == 은 값의 순서가 같아야지 true, === 는 다른 객체니까 false로 나옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1661548389857&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
  val book1 = setOf(&quot;book1&quot;,&quot;book2&quot;)
  val book2 = setOf(&quot;book1&quot;,&quot;book2&quot;)

  println(book1 == book2) // true
  println(book1 === book2) //false
  
  val book3 = listOf(&quot;book1&quot;,&quot;book2&quot;)
  val book4 = listOf(&quot;book1&quot;,&quot;book2&quot;)

  println(book3 == book4) //true
  println(book3 === book4) //false
  println(book3 != book4)   // false
  
  val book5 = listOf(&quot;book2&quot;, &quot;book1&quot;)
  println(book3 == book5) // false
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Mobile/앱개발_Flutter_ios_android</category>
      <category>Kotlin</category>
      <category>kotlinControlFlow</category>
      <category>코틀린</category>
      <category>코틀린값비교</category>
      <category>코틀린기초</category>
      <category>코틀린동등성</category>
      <category>코틀린리스트비교</category>
      <category>코틀린배열비교</category>
      <category>코틀린언어</category>
      <category>프로그래밍</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/624</guid>
      <comments>https://flyburi.tistory.com/624#entry624comment</comments>
      <pubDate>Sat, 27 Aug 2022 09:00:54 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] 안드로이드 스튜디오 AVD 에뮬레이터 실행 오류 - Android Virtual Device Error launching application on sdk gphone64 arm64.</title>
      <link>https://flyburi.tistory.com/623</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이제 막 Flutter 입문하여 만지작 거리던 중 오류를 만났습니다. 1일 1오류를 겪고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;코드넣는시간보다 오류해결하는 시간이 많지만 이겨내보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 스튜디오에서 에뮬레이터를 실행하여 앱을 띄울려고 하니 아래와 같은 에러를 만났습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcnBlX/btrKAMQwPRt/MT4B5K7LnFlhJkjYZHviqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcnBlX/btrKAMQwPRt/MT4B5K7LnFlhJkjYZHviqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcnBlX/btrKAMQwPRt/MT4B5K7LnFlhJkjYZHviqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcnBlX%2FbtrKAMQwPRt%2FMT4B5K7LnFlhJkjYZHviqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1107&quot; height=&quot;285&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류내용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Launching&amp;nbsp;lib/main.dart&amp;nbsp;on&amp;nbsp;sdk&amp;nbsp;gphone64&amp;nbsp;arm64&amp;nbsp;in&amp;nbsp;debug&amp;nbsp;mode...&lt;br /&gt;Running&amp;nbsp;Gradle&amp;nbsp;task&amp;nbsp;'assembleDebug'...&lt;br /&gt;F/RenderEngine(27100):&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;generate&amp;nbsp;SkImage.&amp;nbsp;isTextureValid:1&amp;nbsp;dataspace:513&lt;br /&gt;F/RenderEngine(27206):&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;generate&amp;nbsp;SkImage.&amp;nbsp;isTextureValid:1&amp;nbsp;dataspace:513&lt;br /&gt;F/RenderEngine(27335):&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;generate&amp;nbsp;SkImage.&amp;nbsp;isTextureValid:1&amp;nbsp;dataspace:513&lt;br /&gt;F/RenderEngine(27480):&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;generate&amp;nbsp;SkImage.&amp;nbsp;isTextureValid:1&amp;nbsp;dataspace:513&lt;br /&gt;✓&amp;nbsp;&amp;nbsp;Built&amp;nbsp;build/app/outputs/flutter-apk/app-debug.apk.&lt;br /&gt;cmd:&amp;nbsp;Can't&amp;nbsp;find&amp;nbsp;service:&amp;nbsp;activity&lt;br /&gt;Installing&amp;nbsp;build/app/outputs/flutter-apk/app.apk...&lt;br /&gt;Error:&amp;nbsp;ADB&amp;nbsp;exited&amp;nbsp;with&amp;nbsp;exit&amp;nbsp;code&amp;nbsp;1&lt;br /&gt;Performing&amp;nbsp;Streamed&amp;nbsp;Install&lt;br /&gt;&lt;br /&gt;adb: failed to install /Users/buri/dev/project-toy/flutter/build/app/outputs/flutter-apk/app.apk: cmd: Can't find service: package&lt;br /&gt;Error&amp;nbsp;launching&amp;nbsp;application&amp;nbsp;on&amp;nbsp;sdk&amp;nbsp;gphone64&amp;nbsp;arm64.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;방법 1. 일단 Device manager에서 Wipe Data를 해보았습니다.&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM6TAP/btrKAks9Mrb/0JbbKvOF5M9jIuG2EinL6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM6TAP/btrKAks9Mrb/0JbbKvOF5M9jIuG2EinL6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM6TAP/btrKAks9Mrb/0JbbKvOF5M9jIuG2EinL6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM6TAP%2FbtrKAks9Mrb%2F0JbbKvOF5M9jIuG2EinL6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;531&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래와 같은 오류를 만났습니다. 아마도 비정상적으로 에뮬레이터가 중단되서 그런가...라고 짐작해봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PNxqA/btrKzLkxTnF/4NNAgtOs14eYmrSd0V26E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PNxqA/btrKzLkxTnF/4NNAgtOs14eYmrSd0V26E1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PNxqA/btrKzLkxTnF/4NNAgtOs14eYmrSd0V26E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPNxqA%2FbtrKzLkxTnF%2F4NNAgtOs14eYmrSd0V26E1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;162&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;avd가 있는 경로에 lock 파일을 지우고 다시 시도해보라고 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZfrZ4/btrKzOBntrY/ITLairVw7iOn3OOZpkZtt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZfrZ4/btrKzOBntrY/ITLairVw7iOn3OOZpkZtt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZfrZ4/btrKzOBntrY/ITLairVw7iOn3OOZpkZtt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZfrZ4%2FbtrKzOBntrY%2FITLairVw7iOn3OOZpkZtt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;435&quot; height=&quot;187&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ cd&amp;nbsp;~/.android/avd/Pixel_3a_API_33_arm64-v8a.avd&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ rm *.lock&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알려준대로 해봤지만 소용이 없습니다. 여전히 같은 오류가 뜹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;방법 2. 설치되어있는 에뮬레이터 Emulator 삭제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;feat.이렇게 하기는 귀찮지만... 다른 방법을 몰라서)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flutter 초보에겐 에뮬레이터를 지우고 설치해도 잃을게 없기때문에 과감히 삭제를 해봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tl9R7/btrKwVut9th/coSHNcJf135pu9QEx7DWL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tl9R7/btrKwVut9th/coSHNcJf135pu9QEx7DWL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tl9R7/btrKwVut9th/coSHNcJf135pu9QEx7DWL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftl9R7%2FbtrKwVut9th%2FcoSHNcJf135pu9QEx7DWL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;439&quot; height=&quot;347&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmbTBY/btrKA3YRvXM/KDyMIWeZDOLMtV8Ocx9XT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmbTBY/btrKA3YRvXM/KDyMIWeZDOLMtV8Ocx9XT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmbTBY/btrKA3YRvXM/KDyMIWeZDOLMtV8Ocx9XT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmbTBY%2FbtrKA3YRvXM%2FKDyMIWeZDOLMtV8Ocx9XT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;142&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다시 Create virtual device 를 클릭해서 생성을 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vAAIa/btrKzZixjR6/6Y8NdNQnMzB9qU5SOALdhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vAAIa/btrKzZixjR6/6Y8NdNQnMzB9qU5SOALdhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vAAIa/btrKzZixjR6/6Y8NdNQnMzB9qU5SOALdhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvAAIa%2FbtrKzZixjR6%2F6Y8NdNQnMzB9qU5SOALdhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;252&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 잘 모르니, 원래 기본으로 등록되어있던 에뮬레이터를 똑같이 선택해줍니다. Pixel 3a&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;803&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFkt77/btrKBZPmRy9/dKKY5YnPyT4OLIH39hXxl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFkt77/btrKBZPmRy9/dKKY5YnPyT4OLIH39hXxl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFkt77/btrKBZPmRy9/dKKY5YnPyT4OLIH39hXxl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFkt77%2FbtrKBZPmRy9%2FdKKY5YnPyT4OLIH39hXxl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;803&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;803&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 33을 Download 해줘야, 하단의 Next 버튼이 활성화됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdERPc/btrKze8o8Ii/T1sqbdGzheWKOwbx3HnHPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdERPc/btrKze8o8Ii/T1sqbdGzheWKOwbx3HnHPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdERPc/btrKze8o8Ii/T1sqbdGzheWKOwbx3HnHPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdERPc%2FbtrKze8o8Ii%2FT1sqbdGzheWKOwbx3HnHPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;996&quot; height=&quot;797&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;797&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 시작되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;679&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxMvXZ/btrKAMQxiK5/Q8fsIuZmmmOSbmd5KWRY4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxMvXZ/btrKAMQxiK5/Q8fsIuZmmmOSbmd5KWRY4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxMvXZ/btrKAMQxiK5/Q8fsIuZmmmOSbmd5KWRY4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxMvXZ%2FbtrKAMQxiK5%2FQ8fsIuZmmmOSbmd5KWRY4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;894&quot; height=&quot;679&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;679&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBLYqT/btrKA2lnwsI/a37a9TFPdcNx1bDtURCj6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBLYqT/btrKA2lnwsI/a37a9TFPdcNx1bDtURCj6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBLYqT/btrKA2lnwsI/a37a9TFPdcNx1bDtURCj6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBLYqT%2FbtrKA2lnwsI%2Fa37a9TFPdcNx1bDtURCj6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;901&quot; height=&quot;675&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 API 33이 다운로드가 끝났으니, 맨 하단의 Next를 클릭해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EYaKl/btrKzgLXwE6/BhIzOgMQ41p8KqkbC8YPMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EYaKl/btrKzgLXwE6/BhIzOgMQ41p8KqkbC8YPMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EYaKl/btrKzgLXwE6/BhIzOgMQ41p8KqkbC8YPMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEYaKl%2FbtrKzgLXwE6%2FBhIzOgMQ41p8KqkbC8YPMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;996&quot; height=&quot;796&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AVD Name에 이름을 기본으로 써도 되고 원하시면 바꾸면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Finish 버튼을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpzuCW/btrKwVuugqc/JxhcWUqMsE6Bru763D1BK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpzuCW/btrKwVuugqc/JxhcWUqMsE6Bru763D1BK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpzuCW/btrKwVuugqc/JxhcWUqMsE6Bru763D1BK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpzuCW%2FbtrKwVuugqc%2FJxhcWUqMsE6Bru763D1BK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;995&quot; height=&quot;801&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 에뮬레이터를 실행후, 앱 run을 해주니 짜잔~ 하고 다시 동작되네요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음부턴 에뮬레이터를 소중히 꺼줘야 겠네요. -_-&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Mobile/앱개발_Flutter_ios_android</category>
      <category>AndroidStudio</category>
      <category>AndroidVirtualDevice</category>
      <category>AVD</category>
      <category>flutter</category>
      <category>안드로이드스튜디오</category>
      <category>안드로이드스튜디오오류해결</category>
      <category>앱개발</category>
      <category>에뮬레이터</category>
      <category>플러터</category>
      <category>플러터오류해결</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/623</guid>
      <comments>https://flyburi.tistory.com/623#entry623comment</comments>
      <pubDate>Fri, 26 Aug 2022 09:00:42 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] Andriod Studio Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE] 오류 해결</title>
      <link>https://flyburi.tistory.com/622</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Android Studio 에서 Emulator를 이용해서 run 실행을 했을때 오류가 발생했을때 해결방법을 알아본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;adb: failed to install /Users/buri/dev/project-toy/positive/build/app/outputs/flutter-apk/app.apk: Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE]&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 내용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Launching&amp;nbsp;lib/main.dart&amp;nbsp;on&amp;nbsp;sdk&amp;nbsp;gphone64&amp;nbsp;arm64&amp;nbsp;in&amp;nbsp;debug&amp;nbsp;mode...&lt;br /&gt;Running&amp;nbsp;Gradle&amp;nbsp;task&amp;nbsp;'assembleDebug'...&lt;br /&gt;✓&amp;nbsp;&amp;nbsp;Built&amp;nbsp;build/app/outputs/flutter-apk/app-debug.apk.&lt;br /&gt;Installing&amp;nbsp;build/app/outputs/flutter-apk/app.apk...&lt;br /&gt;Error:&amp;nbsp;ADB&amp;nbsp;exited&amp;nbsp;with&amp;nbsp;exit&amp;nbsp;code&amp;nbsp;1&lt;br /&gt;Performing&amp;nbsp;Streamed&amp;nbsp;Install&lt;br /&gt;&lt;br /&gt;adb: failed to install /Users/buri/dev/project-toy/positive/build/app/outputs/flutter-apk/app.apk: Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE]&lt;br /&gt;Error&amp;nbsp;launching&amp;nbsp;application&amp;nbsp;on&amp;nbsp;sdk&amp;nbsp;gphone64&amp;nbsp;arm64.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류 내용 캡쳐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uYwbH/btrKb87a31z/1xvj9OhHDkAgCKEVhKsTg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uYwbH/btrKb87a31z/1xvj9OhHDkAgCKEVhKsTg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uYwbH/btrKb87a31z/1xvj9OhHDkAgCKEVhKsTg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuYwbH%2FbtrKb87a31z%2F1xvj9OhHDkAgCKEVhKsTg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1210&quot; height=&quot;288&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Device Manager 를 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRVizj/btrKeiVZbrq/tCEVYwnhNqzMdYQjk3JFt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRVizj/btrKeiVZbrq/tCEVYwnhNqzMdYQjk3JFt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRVizj/btrKeiVZbrq/tCEVYwnhNqzMdYQjk3JFt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRVizj%2FbtrKeiVZbrq%2FtCEVYwnhNqzMdYQjk3JFt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;749&quot; height=&quot;391&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Android Virtual Device 화면의 하단의 Show Advanced Settings를 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFJSEw/btrKcw8yVBp/Pigwg6DtqJPMAgEGEwR7Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFJSEw/btrKcw8yVBp/Pigwg6DtqJPMAgEGEwR7Rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFJSEw/btrKcw8yVBp/Pigwg6DtqJPMAgEGEwR7Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFJSEw%2FbtrKcw8yVBp%2FPigwg6DtqJPMAgEGEwR7Rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;990&quot; height=&quot;672&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크롤을 내려 Memory and Storage의 Internal Storage가 기본 800MB로 잡혀있는 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r9R7v/btrKhmcK3Ee/y6mAxwpEukEdEkKccv8gR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r9R7v/btrKhmcK3Ee/y6mAxwpEukEdEkKccv8gR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r9R7v/btrKhmcK3Ee/y6mAxwpEukEdEkKccv8gR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr9R7v%2FbtrKhmcK3Ee%2Fy6mAxwpEukEdEkKccv8gR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;997&quot; height=&quot;671&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Internal Storage : 기본값 800 MB -&amp;gt; 4096MB 정도로 늘려주고, Finish 버튼 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvxVLA/btrJ8qOh3cS/WhmrPEhTxwvi5YMKQXKlP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvxVLA/btrJ8qOh3cS/WhmrPEhTxwvi5YMKQXKlP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvxVLA/btrJ8qOh3cS/WhmrPEhTxwvi5YMKQXKlP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvxVLA%2FbtrJ8qOh3cS%2FWhmrPEhTxwvi5YMKQXKlP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;998&quot; height=&quot;677&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;바꾼 설정값은 자동으로 반영되지 않기 때문에, 수동으로 AVD의 풀다운메뉴를 열고 데이터 지워주는 작업이 필요하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Device Manager에서 다음 표시를 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSBWxz/btrJ8l8g0OV/38EkkVLayDMenLKZnot7k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSBWxz/btrJ8l8g0OV/38EkkVLayDMenLKZnot7k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSBWxz/btrJ8l8g0OV/38EkkVLayDMenLKZnot7k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSBWxz%2FbtrJ8l8g0OV%2F38EkkVLayDMenLKZnot7k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;256&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Wipe Data 를 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KOc3h/btrKgsj1aGQ/cJ4IgAPYAhUKaQHGBpOQ31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KOc3h/btrKgsj1aGQ/cJ4IgAPYAhUKaQHGBpOQ31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KOc3h/btrKgsj1aGQ/cJ4IgAPYAhUKaQHGBpOQ31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKOc3h%2FbtrKgsj1aGQ%2FcJ4IgAPYAhUKaQHGBpOQ31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;415&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Confirm Data Wipe 에서 Yes를 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P3LLB/btrKdRdw3Dd/3hKmt37S1UnOk2K53jQhn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P3LLB/btrKdRdw3Dd/3hKmt37S1UnOk2K53jQhn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P3LLB/btrKdRdw3Dd/3hKmt37S1UnOk2K53jQhn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP3LLB%2FbtrKdRdw3Dd%2F3hKmt37S1UnOk2K53jQhn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;137&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 완료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 Run 실행하면, 정상적으로 실행된것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brONg4/btrKaysd5Jb/feHBCwLbJlGqS1PLA7BkYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brONg4/btrKaysd5Jb/feHBCwLbJlGqS1PLA7BkYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brONg4/btrKaysd5Jb/feHBCwLbJlGqS1PLA7BkYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrONg4%2FbtrKaysd5Jb%2FfeHBCwLbJlGqS1PLA7BkYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;275&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Mobile/앱개발_Flutter_ios_android</category>
      <category>Android</category>
      <category>AndroidStudio</category>
      <category>AndroidVirtualDevice</category>
      <category>flutter</category>
      <category>IOS</category>
      <category>안드로이드스튜디오</category>
      <category>에뮬레이터오류</category>
      <category>플러터</category>
      <category>플러터앱</category>
      <category>플러터오류해결</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/622</guid>
      <comments>https://flyburi.tistory.com/622#entry622comment</comments>
      <pubDate>Wed, 24 Aug 2022 09:00:01 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] Android Studio 프로젝트 생성 및 앱 실행</title>
      <link>https://flyburi.tistory.com/621</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Android Studio 2021.2.1 Patch 2버전 기준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flutter plugin 설치되어있어야 한다. 설치되어있지 않다면 설치!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/79T7v/btrJWyy42e3/6fvSclFomGSgpq890gpmMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/79T7v/btrJWyy42e3/6fvSclFomGSgpq890gpmMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/79T7v/btrJWyy42e3/6fvSclFomGSgpq890gpmMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F79T7v%2FbtrJWyy42e3%2F6fvSclFomGSgpq890gpmMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;598&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 재시작을 해주면 Projects &amp;gt; New Flutter Project 가 생겼다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pfU8T/btrJSMY3wFl/VFIKnV9DY5sheAwQlo18C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pfU8T/btrJSMY3wFl/VFIKnV9DY5sheAwQlo18C0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pfU8T/btrJSMY3wFl/VFIKnV9DY5sheAwQlo18C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpfU8T%2FbtrJSMY3wFl%2FVFIKnV9DY5sheAwQlo18C0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;598&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flutter &amp;gt; New Project에 설치한 Flutter SDK의 경로를 선택해준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;621&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOMBzb/btrJWndrZAb/vKFGOSAkvRdiqILUKLtn6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOMBzb/btrJWndrZAb/vKFGOSAkvRdiqILUKLtn6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOMBzb/btrJWndrZAb/vKFGOSAkvRdiqILUKLtn6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOMBzb%2FbtrJWndrZAb%2FvKFGOSAkvRdiqILUKLtn6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;621&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;621&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project 이름, 위치, 패키지명을 원하는대로 입력해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KptQ3/btrJYfZss3Y/bT3kInY6S1ykLRsyv8YwLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KptQ3/btrJYfZss3Y/bT3kInY6S1ykLRsyv8YwLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KptQ3/btrJYfZss3Y/bT3kInY6S1ykLRsyv8YwLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKptQ3%2FbtrJYfZss3Y%2FbT3kInY6S1ykLRsyv8YwLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;617&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 생성 완료! main.dart 파일에 예제로 코드가 미리 입력되어있는 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLA8sQ/btrJTQtTTBr/CcmrpVlmN08C2p4lT4pYH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLA8sQ/btrJTQtTTBr/CcmrpVlmN08C2p4lT4pYH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLA8sQ/btrJTQtTTBr/CcmrpVlmN08C2p4lT4pYH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLA8sQ%2FbtrJTQtTTBr%2FCcmrpVlmN08C2p4lT4pYH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1135&quot; height=&quot;999&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 실행을 위해 오른쪽 상단에 원하는 디바이스 Simulator를 선택해도 되고, 간단하게 Chrome(Web) 으로 띄워보겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GrqPJ/btrKks59oG1/DxFgfatWEGnOPkdOCSmgKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GrqPJ/btrKks59oG1/DxFgfatWEGnOPkdOCSmgKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GrqPJ/btrKks59oG1/DxFgfatWEGnOPkdOCSmgKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGrqPJ%2FbtrKks59oG1%2FDxFgfatWEGnOPkdOCSmgKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;296&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 실행 화면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 하단의 + 버튼을 누르면 누른만큼 숫자가 카운팅되서 증가하는 예제이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;785&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3GgV9/btrJYezuHRT/9JTFhXZcVSPToG1zNPAhok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3GgV9/btrJYezuHRT/9JTFhXZcVSPToG1zNPAhok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3GgV9/btrJYezuHRT/9JTFhXZcVSPToG1zNPAhok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3GgV9%2FbtrJYezuHRT%2F9JTFhXZcVSPToG1zNPAhok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;785&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;785&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhUoNm/btrJWmliiY4/qKIxTSRcjfSepmvqPMBiBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhUoNm/btrJWmliiY4/qKIxTSRcjfSepmvqPMBiBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhUoNm/btrJWmliiY4/qKIxTSRcjfSepmvqPMBiBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhUoNm%2FbtrJWmliiY4%2FqKIxTSRcjfSepmvqPMBiBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;781&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Mobile/앱개발_Flutter_ios_android</category>
      <category>AndroidStudio</category>
      <category>AppDeveloper</category>
      <category>flutter</category>
      <category>flutterproject</category>
      <category>안드로이드스튜디오</category>
      <category>앱개발</category>
      <category>프로그램개발</category>
      <category>플러터</category>
      <category>플러터프로젝트</category>
      <category>플러터프로젝트생성</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/621</guid>
      <comments>https://flyburi.tistory.com/621#entry621comment</comments>
      <pubDate>Tue, 23 Aug 2022 09:00:43 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 가변 컬렉션과 읽기 전용 컬렉션 구분하기</title>
      <link>https://flyburi.tistory.com/619</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이펙티브 코틀린 책을 읽고 간단히 정리해본 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이템1. 가변성을 제한하라. - 가변&amp;nbsp;컬렉션과&amp;nbsp;읽기&amp;nbsp;전용&amp;nbsp;컬렉션&amp;nbsp;구분하기 중에서&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;읽기&amp;nbsp;전용&amp;nbsp;&amp;nbsp;컬렉션&lt;/b&gt;&lt;br /&gt;Iterable,&amp;nbsp;Collection,&amp;nbsp;Set,&amp;nbsp;List&amp;nbsp;인터페이스&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;읽고&amp;nbsp;쓸수&amp;nbsp;있는&amp;nbsp;컬렉션&lt;/b&gt;&lt;br /&gt;MutableIterable,&amp;nbsp;MutableCollection,&amp;nbsp;MutableSet,&amp;nbsp;MutableList&amp;nbsp;인터페이스&lt;br /&gt;-&amp;nbsp;읽기전용&amp;nbsp;인터페이스를&amp;nbsp;상속&amp;nbsp;받아,&amp;nbsp;변경을&amp;nbsp;위한&amp;nbsp;메서드만&amp;nbsp;추가.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Iterable 과 MutableIterable 인터페이스&lt;/p&gt;
&lt;pre id=&quot;code_1659405605910&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package kotlin.collections

import kotlin.internal.PlatformDependent

/**
 * Classes that inherit from this interface can be represented as a sequence of elements that can
 * be iterated over.
 * @param T the type of element being iterated over. The iterator is covariant in its element type.
 */
public interface Iterable&amp;lt;out T&amp;gt; {
    /**
     * Returns an iterator over the elements of this object.
     */
    public operator fun iterator(): Iterator&amp;lt;T&amp;gt;
}

/**
 * Classes that inherit from this interface can be represented as a sequence of elements that can
 * be iterated over and that supports removing elements during iteration.
 * @param T the type of element being iterated over. The mutable iterator is invariant in its element type.
 */
public interface MutableIterable&amp;lt;out T&amp;gt; : Iterable&amp;lt;T&amp;gt; {
    /**
     * Returns an iterator over the elements of this sequence that supports removing elements during iteration.
     */
    override fun iterator(): MutableIterator&amp;lt;T&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;코틀린에서 컬렉션을 진짜로 불변(immutable)하게 만들지 않고 읽기 전용으로 설계한 것은 더 많은 자유를 얻을 수 있다.&lt;br /&gt;코틀린은&amp;nbsp;내부적으로&amp;nbsp;immutable&amp;nbsp;하지&amp;nbsp;않은&amp;nbsp;컬렉션을&amp;nbsp;외부적으로&amp;nbsp;Immutable하게&amp;nbsp;보이게&amp;nbsp;만들어서&amp;nbsp;얻어지는&amp;nbsp;안정성이&amp;nbsp;있지만,&amp;nbsp;개발자가&amp;nbsp;'시스템&amp;nbsp;해킹'을&amp;nbsp;시도해서&amp;nbsp;&lt;b&gt;다운캐스팅&lt;/b&gt;을&amp;nbsp;할때가&amp;nbsp;문제가&amp;nbsp;된다.&lt;br /&gt;&lt;b&gt;리스트를&amp;nbsp;읽기&amp;nbsp;전용으로&amp;nbsp;리턴하면&amp;nbsp;이를&amp;nbsp;읽기전용으로만&amp;nbsp;사용해야&amp;nbsp;한다.&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;컬렉션&amp;nbsp;다운캐스팅은&amp;nbsp;계약을&amp;nbsp;위반하고&amp;nbsp;추상화를&amp;nbsp;무시하는&amp;nbsp;행위.&amp;nbsp;코드가&amp;nbsp;안전하지&amp;nbsp;않고,&amp;nbsp;예측하지&amp;nbsp;못한&amp;nbsp;결과를&amp;nbsp;초래한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659405671214&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
    val list = listOf(1, 2, 3)

    // 이렇게 하면 안된다.
    if (list is MutableList) {
        list.add(4)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;읽기&amp;nbsp;전용&amp;nbsp;컬렉션을&amp;nbsp;mutable로&amp;nbsp;변경해야&amp;nbsp;한다면,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;복제(copy)를&amp;nbsp;통해서&amp;nbsp;새로운&amp;nbsp;mutable&amp;nbsp;컬렉션을&amp;nbsp;만드는&amp;nbsp;list.toMutableList를&amp;nbsp;활용해야&amp;nbsp;한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659405678437&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
    val list = listOf(1, 2, 3)

    val mutableList = list.toMutableList()
    mutableList.add(4)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;User라는 immutable 객체가 있고, 성(surname)을 변경해야 한다면, withSurname과 같은 메서드를 제공해서, 자신을 수정한 새로운 객체를 만들어 낼 수 있게 해야한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659405739447&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
    var user = User(&quot;Maja&quot;,&quot;Markewic2&quot;)
    user = user.withSurname(&quot;Moskata&quot;)
    print(user) // User(name=Maja,surname=Moskata)
}

class User(
    val name: String,
    val surname: String
) {
    fun withSurname(surname: String) = User(name, surname)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>backend/Kotlin</category>
      <category>effectiveKotlin</category>
      <category>immutable</category>
      <category>JVM</category>
      <category>Kotlin</category>
      <category>Programming</category>
      <category>val</category>
      <category>이펙티브코틀린</category>
      <category>코틀린</category>
      <category>프로그래밍</category>
      <category>프로그래밍언어</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/619</guid>
      <comments>https://flyburi.tistory.com/619#entry619comment</comments>
      <pubDate>Tue, 2 Aug 2022 20:00:39 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 읽기 전용 프로퍼티 - val property</title>
      <link>https://flyburi.tistory.com/618</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;다음 내용은 이펙티브 코틀린 책을 읽고 간단히 정리해본 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이템1. 가변성을 제한하라. - 읽기 전용 프로퍼티(val) 중에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽기 전용 프로퍼티인 val에 대해 정리해보자.&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;val a = 10
//a = 20 // 재할당 불가.

val list = mutableListOf(1, 2, 3) // 읽기 전용 프로퍼티(val)로 선언되었어도 mutable 객체를 담고 있다면 내부적으로 변환 가능
list.add(4)
print(list)

//list = mutableListOf(5) //val 로 선언되었다면 재할당이 불가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'프로퍼티를 읽을 수만 있다는 속성(읽기 전용)'과 '값이 변할 수 없는 것(가변성)'을 구분해서 생각해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var 프로퍼티를 사용하는 val 프로퍼티는 var 프로퍼티가 변할 때 변할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;fun main() {
    println(fullName)
    name = &quot;Maja&quot;
    println(fullName)

    // -- 결과 --
    // Marcin Moskata
    // Maja Moskata
}


var name: String = &quot;Marcin&quot;
var surname: String = &quot;Moskata&quot;
val fullName
    get() =&quot;$name $surname&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린의 프로퍼티는 기본적으로 캡슐화되어있고, 추가적으로 게터(getter)와 세터(setter)를 가질 수 있다. - 코틀린은 API를 변경하거나 정의할 때 굉장히 유연하다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;var은 getter,setter를 모두 제공하지만, val은 변경불가하기 때문에 getter만 제공한다.&lt;br /&gt;val을 var로 오버라이드 가능.&lt;br /&gt;val은 값이 변경될 수 있기는 하지만 프로퍼티 레퍼런스 자체를 변경할 수 없으므로 동기화 문제를 줄일 수 있다.&lt;br /&gt;그래서 일반적으로 var 보다 val을 많이 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;val은&amp;nbsp;읽기&amp;nbsp;전용&amp;nbsp;프로퍼티지만,&amp;nbsp;불변(immutable)은&amp;nbsp;아니다.&lt;br /&gt;완전히&amp;nbsp;변경할&amp;nbsp;필요가&amp;nbsp;없다면&amp;nbsp;final로&amp;nbsp;선언.&lt;/p&gt;</description>
      <category>backend/Kotlin</category>
      <category>effectiveKotlin</category>
      <category>Kotlin</category>
      <category>Programming</category>
      <category>val</category>
      <category>개발자</category>
      <category>이펙티브코틀린</category>
      <category>읽기전용프로퍼티</category>
      <category>코틀린</category>
      <category>프로그래밍</category>
      <category>프로그래밍언어</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/618</guid>
      <comments>https://flyburi.tistory.com/618#entry618comment</comments>
      <pubDate>Sat, 30 Jul 2022 12:02:11 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] WebClient DataBufferLimitException WebFlux 오류 해결</title>
      <link>https://flyburi.tistory.com/617</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;글 작성시의 버전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Springboot : 2.3 버전 /&amp;nbsp;Spring webflux : 5.2 버전&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;WebClient를 통해 데이터를 가져오는데 데이터의 용량이 너무 커서 메모리 버퍼사이즈가 초과해서&lt;/p&gt;
&lt;pre id=&quot;code_1649543992400&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;에러가 발생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;application&amp;nbsp;memory&amp;nbsp;이슈를&amp;nbsp;피하기&amp;nbsp;위해&amp;nbsp;Codecs는&amp;nbsp;버퍼&amp;nbsp;데이터&amp;nbsp;사이즈를&amp;nbsp;제한을&amp;nbsp;두었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본값으로&amp;nbsp;256KB이고,&amp;nbsp;만약&amp;nbsp;이&amp;nbsp;값이&amp;nbsp;충분하지&amp;nbsp;않을&amp;nbsp;경우에는 기본 코덱 설정값을 바꿔줘야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;WebClient를 build시 codec 설정을 넣어주면 되는데요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;특정사이즈(예 10MB)로 하고 싶다면?&lt;span&gt;&amp;nbsp;&lt;/span&gt;10 * 1024 * 1024&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;버퍼사이즈를 무한대로 하고 싶다고 하면 : -1&amp;nbsp; 로 설정해주면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1649544196057&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder()
            .codecs(configurer -&amp;gt; configurer.defaultCodecs()
            .maxInMemorySize(10 * 1024 * 1024) //10MB로 설정
            //.maxInMemorySize(-1)) //제한없음
            .build(); 

this.webClient = webClientBuilder.exchangeStrategies(exchangeStrategies);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Spring에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;AbstractDataBufferDecoder 구현을 살펴보면 기본값인 256KB로 세팅이 되어있는걸 알 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1649544211917&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Abstract base class for {@code Decoder} implementations that can decode
 * a {@code DataBuffer} directly to the target element type.
 *
 * &amp;lt;p&amp;gt;Sub-classes must implement {@link #decodeDataBuffer} to provide a way to
 * transform a {@code DataBuffer} to the target data type. The default
 * {@link #decode} implementation transforms each individual data buffer while
 * {@link #decodeToMono} applies &quot;reduce&quot; and transforms the aggregated buffer.
 *
 * &amp;lt;p&amp;gt;Sub-classes can override {@link #decode} in order to split the input stream
 * along different boundaries (e.g. on new line characters for {@code String})
 * or always reduce to a single data buffer (e.g. {@code Resource}).
 *
 * @author Rossen Stoyanchev
 * @since 5.0
 * @param &amp;lt;T&amp;gt; the element type
 */
@SuppressWarnings(&quot;deprecation&quot;)
public abstract class AbstractDataBufferDecoder&amp;lt;T&amp;gt; extends AbstractDecoder&amp;lt;T&amp;gt; {

	private int maxInMemorySize = 256 * 1024;


	protected AbstractDataBufferDecoder(MimeType... supportedMimeTypes) {
		super(supportedMimeTypes);
	}


	/**
	 * Configure a limit on the number of bytes that can be buffered whenever
	 * the input stream needs to be aggregated. This can be a result of
	 * decoding to a single {@code DataBuffer},
	 * {@link java.nio.ByteBuffer ByteBuffer}, {@code byte[]},
	 * {@link org.springframework.core.io.Resource Resource}, {@code String}, etc.
	 * It can also occur when splitting the input stream, e.g. delimited text,
	 * in which case the limit applies to data buffered between delimiters.
	 * &amp;lt;p&amp;gt;By default this is set to 256K.
	 * @param byteCount the max number of bytes to buffer, or -1 for unlimited
	 * @since 5.1.11
	 */
	public void setMaxInMemorySize(int byteCount) {
		this.maxInMemorySize = byteCount;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-framework/blob/main/spring-core/src/main/java/org/springframework/core/codec/AbstractDataBufferDecoder.java&quot;&gt;https://github.com/spring-projects/spring-framework/blob/main/spring-core/src/main/java/org/springframework/core/codec/AbstractDataBufferDecoder.java&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1649544001745&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - spring-projects/spring-framework: Spring Framework&quot; data-og-description=&quot;Spring Framework. Contribute to spring-projects/spring-framework development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/spring-projects/spring-framework/blob/main/spring-core/src/main/java/org/springframework/core/codec/AbstractDataBufferDecoder.java&quot; data-og-url=&quot;https://github.com/spring-projects/spring-framework&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbyVVA/hyNYB5EO2X/p4Tj8VlWoIR1637gQkNCo1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-framework/blob/main/spring-core/src/main/java/org/springframework/core/codec/AbstractDataBufferDecoder.java&quot; data-source-url=&quot;https://github.com/spring-projects/spring-framework/blob/main/spring-core/src/main/java/org/springframework/core/codec/AbstractDataBufferDecoder.java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbyVVA/hyNYB5EO2X/p4Tj8VlWoIR1637gQkNCo1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - spring-projects/spring-framework: Spring Framework&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Framework. Contribute to spring-projects/spring-framework development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외. SpringFramework - MaxInMemorySize 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-framework/blob/main/src/docs/asciidoc/web/webflux-webclient.adoc#maxinmemorysize&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/spring-projects/spring-framework/blob/main/src/docs/asciidoc/web/webflux-webclient.adoc#maxinmemorysize&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로, Spring 버전에 따라 이전 버전에서는 코드에서가 아닌 application.yml 파일에서 property 값을 수정해주면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1649544312580&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  codec:
    max-in-memory-size: 10MB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>backend/Spring</category>
      <category>DataBufferLimitException</category>
      <category>error</category>
      <category>exception</category>
      <category>java</category>
      <category>springframework</category>
      <category>WebClient</category>
      <category>WebFlux</category>
      <category>메모리사이즈</category>
      <category>자바개발</category>
      <category>프로그래밍</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/617</guid>
      <comments>https://flyburi.tistory.com/617#entry617comment</comments>
      <pubDate>Sun, 10 Apr 2022 07:47:54 +0900</pubDate>
    </item>
    <item>
      <title>[Python, Selenium] Selenium webdriver executable_path deprecated warning 해결</title>
      <link>https://flyburi.tistory.com/616</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python version : 3.9&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selenium version : 4.1.0&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chrome driver verison :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Latest stable&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;release:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://chromedriver.storage.googleapis.com/index.html?path=97.0.4692.71/&quot;&gt;ChromeDriver 97.0.4692.71&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python + selenium을 아래 코드로 작성하니 deprecated warning이 떴다&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;from selenium import webdriver

driver = webdriver.Chrome(executable_path='/Users/buri/Downloads/chromedriver')
driver.get(url)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console output:&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DeprecationWarning:&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;executable_path&amp;nbsp;has&amp;nbsp;been&amp;nbsp;deprecated,&amp;nbsp;please&amp;nbsp;pass&amp;nbsp;in&amp;nbsp;a&amp;nbsp;Service&amp;nbsp;object&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;webdriver-manager 설치 하기 :&amp;nbsp; pip install webdriver-manager&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 수정&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get(url)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console output:&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;======&amp;nbsp;WebDriver&amp;nbsp;manager&amp;nbsp;======&lt;br /&gt;Current&amp;nbsp;google-chrome&amp;nbsp;version&amp;nbsp;is&amp;nbsp;97.0.4692&lt;br /&gt;Get&amp;nbsp;LATEST&amp;nbsp;chromedriver&amp;nbsp;version&amp;nbsp;for&amp;nbsp;97.0.4692&amp;nbsp;google-chrome&lt;br /&gt;There&amp;nbsp;is&amp;nbsp;no&amp;nbsp;[mac64]&amp;nbsp;chromedriver&amp;nbsp;for&amp;nbsp;browser&amp;nbsp;&amp;nbsp;in&amp;nbsp;cache&lt;br /&gt;Trying&amp;nbsp;to&amp;nbsp;download&amp;nbsp;new&amp;nbsp;driver&amp;nbsp;from&amp;nbsp;&lt;a href=&quot;https://chromedriver.storage.googleapis.com/97.0.4692.71/chromedriver_mac64.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://chromedriver.storage.googleapis.com/97.0.4692.71/chromedriver_mac64.zip&lt;/a&gt;&lt;br /&gt;Driver&amp;nbsp;has&amp;nbsp;been&amp;nbsp;saved&amp;nbsp;in&amp;nbsp;cache&amp;nbsp;[/Users/buri/.wdm/drivers/chromedriver/mac64/97.0.4692.71]&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://stackoverflow.com/questions/64717302/deprecationwarning-executable-path-has-been-deprecated-selenium-python&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/64717302/deprecationwarning-executable-path-has-been-deprecated-selenium-python&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1641572465227&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;DeprecationWarning: executable_path has been deprecated selenium python&quot; data-og-description=&quot;I am using sublime to code python scripts. The following code is for selenium in python to install the driver automatically by using the webdriver_manager package # pip install webdriver-manager from&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/64717302/deprecationwarning-executable-path-has-been-deprecated-selenium-python&quot; data-og-url=&quot;https://stackoverflow.com/questions/64717302/deprecationwarning-executable-path-has-been-deprecated-selenium-python&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/v7LLz/hyM0HFybs9/2iIZRBf2scvuSMuc3hTAG0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/64717302/deprecationwarning-executable-path-has-been-deprecated-selenium-python&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/64717302/deprecationwarning-executable-path-has-been-deprecated-selenium-python&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/v7LLz/hyM0HFybs9/2iIZRBf2scvuSMuc3hTAG0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;DeprecationWarning: executable_path has been deprecated selenium python&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I am using sublime to code python scripts. The following code is for selenium in python to install the driver automatically by using the webdriver_manager package # pip install webdriver-manager from&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>backend</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/616</guid>
      <comments>https://flyburi.tistory.com/616#entry616comment</comments>
      <pubDate>Sun, 9 Jan 2022 01:01:01 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] 사용하지 않는 import문 자동으로 삭제되도록 설정</title>
      <link>https://flyburi.tistory.com/615</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하던 코드를 삭제한 경우 아래처럼 import문이 그대로 남아있는 경우가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z5CZt/btrpU17SYcg/mlnxGceyfiyNRdk9Engrk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z5CZt/btrpU17SYcg/mlnxGceyfiyNRdk9Engrk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z5CZt/btrpU17SYcg/mlnxGceyfiyNRdk9Engrk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ5CZt%2FbtrpU17SYcg%2FmlnxGceyfiyNRdk9Engrk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;541&quot; height=&quot;221&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IntelliJ &amp;gt; Code &amp;gt; Optimize Imports 인 단축키 control + option + O(mac 키보드 기준)를 사용할 수도 있지만..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xaVDu/btrpP36Zwht/234H6hPihPOm4PEqNogHm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xaVDu/btrpP36Zwht/234H6hPihPOm4PEqNogHm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xaVDu/btrpP36Zwht/234H6hPihPOm4PEqNogHm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxaVDu%2FbtrpP36Zwht%2F234H6hPihPOm4PEqNogHm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;342&quot; height=&quot;790&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;790&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동으로 설정하기 위해 Preferences &amp;gt; Editor &amp;gt; General &amp;gt; Auto Import &amp;gt; Optimize Imports on the fly을 클릭해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(단, 언어를 여러개 사용중이시라면 언어별 Editor별로 Optimize Imports on the fly에 체크!를 해야합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java Editor 를 사용중이시라면 Java 영역의 Optimize Imports on the fly에 체크!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1595&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wNWw4/btrpRX6aDWH/jZkQMfjaevr22vxq21etF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wNWw4/btrpRX6aDWH/jZkQMfjaevr22vxq21etF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wNWw4/btrpRX6aDWH/jZkQMfjaevr22vxq21etF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwNWw4%2FbtrpRX6aDWH%2FjZkQMfjaevr22vxq21etF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1595&quot; height=&quot;836&quot; data-origin-width=&quot;1595&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin Editor를 사용중이시라면 Kotlin 영역의 Optimize Imports on the fly에 체크!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXVn3V/btrK1iuiRzx/3s1Jm6bmjuNEKAKvO3qjAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXVn3V/btrK1iuiRzx/3s1Jm6bmjuNEKAKvO3qjAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXVn3V/btrK1iuiRzx/3s1Jm6bmjuNEKAKvO3qjAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXVn3V%2FbtrK1iuiRzx%2F3s1Jm6bmjuNEKAKvO3qjAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;434&quot; height=&quot;119&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Computer 그리고 Developer/Tip</category>
      <category>idea</category>
      <category>Intellij</category>
      <category>Kotlin</category>
      <category>개발</category>
      <category>안쓰는imports제거</category>
      <category>인텔리제이</category>
      <category>인텔리제이팁</category>
      <category>자바</category>
      <category>코틀린</category>
      <category>프로그래밍</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/615</guid>
      <comments>https://flyburi.tistory.com/615#entry615comment</comments>
      <pubDate>Wed, 5 Jan 2022 22:31:00 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Python 3.9 버전 'HTMLParser' object has no attribute 'unescape' 오류 해결</title>
      <link>https://flyburi.tistory.com/614</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;python 설치 후에 한동안 사용하지 않아 upgrade가 필요했나 봄.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python 파일을 만들어 수행하려고 하니 'HTMLParser' object has no attribute 'unescape' 오류가 발생.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1초 해결.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;pip3 install --upgrade setuptools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# pip3 install --upgrade setuptools&lt;br /&gt;Requirement&amp;nbsp;already&amp;nbsp;satisfied:&amp;nbsp;setuptools&amp;nbsp;in&amp;nbsp;/usr/local/lib/python3.9/site-packages&amp;nbsp;(54.1.2)&lt;br /&gt;Collecting&amp;nbsp;setuptools&lt;br /&gt;&amp;nbsp;&amp;nbsp;Downloading&amp;nbsp;setuptools-60.2.0-py3-none-any.whl&amp;nbsp;(953&amp;nbsp;kB)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|████████████████████████████████|&amp;nbsp;953&amp;nbsp;kB&amp;nbsp;11.2&amp;nbsp;MB/s&lt;br /&gt;Installing&amp;nbsp;collected&amp;nbsp;packages:&amp;nbsp;setuptools&lt;br /&gt;&amp;nbsp;&amp;nbsp;Attempting&amp;nbsp;uninstall:&amp;nbsp;setuptools&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Found&amp;nbsp;existing&amp;nbsp;installation:&amp;nbsp;setuptools&amp;nbsp;54.1.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Uninstalling&amp;nbsp;setuptools-54.1.2:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Successfully&amp;nbsp;uninstalled&amp;nbsp;setuptools-54.1.2&lt;br /&gt;Successfully&amp;nbsp;installed&amp;nbsp;setuptools-60.2.0&lt;br /&gt;WARNING:&amp;nbsp;You&amp;nbsp;are&amp;nbsp;using&amp;nbsp;pip&amp;nbsp;version&amp;nbsp;21.0.1;&amp;nbsp;however,&amp;nbsp;version&amp;nbsp;21.3.1&amp;nbsp;is&amp;nbsp;available.&lt;br /&gt;You&amp;nbsp;should&amp;nbsp;consider&amp;nbsp;upgrading&amp;nbsp;via&amp;nbsp;the&amp;nbsp;'/usr/local/opt/python@3.9/bin/python3.9&amp;nbsp;-m&amp;nbsp;pip&amp;nbsp;install&amp;nbsp;--upgrade&amp;nbsp;pip'&amp;nbsp;command.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덧붙여, pip install --upgrade pip 도 해주시는게 좋을 듯하여 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# pip3 install --upgrade pip&lt;br /&gt;Requirement&amp;nbsp;already&amp;nbsp;satisfied:&amp;nbsp;pip&amp;nbsp;in&amp;nbsp;/usr/local/lib/python3.9/site-packages&amp;nbsp;(21.0.1)&lt;br /&gt;Collecting&amp;nbsp;pip&lt;br /&gt;&amp;nbsp;&amp;nbsp;Downloading&amp;nbsp;pip-21.3.1-py3-none-any.whl&amp;nbsp;(1.7&amp;nbsp;MB)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|████████████████████████████████|&amp;nbsp;1.7&amp;nbsp;MB&amp;nbsp;11.3&amp;nbsp;MB/s&lt;br /&gt;Installing&amp;nbsp;collected&amp;nbsp;packages:&amp;nbsp;pip&lt;br /&gt;&amp;nbsp;&amp;nbsp;Attempting&amp;nbsp;uninstall:&amp;nbsp;pip&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Found&amp;nbsp;existing&amp;nbsp;installation:&amp;nbsp;pip&amp;nbsp;21.0.1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Uninstalling&amp;nbsp;pip-21.0.1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Successfully&amp;nbsp;uninstalled&amp;nbsp;pip-21.0.1&lt;br /&gt;Successfully&amp;nbsp;installed&amp;nbsp;pip-21.3.1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;&lt;a href=&quot;https://stackoverflow.com/questions/65640476/pip3-on-python3-9-fails-on-htmlparser-object-has-no-attribute-unescape&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/65640476/pip3-on-python3-9-fails-on-htmlparser-object-has-no-attribute-unescape&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>python</category>
      <category>stackoverflow</category>
      <category>개발</category>
      <category>코딩</category>
      <category>파이썬</category>
      <category>프로그래밍</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/614</guid>
      <comments>https://flyburi.tistory.com/614#entry614comment</comments>
      <pubDate>Mon, 3 Jan 2022 12:13:24 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] Plugin - Grep Console</title>
      <link>https://flyburi.tistory.com/613</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리제이에서 수많은 로그속에서 허덕이다 보면, 꼭 필요한 플러그인이 있다. 바로 Grep Console.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;1320&quot; width=&quot;537&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bihdld/btrhKKtDwRT/k0sw1pgR6FY4BGYnTPg2Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bihdld/btrhKKtDwRT/k0sw1pgR6FY4BGYnTPg2Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bihdld/btrhKKtDwRT/k0sw1pgR6FY4BGYnTPg2Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbihdld%2FbtrhKKtDwRT%2Fk0sw1pgR6FY4BGYnTPg2Wk%2Fimg.png&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;1320&quot; width=&quot;537&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그 레벨(log level)에 따라서 다른 백그라운드 색으로 설정을 해서 로그레벨을 인지 할 수가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;390&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZR04a/btrhNphLZNA/8yyCrqYKFa2J8fCG0fBlU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZR04a/btrhNphLZNA/8yyCrqYKFa2J8fCG0fBlU1/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://plugins.jetbrains.com/plugin/7125-grep-console&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZR04a/btrhNphLZNA/8yyCrqYKFa2J8fCG0fBlU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZR04a%2FbtrhNphLZNA%2F8yyCrqYKFa2J8fCG0fBlU1%2Fimg.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;390&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;https://plugins.jetbrains.com/plugin/7125-grep-console&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 많은 터미널의 로그 중에서 내가 grep 해서 보고 싶은 것만 오른쪽 클릭해서 볼 수 있고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) TIMESTAMP라는 텍스트만 grep 해서 보고 싶다면&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;text-align: center; caret-color: transparent; font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot; src=&quot;https://blog.kakaocdn.net/dn/bQQWV5/btrhN3yMHM4/ZmIGMT7rQBmw4BAzn7eJgk/img.png&quot; data-image-src=&quot;https://blog.kakaocdn.net/dn/bQQWV5/btrhN3yMHM4/ZmIGMT7rQBmw4BAzn7eJgk/img.png&quot; data-origin-width=&quot;2190&quot; data-origin-height=&quot;634&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해당하는 텍스트만 필터링해서 쓸 수 있다. 초 간단!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2724&quot; data-origin-height=&quot;762&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJWigr/btrhMuqk8pl/xFVbWyIrE9FaKwS6w2Km21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJWigr/btrhMuqk8pl/xFVbWyIrE9FaKwS6w2Km21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJWigr/btrhMuqk8pl/xFVbWyIrE9FaKwS6w2Km21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJWigr%2FbtrhMuqk8pl%2FxFVbWyIrE9FaKwS6w2Km21%2Fimg.png&quot; data-origin-width=&quot;2724&quot; data-origin-height=&quot;762&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치는 IntelliJ IDEA Plugin - marketplace에서 &quot;Grep Console&quot;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://plugins.jetbrains.com/plugin/7125-grep-console&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://plugins.jetbrains.com/plugin/7125-grep-console&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1634209618467&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Grep Console - IntelliJ IDEs Plugin | Marketplace&quot; data-og-description=&quot;Grep, tail, filter, highlight... everything you need for a console (JS/NPM/GoLand/... Terminals are not supported - IDEA-216442). Also can highlight the editor...&quot; data-og-host=&quot;plugins.jetbrains.com&quot; data-og-source-url=&quot;https://plugins.jetbrains.com/plugin/7125-grep-console&quot; data-og-url=&quot;https://plugins.jetbrains.com/plugin/7125-grep-console&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cxKNi6/hyLYATJg1u/rXbk9j1rg92WvdBjcgqze1/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/gsh1M/hyLYueTxDy/ktjOFr2WcdmePgUb1vpCRK/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600&quot;&gt;&lt;a href=&quot;https://plugins.jetbrains.com/plugin/7125-grep-console&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://plugins.jetbrains.com/plugin/7125-grep-console&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cxKNi6/hyLYATJg1u/rXbk9j1rg92WvdBjcgqze1/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/gsh1M/hyLYueTxDy/ktjOFr2WcdmePgUb1vpCRK/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Grep Console - IntelliJ IDEs Plugin | Marketplace&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Grep, tail, filter, highlight... everything you need for a console (JS/NPM/GoLand/... Terminals are not supported - IDEA-216442). Also can highlight the editor...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;plugins.jetbrains.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer 그리고 Developer/Tip</category>
      <category>grep-console</category>
      <category>idea</category>
      <category>IntelliJIDEA</category>
      <category>JetBrains</category>
      <category>plugin</category>
      <category>인텔리제이</category>
      <category>플러그인</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/613</guid>
      <comments>https://flyburi.tistory.com/613#entry613comment</comments>
      <pubDate>Fri, 15 Oct 2021 07:00:46 +0900</pubDate>
    </item>
    <item>
      <title>[SpringData JPA] query method predicate keywords - null이 아닌 빈값을 제외하고 싶을때</title>
      <link>https://flyburi.tistory.com/612</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;보통은 컬럼값에 null이거나 null이 아닌 값을 쿼리하는 경우가 많은데 가끔 빈값으로 데이터를 채워 넣고 빈값(&quot;&quot;)이 아닌 데이터를 쿼리해서 리턴해야할 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&amp;nbsp;phoneNumber != &quot;&quot;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Data JPA에서 기본으로 제공하는 repository method명에는 isEmpty나 isBlank같은건 없다. 대신 method의 argument로 빈값(&quot;&quot;)을 넘겨 받도록 하고 Not 을 써주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1634170785131&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;repository.findByPhoneNumberNot(&quot;&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1634170885938&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Spring Data JPA - Reference Documentation&quot; data-og-description=&quot;Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query(&amp;quot;delete from User u where u.active = false&amp;quot;) void del&quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords&quot; data-og-url=&quot;https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Data JPA - Reference Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query(&quot;delete from User u where u.active = false&quot;) void del&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>backend/Spring</category>
      <category>JPA</category>
      <category>Repository</category>
      <category>Spring</category>
      <category>Spring-data</category>
      <category>SpringData</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/612</guid>
      <comments>https://flyburi.tistory.com/612#entry612comment</comments>
      <pubDate>Thu, 14 Oct 2021 19:49:42 +0900</pubDate>
    </item>
    <item>
      <title>brew로 gradle 버전 업그레이드</title>
      <link>https://flyburi.tistory.com/610</link>
      <description>&lt;pre id=&quot;code_1617112061841&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* What went wrong:

An exception occurred applying plugin request [id: 'org.springframework.boot', version: '2.3.3.(']

&amp;gt; Failed to apply plugin [id 'org.springframework.boot']

   &amp;gt; Spring Boot plugin requires Gradle 5 (5.6.x only) or Gradle 6 (6.3 or later). The current version is Gradle 5.1

* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Spring Boot 2.3.3.RELEASE 버전에서 Gradle 5.6.X 버전이나 Gradle 6(6.3 or later)을 써야하는 에러로그를 만났다.&lt;/p&gt;
&lt;p&gt;Mac에서 brew를 이용한 초간단 gradle upgrade 해주기.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;현재버전 확인&lt;/p&gt;
&lt;pre id=&quot;code_1617112046901&quot; class=&quot;java&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# gradle --version

------------------------------------------------------------
Gradle 5.1
------------------------------------------------------------

Build time:   2019-01-02 18:57:47 UTC
Revision:     d09c2e354576ac41078c322815cc6db2b66d976e

Kotlin DSL:   1.1.0
Kotlin:       1.3.11
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          11.0.1 (Oracle Corporation 11.0.1+13)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1617112139666&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# brew upgrade gradle
Updating Homebrew...
==&amp;gt; Auto-updated Homebrew!
Updated 3 taps (homebrew/core, homebrew/cask and homebrew/services).
==&amp;gt; New Formulae
djl-serving         leaf-proxy          linux-pam           moto                multitime           orgalorg            pure                python-tk@3.9       rosa-cli            spaceship           timg
==&amp;gt; Updated Formulae
Updated 310 formulae.
==&amp;gt; New Casks
betelguese                                  drovio                                      free42-decimal                              offset-explorer                             xbar
coinomi-wallet                              free42-binary                               northernspysoftware-colorpicker             sonobus
==&amp;gt; Updated Casks
Updated 243 casks.
==&amp;gt; Deleted Casks
adobe-dng-converter                         craft                                       kafka-tool                                  use-engine                                  veonim

==&amp;gt; Upgrading 1 outdated package:
gradle 5.1 -&amp;gt; 6.8.3
==&amp;gt; Upgrading gradle 5.1 -&amp;gt; 6.8.3
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/openjdk-15.0.2.mojave.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/25b541c2de04a0ccbe55a2c53ce1c1de32ae0da23e162ecb38ca3ecda630efd9?response-content-disposition=attachment%3Bfilename%3D%22openjdk-15.0.2.mojave.bottle.tar.gz%22&amp;amp;P
######################################################################## 100.0%
==&amp;gt; Downloading https://services.gradle.org/distributions/gradle-6.8.3-all.zip
==&amp;gt; Downloading from https://downloads.gradle-dn.com/distributions/gradle-6.8.3-all.zip
######################################################################## 100.0%
==&amp;gt; Installing dependencies for gradle: openjdk
==&amp;gt; Installing gradle dependency: openjdk
==&amp;gt; Pouring openjdk-15.0.2.mojave.bottle.tar.gz
==&amp;gt; Caveats
For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

openjdk is keg-only, which means it was not symlinked into /usr/local,
because macOS provides similar software and installing this software in
parallel can cause all kinds of trouble.

If you need to have openjdk first in your PATH, run:
  echo 'export PATH=&quot;/usr/local/opt/openjdk/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc

For compilers to find openjdk you may need to set:
  export CPPFLAGS=&quot;-I/usr/local/opt/openjdk/include&quot;

==&amp;gt; Summary
   /usr/local/Cellar/openjdk/15.0.2: 614 files, 323.9MB
==&amp;gt; Installing gradle
   /usr/local/Cellar/gradle/6.8.3: 11,239 files, 259MB, built in 23 seconds
Removing: /usr/local/Cellar/gradle/4.6... (199 files, 79.3MB)
Removing: /usr/local/Cellar/gradle/5.1... (13,265 files, 234.9MB)
==&amp;gt; Caveats
==&amp;gt; openjdk
For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

openjdk is keg-only, which means it was not symlinked into /usr/local,
because macOS provides similar software and installing this software in
parallel can cause all kinds of trouble.

If you need to have openjdk first in your PATH, run:
  echo 'export PATH=&quot;/usr/local/opt/openjdk/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc

For compilers to find openjdk you may need to set:
  export CPPFLAGS=&quot;-I/usr/local/opt/openjdk/include&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;업그레이드 적용이 잘되었는지 확인&lt;/p&gt;
&lt;pre id=&quot;code_1617112164409&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# gradle --version

------------------------------------------------------------
Gradle 6.8.3
------------------------------------------------------------

Build time:   2021-02-22 16:13:28 UTC
Revision:     9e26b4a9ebb910eaa1b8da8ff8575e514bc61c78

Kotlin:       1.4.20
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM:          15.0.2 (Oracle Corporation 15.0.2+7)
OS:           Mac OS X 10.14 x86_64&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer 그리고 Developer/Mac</category>
      <category>BREW</category>
      <category>build</category>
      <category>gradle</category>
      <category>MAC</category>
      <category>Spring</category>
      <category>springboot</category>
      <category>springframework</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/610</guid>
      <comments>https://flyburi.tistory.com/610#entry610comment</comments>
      <pubDate>Tue, 30 Mar 2021 22:51:07 +0900</pubDate>
    </item>
    <item>
      <title>[Junit5] SpringBoot 2에 JUnit5 적용</title>
      <link>https://flyburi.tistory.com/609</link>
      <description>&lt;p&gt;이 문서는 SpringBoot2.0 의 기본인 Junit4 대신에 Junit5를 적용해보면서 정리해봅니다. (기준 버전 junit 5.5.1, SpringBoot 2.0 버전)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://junit.org/junit5/docs/current/user-guide&quot;&gt;공식 문서&lt;/a&gt;의 축약 버전입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고. SpringBoot 2.2.0 버전에서는 junit5 에서는 기본으로 변경됨.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes#junit-5&quot;&gt;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes#junit-5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;Junit5적용-Junit5?&quot;&gt;JUnit5 ?&lt;br /&gt;&lt;br /&gt;&lt;/h1&gt;
&lt;p&gt;JUnit 5은 기존버전과 다르게 3개의 sub-project로 이뤄져있다.&lt;/p&gt;
&lt;p&gt;JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage&lt;/p&gt;
&lt;p&gt;&lt;b&gt;JUnit Platform&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: JVM 기반 테스팅 프레임워크를 실행시키기 위한 기반 모듈. Launcher and TestEngine APIs.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;JUnit Jupiter&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; Junit5를 테스트하고 확장 모델을 지원하기 위한 모듈&lt;/p&gt;
&lt;p&gt;&lt;b&gt;JUnit Vintage&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; JUnit3와 JUnit4 기반의 테스트를 JUnit Platform에서 실행시키기 위한 TestEngine을 제공하는 모듈&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;지원하는 자바 버전&lt;br /&gt;Junit5는 런타임시 Java8(또는 그 이상)을 필요로 하고, 하위 버전의 jdk로도 컴파일은 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;SpringBoot2에 JUnit적용하기&lt;/h2&gt;
&lt;p&gt;SpringBoot 2.2.0 버전에서는 junit5 에서는 기본으로 변경됨.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes#junit-5&quot;&gt;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes#junit-5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;SpringBoot 2.2.0 이전 버전에서의 junit5 설정&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;junit-platform-engine과&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;junit-platform-commons 라이브러리를 추가로 지정했는데 그 원인은&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://flyburi.com/607&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1575336551462&quot; class=&quot;javascript&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;testImplementation('org.springframework.boot:spring-boot-starter-test') {
 exclude module: 'junit'
}
testImplementation(&quot;org.junit.jupiter:junit-jupiter-api:5.5.1&quot;) {
 exclude module:'junit-platform-commons'
}
testRuntimeOnly(&quot;org.junit.jupiter:junit-jupiter-engine:5.5.1&quot;)
testRuntimeOnly(&quot;org.junit.platform:junit-platform-engine:1.5.1&quot;)
testRuntimeOnly(&quot;org.junit.platform:junit-platform-commons:1.5.1&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Junit5적용-@DisplayName&quot;&gt;@DisplayName&lt;/h2&gt;
&lt;p&gt;기존에 method명으로 표현하기 부족했던 테스트명을 따로 정할 수 있다. 클래스와 메소드에 붙일 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1566439484793&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.junit.jupiter.api.DisplayName;

import org.junit.jupiter.api.Test;



@DisplayName(&quot;A special test case&quot;)

class DisplayNameDemo {



    @Test

    @DisplayName(&quot;Custom test name containing spaces&quot;)

    void testWithDisplayNameContainingSpaces() {

    }



    @Test

    @DisplayName(&quot;╯&amp;deg;□&amp;deg;）╯&quot;)

    void testWithDisplayNameContainingSpecialCharacters() {

    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;테스트명을 한글, 띄어쓰기가 있는 엄청 긴 이름, 특수문자나 이모지도 넣기가 가능. 위의 코드를 테스트를 수행하면&amp;nbsp;이렇게 표현이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;test1.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nQbfZ/btqxEOHuBQC/nCIhcl20KxJFOklpNdth51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nQbfZ/btqxEOHuBQC/nCIhcl20KxJFOklpNdth51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nQbfZ/btqxEOHuBQC/nCIhcl20KxJFOklpNdth51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnQbfZ%2FbtqxEOHuBQC%2FnCIhcl20KxJFOklpNdth51%2Fimg.png&quot; data-filename=&quot;test1.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Junit5적용-@Disabled&quot;&gt;@Disabled&lt;/h2&gt;
&lt;p&gt;기존 버전의&amp;nbsp;@Ignore(&quot;blah&quot;) 어노테이션은&amp;nbsp;@Disabled(&quot;blah&quot;)로 변경.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Junit5적용-LifecycleMethod&quot;&gt;Lifecycle Method&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;기존 버전과 같고&amp;nbsp; Annotation만 변경됨.&lt;/li&gt;
&lt;li&gt;@BeforeClass,&amp;nbsp;@AfterClass -&amp;gt; @BeforeAll,&amp;nbsp;@AfterAll&lt;/li&gt;
&lt;li&gt;@Before, @After -&amp;gt; @BeforeEach, @AfterEach&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1566439610659&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import static org.junit.jupiter.api.Assertions.fail;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
 
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
 
class StandardTests {
 
    @BeforeAll
    static void initAll() {
    }
 
    @BeforeEach
    void init() {
    }
 
    @Test
    void succeedingTest() {
    }
 
    @Test
    void failingTest() {
        fail(&quot;a failing test&quot;);
    }
 
    @Test
    @Disabled(&quot;for demonstration purposes&quot;)
    void skippedTest() {
        // not executed
    }
 
    @Test
    void abortedTest() {
        assumeTrue(&quot;abc&quot;.contains(&quot;Z&quot;));
        fail(&quot;test should have been aborted&quot;);
    }
 
    @AfterEach
    void tearDown() {
    }
 
    @AfterAll
    static void tearDownAll() {
    }
 
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;Junit5적용-Assertions&quot;&gt;Assertions&lt;/h2&gt;
&lt;p&gt;람다 구문을 쓸 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1566439717976&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AssertionsDemo {
 
    private final Calculator calculator = new Calculator();
 
    private final Person person = new Person(&quot;Jane&quot;, &quot;Doe&quot;);
 
    @Test
    void standardAssertions() {
        assertEquals(2, calculator.add(1, 1));
        assertEquals(4, calculator.multiply(2, 2),
                &quot;The optional failure message is now the last parameter&quot;);
        assertTrue('a' &amp;lt; 'b', () -&amp;gt; &quot;Assertion messages can be lazily evaluated -- &quot;
                + &quot;to avoid constructing complex messages unnecessarily.&quot;);
    }
 
    @Test
    void groupedAssertions() {
        // In a grouped assertion all assertions are executed, and all
        // failures will be reported together.
        assertAll(&quot;person&quot;,
            () -&amp;gt; assertEquals(&quot;Jane&quot;, person.getFirstName()),
            () -&amp;gt; assertEquals(&quot;Doe&quot;, person.getLastName())
        );
    }
 
    @Test
    void dependentAssertions() {
        // Within a code block, if an assertion fails the
        // subsequent code in the same block will be skipped.
        assertAll(&quot;properties&quot;,
            () -&amp;gt; {
                String firstName = person.getFirstName();
                assertNotNull(firstName);
 
                // Executed only if the previous assertion is valid.
                assertAll(&quot;first name&quot;,
                    () -&amp;gt; assertTrue(firstName.startsWith(&quot;J&quot;)),
                    () -&amp;gt; assertTrue(firstName.endsWith(&quot;e&quot;))
                );
            },
            () -&amp;gt; {
                // Grouped assertion, so processed independently
                // of results of first name assertions.
                String lastName = person.getLastName();
                assertNotNull(lastName);
 
                // Executed only if the previous assertion is valid.
                assertAll(&quot;last name&quot;,
                    () -&amp;gt; assertTrue(lastName.startsWith(&quot;D&quot;)),
                    () -&amp;gt; assertTrue(lastName.endsWith(&quot;e&quot;))
                );
            }
        );
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Junit5적용-@ParameterizedTest&quot;&gt;@ParameterizedTest&lt;/h2&gt;
&lt;p&gt;한 메소드에 여러 파라미터 값을 다르게 넣어서 테스트하기&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;@ParameterizedTest 을 쓰기 위해서는 dependency를 따로 추가해 주어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566439978441&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;testCompile('org.junit.jupiter:junit-jupiter-params:5.5.1')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566439998490&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@DisplayName(&quot;여러 seq로 조회&quot;)
@ParameterizedTest(name = &quot;seq {0} 조회&quot;)
@ValueSource(longs = { 1L, 2L })
void getBySeq(Long seq) {
    Review review = reviewService.getByReviewSeq(seq);
    assertThat(review).isNotNull();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span&gt;더 자세히:&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests&quot;&gt;https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1566440010702&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bF4fkf/hyCxeUMHRX/KfcltfilZOLQ6kbRDVBInk/img.png?width=1662&amp;amp;height=1578&amp;amp;face=0_0_1662_1578,https://scrap.kakaocdn.net/dn/ENCLp/hyCw5wNcCX/jF0Ns57bfa9k51KI5F6Ukk/img.png?width=997&amp;amp;height=1173&amp;amp;face=0_0_997_1173,https://scrap.kakaocdn.net/dn/cIDfrg/hyCw5DwaX0/Z89qlGhrkBQwLNiO7KNbq1/img.png?width=862&amp;amp;height=834&amp;amp;face=0_0_862_834');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;JUnit 5 User Guide&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;junit.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;Junit5적용-@RepeatedTest&quot;&gt;@RepeatedTest&lt;/h2&gt;
&lt;p&gt;여러번 반복하고 싶다면?&lt;/p&gt;
&lt;pre id=&quot;code_1566440025389&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RepeatedTest(10)
void repeatedTest() {
    // ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Junit5적용-@Nested-중첩된테스트클래스&quot;&gt;@Nested - 중첩된 테스트 클래스&lt;/h2&gt;
&lt;p&gt;유사한 성격의 테스트들을 클래스로 묶어서 표현이 가능하다. 개발자가 보기 쉽게.&lt;/p&gt;
&lt;pre id=&quot;code_1566440058476&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@DisplayName(&quot;조회 테스트&quot;)
@Nested
class ReadTest {
 
    @DisplayName(&quot;여러 seq로 조회&quot;)
    @ParameterizedTest(name = &quot;seq {0} 조회&quot;)
    @ValueSource(longs = { 1L, 2L })
    void getBySeq(Long seq) {
        Review review = reviewService.getByReviewSeq(seq);
        assertThat(review).isNotNull();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결과:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7PCZD/btqxDUIumJf/5Y3GGpWn9pKC1puHdSFkE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7PCZD/btqxDUIumJf/5Y3GGpWn9pKC1puHdSFkE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7PCZD/btqxDUIumJf/5Y3GGpWn9pKC1puHdSFkE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7PCZD%2FbtqxDUIumJf%2F5Y3GGpWn9pKC1puHdSFkE0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;Junit5적용-Nested클래스일때LifeCycle&quot;&gt;Nested&amp;nbsp; 클래스일때 LifeCycle&lt;/h3&gt;
&lt;pre id=&quot;code_1566440178708&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.junit.jupiter.api.*;
 
class NestedTest {
    @BeforeAll
    static void beforeAll() {
        System.out.println(&quot;Parent beforeAll&quot;);
    }
 
    @BeforeEach
    void beforeEach() {
        System.out.println(&quot;Parent beforeEach&quot;);
    }
 
    @AfterEach
    void afterEach() {
        System.out.println(&quot;Parent afterEach&quot;);
    }
 
    @AfterAll
    static void afterAll() {
        System.out.println(&quot;Parent afterAll&quot;);
    }
 
    @Test
    void test() {
        System.out.println(&quot;Parent test&quot;);
    }
 
    @Nested
    class Child {
        @BeforeEach
        void beforeEach() {
            System.out.println(&quot;Child beforeEach&quot;);
        }
 
        @AfterEach
        void afterEach() {
            System.out.println(&quot;Child afterEach&quot;);
        }
 
        @Test
        void test() {
            System.out.println(&quot;Child Test&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결과:&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;p&gt;&lt;b&gt;Parent beforeAll&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Parent beforeEach&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Parent test&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Parent afterEach&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Parent beforeEach&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Child beforeEach&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Child Test&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Child afterEach&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Parent afterEach&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Parent afterAll&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nested&amp;nbsp; 클래스 안에서는&amp;nbsp;@BeforeAll 이나 @AfterAll 메서드를 사용할 수 없다.&lt;/p&gt;
&lt;p&gt;Java는 Nested 클래스 내에서 static 메서드를 허용하지 않기 때문.&lt;br /&gt;단 부모 클래스의 생명주기를 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 사용 시에는 @BeforeAll 과 @AfterAll을 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Junit5적용-TestInstanceLifecycle&quot;&gt;Test Instance Lifecycle&lt;/h2&gt;
&lt;p&gt;자세히:&amp;nbsp;&lt;a href=&quot;https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle&quot;&gt;https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Test Instance의 기본값은&amp;nbsp;TestInstance.Lifecycle.PER_METHOD 모드이다.&lt;/p&gt;
&lt;p&gt;기존 Junit 버전에서 썼던 것처럼 test instance는 각 test method, test factory method, test template method 마다 실행된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Junit5에선 @TestInstance를 TestInstance.Lifecycle.PER_CLASS 모드가 추가되었다.&lt;br /&gt;test instance는 test class 당 하나가 생긴다.&lt;/p&gt;
&lt;p&gt;이 모드를 사용하면 @BeforeAll, @AfterAll 을 붙인 메소드가 static 일 필요가 없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Junit5 이전 버전에서&amp;nbsp;@BeforeClass에 해당하는 메소드는 static으로 선언해야 했다. 하지만 Junit5 에선 static일 필요가 없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566440276225&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@ExtendWith(SpringExtension.class)
@SpringBootTest
@Transactional
@Rollback
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class ReviewServiceTest {
 
    ....
 
    @BeforeAll
    void setUp() {
        review = Review.builder()
                .userId(&quot;userId&quot;)
                .subject(&quot;subject&quot;)
                .contents(&quot;contents&quot;)
                .rating(5)
                .build();
  
        reviewService.saveReview(review);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;한줄평&lt;/p&gt;
&lt;p&gt;&lt;span&gt;JUnit5의 @DisplayName, @Nested 클래스,&amp;nbsp;@ParameterizedTest,&amp;nbsp;람다 지원만으로도 충분히 갈아탈만 하다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>backend/Spring</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/609</guid>
      <comments>https://flyburi.tistory.com/609#entry609comment</comments>
      <pubDate>Thu, 22 Aug 2019 12:55:52 +0900</pubDate>
    </item>
    <item>
      <title>MacOS Mojave 업데이트 후 Git 오류 - xcrun: error: invalid active developer path</title>
      <link>https://flyburi.tistory.com/608</link>
      <description>&lt;p&gt;MacOS를 Mojave로 업데이트 후에 IntelliJ IDEA에서 Git 오류가 발생했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vya3K/btqxtVVeOir/LreLUFk1xYcaNDbAkD0DAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vya3K/btqxtVVeOir/LreLUFk1xYcaNDbAkD0DAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vya3K/btqxtVVeOir/LreLUFk1xYcaNDbAkD0DAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvya3K%2FbtqxtVVeOir%2FLreLUFk1xYcaNDbAkD0DAk%2Fimg.png&quot; width=&quot;641&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Terminal을 열어서 git 명령어를 쳐도 같은 오류가 나타난다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1565918930469&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# git

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Xcode&amp;nbsp;Command&amp;nbsp;Line&amp;nbsp;Tools와 dependency 때문에 생기는 문제인 것 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Xcode 전체 설치하면 시간이 오래걸리니,&amp;nbsp;Xcode&amp;nbsp;Command&amp;nbsp;Line&amp;nbsp;Tools만 설치하는 걸로(이것도 1시간은 걸린다..)&lt;/p&gt;
&lt;pre id=&quot;code_1565918916645&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# xcode-select --install&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;확인.&lt;/p&gt;
&lt;pre id=&quot;code_1565918944206&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# xcode-select -v

xcode-select version 2354.



# git --version

git version 2.20.1 (Apple Git-117)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer 그리고 Developer/Mac</category>
      <category>GIT</category>
      <category>git 오류</category>
      <category>MacOS</category>
      <category>Mojave</category>
      <category>Xcode</category>
      <category>맥 업데이트</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/608</guid>
      <comments>https://flyburi.tistory.com/608#entry608comment</comments>
      <pubDate>Fri, 16 Aug 2019 10:29:51 +0900</pubDate>
    </item>
    <item>
      <title>[Junit5] SpringBoot2+Junit5 에서 TestEngine with ID 'junit-jupiter' failed to discover tests 오류 해결방법</title>
      <link>https://flyburi.tistory.com/607</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Spring Boot 의 기본 junit4 대신 junit5(2019.7월 말 현재 최신버전인 junit 5.5.1&amp;nbsp;)를 쓰기 위해 설정하는 도중 만난 오류가 있어서 공유합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;개발 환경&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;IngelliJ IDEA&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;gradle 5.0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Spring Boot&amp;nbsp;2.1.0.RELEASE&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Spring Boot 의 기본 junit4 대신 junit5(2019.7월 말 현재 최신버전인 junit 5.5.1&amp;nbsp;)를 쓰기 위해 설정하는 도중 만난 오류가 있어서 공유합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Spring Boot 의 기본 junit4 버전 제외. (build.gradle)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1564104904349&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude module: 'junit'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;junit5 lib 추가 (build.gradle, junit-jupiter-engine관련 lib)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1564104081338&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;testImplementation(&quot;org.junit.jupiter:junit-jupiter-api:5.5.1&quot;)
testRuntimeOnly(&quot;org.junit.jupiter:junit-jupiter-engine:5.5.1&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이&amp;nbsp; dependencies에 추가후 testcase를 돌리면 아래와 같은 오류가 났습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;7월 25, 2019 6:33:39 오후 org.junit.platform.launcher.core.DefaultLauncher handleThrowable&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;WARNING: TestEngine with ID 'junit-jupiter' failed to discover tests&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;java.lang.NoClassDefFoundError: org/junit/platform/engine/support/discovery/SelectorResolver&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;...더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:69)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:168)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:155)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)&lt;/p&gt;
&lt;p&gt;Caused by: java.lang.ClassNotFoundException: org.junit.platform.engine.support.discovery.SelectorResolver&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... 8 more&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;junit5의 dependency를 살펴봅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UrFJw/btqw1t5CYw2/bTkckKZuYyijNEdVdzQTM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UrFJw/btqw1t5CYw2/bTkckKZuYyijNEdVdzQTM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UrFJw/btqw1t5CYw2/bTkckKZuYyijNEdVdzQTM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUrFJw%2Fbtqw1t5CYw2%2FbTkckKZuYyijNEdVdzQTM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;제가 추가한 lib 외에 junit-platform-* 이&amp;nbsp;dependency 관계가 있어서 추가된 걸 확인할 수 있는데,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문제가 되는 junit-platform에서 버전이 맞지 않아서 발생하는 오류인지&amp;nbsp;junit-platform-* lib를&amp;nbsp;강제로 현재 최신 버전인 1.5.1 으로 추가 설정해주었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;junit-platform-commons:1.3.1 버전은 junit-jupiter-api:5.5.1 에 dependency가 있기 때문에 제외를 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1564104654107&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;testImplementation(&quot;org.junit.jupiter:junit-jupiter-api:5.5.1&quot;) {
    exclude module:'junit-platform-commons'
}
testRuntimeOnly(&quot;org.junit.jupiter:junit-jupiter-engine:5.5.1&quot;)
testRuntimeOnly(&quot;org.junit.platform:junit-platform-engine:1.5.1&quot;)
testRuntimeOnly(&quot;org.junit.platform:junit-platform-commons:1.5.1&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해결된 후 dependency 확인! 실패했던 Testcase도 잘 돌아갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W7JtK/btqw2AJMktO/ADhkEs6Ub1c0uPrcjIsPP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W7JtK/btqw2AJMktO/ADhkEs6Ub1c0uPrcjIsPP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W7JtK/btqw2AJMktO/ADhkEs6Ub1c0uPrcjIsPP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW7JtK%2Fbtqw2AJMktO%2FADhkEs6Ub1c0uPrcjIsPP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>backend/Spring</category>
      <category>gradle</category>
      <category>IntelliJIDEA</category>
      <category>junit</category>
      <category>junit4</category>
      <category>junit5</category>
      <category>springboot</category>
      <category>그레이들</category>
      <category>스프링부트</category>
      <category>인텔리제이</category>
      <category>제이유닛</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/607</guid>
      <comments>https://flyburi.tistory.com/607#entry607comment</comments>
      <pubDate>Fri, 26 Jul 2019 10:37:51 +0900</pubDate>
    </item>
    <item>
      <title>[Vue.js] Vue.js 개발 입문하면서 궁금했던 기초 질문들 &amp;amp; 소소한 링크들</title>
      <link>https://flyburi.tistory.com/606</link>
      <description>&lt;p&gt;Vue.js&amp;nbsp;개발&amp;nbsp;입문하면서&amp;nbsp;궁금했던&amp;nbsp;기초&amp;nbsp;질문들&amp;nbsp;&amp;amp;&amp;nbsp;소소한&amp;nbsp;링크들&lt;br /&gt;&lt;br /&gt;공식&amp;nbsp;문서에&amp;nbsp;다&amp;nbsp;나오는&amp;nbsp;내용이지만,&amp;nbsp;처음에&amp;nbsp;궁금했던 것만&amp;nbsp;간추려서&amp;nbsp;작성해&amp;nbsp;보았습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;br /&gt;일단&lt;b&gt;&amp;nbsp;인스턴스&amp;nbsp;라이프사이클&amp;nbsp;다이어그램&lt;/b&gt;부터&amp;nbsp;보고&amp;nbsp;시작하자.&lt;br /&gt;Vue&amp;nbsp;인스턴스의&amp;nbsp;생성부터&amp;nbsp;소멸까지의&amp;nbsp;라이프사이클&amp;nbsp;hook을&amp;nbsp;이용하기&amp;nbsp;위해서는&amp;nbsp;반드시&amp;nbsp;알아야&amp;nbsp;할&amp;nbsp;그림&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biY7tM/btqwMKz5oO1/TWrII7UwkcEmwJGcGibAQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biY7tM/btqwMKz5oO1/TWrII7UwkcEmwJGcGibAQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biY7tM/btqwMKz5oO1/TWrII7UwkcEmwJGcGibAQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiY7tM%2FbtqwMKz5oO1%2FTWrII7UwkcEmwJGcGibAQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;자세히&amp;nbsp;보기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://kr.vuejs.org/v2/guide/instance.html#%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4-%ED%9B%85&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;인스턴스 라이프사이클 훅&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;camelCase&amp;nbsp;vs.&amp;nbsp;kebab-case&amp;nbsp;어떻게&amp;nbsp;써야하나?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;HTML&amp;nbsp;속성은&amp;nbsp;대소&amp;nbsp;문자를&amp;nbsp;구분하지&amp;nbsp;않으므로&amp;nbsp;문자열이&amp;nbsp;아닌&amp;nbsp;템플릿을&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;camelCased&amp;nbsp;prop&amp;nbsp;이름에&amp;nbsp;해당하는&amp;nbsp;kebab-case(하이픈&amp;nbsp;구분)를&amp;nbsp;사용해야&amp;nbsp;한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1563260130154&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Vue.component('child', {
  // JavaScript는 camelCase
  props: ['myMessage'],
  template: '&amp;lt;span&amp;gt;{{ myMessage }}&amp;lt;/span&amp;gt;'
})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1563260143670&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- HTML는 kebab-case --&amp;gt;
&amp;lt;child my-message=&quot;안녕하세요!&quot;&amp;gt;&amp;lt;/child&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;문자열&amp;nbsp;템플릿을&amp;nbsp;사용하는&amp;nbsp;경우에도&amp;nbsp;이&amp;nbsp;제한이&amp;nbsp;적용되지&amp;nbsp;않는다.&lt;br /&gt;&lt;br /&gt;출처 :&amp;nbsp;&lt;a href=&quot;https://kr.vuejs.org/v2/guide/components.html#camelCase-vs-kebab-case&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;camelCase vs. kebab-case&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;b&gt;computed&amp;nbsp;속성과&amp;nbsp;watch&amp;nbsp;속성의&amp;nbsp;차이는?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;watch 속성은 감시할 데이터를 지정하고 그 데이터가 바뀌면 이런 함수를 실행하라는 방식으로 소프트웨어 공학에서 이야기하는 &amp;lsquo;명령형 프로그래밍&amp;rsquo; 방식. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;computed 속성은 계산해야 하는 목표 데이터를 정의하는 방식으로 소프트웨어 공학에서 이야기하는 &amp;lsquo;선언형 프로그래밍&amp;rsquo; 방식&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;computed-속성-vs-watch-속성&quot;&gt;&lt;a href=&quot;https://kr.vuejs.org/v2/guide/computed.html#computed-%EC%86%8D%EC%84%B1-vs-watch-%EC%86%8D%EC%84%B1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;computed 속성 vs watch 속성&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;computed&amp;nbsp;와&amp;nbsp;methods&amp;nbsp;용도&amp;nbsp;차이는?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;computed를&amp;nbsp;사용하는&amp;nbsp;방법과&amp;nbsp;methods를&amp;nbsp;사용하는&amp;nbsp;방법의&amp;nbsp;최종&amp;nbsp;결과는&amp;nbsp;동일하다.&amp;nbsp;&lt;br /&gt;computed와&amp;nbsp;methods의&amp;nbsp;차이점은&amp;nbsp;computed는&amp;nbsp;종속&amp;nbsp;대상을&amp;nbsp;캐싱한다는&amp;nbsp;것.&amp;nbsp;&lt;br /&gt;그렇기&amp;nbsp;때문에&amp;nbsp;computed는&amp;nbsp;종속&amp;nbsp;대상이&amp;nbsp;변경&amp;nbsp;될&amp;nbsp;때만&amp;nbsp;함수를&amp;nbsp;호출한다.&amp;nbsp;&lt;br /&gt;시간이&amp;nbsp;많이&amp;nbsp;걸리는&amp;nbsp;계산을&amp;nbsp;할&amp;nbsp;때,&amp;nbsp;computed을&amp;nbsp;사용하면&amp;nbsp;더&amp;nbsp;좋은&amp;nbsp;호율의&amp;nbsp;어플리케이션을&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;&lt;br /&gt;캐싱을&amp;nbsp;하지&amp;nbsp;않고,&amp;nbsp;호출&amp;nbsp;할&amp;nbsp;때마다&amp;nbsp;새롭게&amp;nbsp;계산을&amp;nbsp;해야&amp;nbsp;하는&amp;nbsp;경우에는&amp;nbsp;methods를&amp;nbsp;사용해야&amp;nbsp;한다.&lt;/p&gt;
&lt;p&gt;자세히 보기 :&amp;nbsp;&lt;a href=&quot;https://kr.vuejs.org/v2/guide/computed.html#computed-%EC%86%8D%EC%84%B1%EC%9D%98-%EC%BA%90%EC%8B%B1-vs-%EB%A9%94%EC%86%8C%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;computed 속성의 캐싱 vs 메소드&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;b&gt;computed의&amp;nbsp;setter&amp;nbsp;함수&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;computed는&amp;nbsp;기본적으로&amp;nbsp;getter&amp;nbsp;함수.&amp;nbsp;필요한&amp;nbsp;경우&amp;nbsp;setter&amp;nbsp;함수를&amp;nbsp;정의하여&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;자세히&amp;nbsp;보기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://kr.vuejs.org/v2/guide/computed.html#computed-%EC%86%8D%EC%84%B1%EC%9D%98-setter-%ED%95%A8%EC%88%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;computed 속성의 setter 함수&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;v-if&amp;nbsp;와&amp;nbsp;v-show&amp;nbsp;의&amp;nbsp;차이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;v-if는&amp;nbsp;조건부&amp;nbsp;블럭&amp;nbsp;안의&amp;nbsp;이벤트&amp;nbsp;리스너와&amp;nbsp;자식&amp;nbsp;컴포넌트가&amp;nbsp;토글하는&amp;nbsp;동안&amp;nbsp;적절하게&amp;nbsp;제거되고&amp;nbsp;다시&amp;nbsp;만들어지기&amp;nbsp;때문에&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ldquo;진짜&amp;rdquo;&amp;nbsp;조건부&amp;nbsp;렌더링&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;v-if는 게으르다. 초기&amp;nbsp;렌더링에서&amp;nbsp;조건이&amp;nbsp;거짓인&amp;nbsp;경우&amp;nbsp;아무것도&amp;nbsp;하지&amp;nbsp;않는다.&amp;nbsp;조건&amp;nbsp;블록이&amp;nbsp;처음으로&amp;nbsp;참이&amp;nbsp;될&amp;nbsp;때&amp;nbsp;까지&amp;nbsp;렌더링&amp;nbsp;되지&amp;nbsp;않는다.&lt;br /&gt;&lt;br /&gt;비교해보면,&amp;nbsp;v-show는&amp;nbsp;훨씬&amp;nbsp;단순하다.&amp;nbsp;CSS&amp;nbsp;기반&amp;nbsp;토글만으로&amp;nbsp;초기&amp;nbsp;조건에&amp;nbsp;관계&amp;nbsp;없이&amp;nbsp;엘리먼트가&amp;nbsp;항상&amp;nbsp;렌더링된다.&lt;br /&gt;일반적으로&amp;nbsp;v-if는&amp;nbsp;토글&amp;nbsp;비용이&amp;nbsp;높고&amp;nbsp;v-show는&amp;nbsp;초기&amp;nbsp;렌더링&amp;nbsp;비용이&amp;nbsp;더&amp;nbsp;높다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;매우&amp;nbsp;자주&amp;nbsp;바꾸기를&amp;nbsp;원한다면&amp;nbsp;v-show를,&amp;nbsp;런타임&amp;nbsp;시&amp;nbsp;조건이&amp;nbsp;바뀌지&amp;nbsp;않으면&amp;nbsp;v-if를&amp;nbsp;권장한다.&lt;br /&gt;&lt;br /&gt;자세히&amp;nbsp;보기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://kr.vuejs.org/v2/guide/conditional.html#v-if-vs-v-show&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v-if&lt;span&gt;&amp;nbsp;&lt;/span&gt;vs&lt;span&gt;&amp;nbsp;&lt;/span&gt;v-show&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;v-on&amp;nbsp;directive&amp;nbsp;:&amp;nbsp;이벤트&amp;nbsp;리스너&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;엘리먼트에 이벤트 리스너를 연결.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;v-on에&amp;nbsp;methods의&amp;nbsp;함수를&amp;nbsp;넘겨주는&amp;nbsp;형태.&lt;br /&gt;인라인으로&amp;nbsp;methods&amp;nbsp;에&amp;nbsp;정의된&amp;nbsp;함수를&amp;nbsp;호출시&amp;nbsp;DOM&amp;nbsp;이벤트&amp;nbsp;객체를&amp;nbsp;사용하기&amp;nbsp;위해서는&amp;nbsp;$event&amp;nbsp;를&amp;nbsp;넘겨서&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;자세히 보기 : &lt;a href=&quot;https://kr.vuejs.org/v2/api/index.html#v-on&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v-on&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;자식&amp;nbsp;컴포넌트에서&amp;nbsp;부모&amp;nbsp;컴포넌트로&amp;nbsp;데이터를&amp;nbsp;전달하고&amp;nbsp;싶을&amp;nbsp;때는?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;=&amp;gt; $emit 사용&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;부모&amp;nbsp;컴포넌트에서는&amp;nbsp;$on(eventName)&amp;nbsp;으로&amp;nbsp;이벤트를&amp;nbsp;감지하도록&amp;nbsp;하고,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자식&amp;nbsp;컴포넌트에서는&amp;nbsp;$emit(eventName)을&amp;nbsp;사용하여&amp;nbsp;이벤트를&amp;nbsp;트리거해서&amp;nbsp;호출.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;자세히&amp;nbsp;보기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://kr.vuejs.org/v2/guide/components.html#v-on%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A7%80%EC%A0%95-%EC%9D%B4%EB%B2%A4%ED%8A%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v-on을&amp;nbsp;이용한&amp;nbsp;사용자&amp;nbsp;지정&amp;nbsp;이벤트&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;부모&amp;nbsp;컴포넌트는&amp;nbsp;props를&amp;nbsp;통해&amp;nbsp;자식에게&amp;nbsp;데이터를&amp;nbsp;전달하고,&amp;nbsp;자식&amp;nbsp;컴포넌트는&amp;nbsp;events를&amp;nbsp;통해&amp;nbsp;부모&amp;nbsp;컴포넌트에게&amp;nbsp;메시지를&amp;nbsp;보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYpRTk/btqwPAidSCG/kbcCFS0aa4GC38iDLRJue1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYpRTk/btqwPAidSCG/kbcCFS0aa4GC38iDLRJue1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYpRTk/btqwPAidSCG/kbcCFS0aa4GC38iDLRJue1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYpRTk%2FbtqwPAidSCG%2FkbcCFS0aa4GC38iDLRJue1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;비부모-자식간의&amp;nbsp;통신은 어떻게 해야할까?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;=&amp;gt; 이벤트&amp;nbsp;버스를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1563260653506&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var bus = new Vue()
// 컴포넌트 A의 메소드

bus.$emit('id-selected', 1)
// 컴포넌트 B의 created 훅

bus.$on('id-selected', function (id) {
  // ...
})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;출처 :&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://kr.vuejs.org/v2/guide/components.html#%EB%B9%84-%EB%B6%80%EB%AA%A8-%EC%9E%90%EC%8B%9D%EA%B0%84-%ED%86%B5%EC%8B%A0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;비 부모-자식간 통신&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;여러 컴포넌트에 분산되어있는 여러 상태와 그 상호 작용으로 인해 복잡해질때는?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;=&amp;gt; Vuex를 쓰는 것을 고려해보자.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Vuex는&amp;nbsp;Vue.js&amp;nbsp;애플리케이션에&amp;nbsp;대한&amp;nbsp;상태&amp;nbsp;관리&amp;nbsp;패턴&amp;nbsp;+&amp;nbsp;라이브러리&lt;br /&gt;Flux,&amp;nbsp;Redux,&amp;nbsp;The&amp;nbsp;Elm&amp;nbsp;Architecture에서&amp;nbsp;영감을&amp;nbsp;받은&amp;nbsp;Vuex의&amp;nbsp;기본&amp;nbsp;아이디어&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcKboJ/btqwNupXwkX/jtzpkJWyCpFkDkH9ktqZYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcKboJ/btqwNupXwkX/jtzpkJWyCpFkDkH9ktqZYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcKboJ/btqwNupXwkX/jtzpkJWyCpFkDkH9ktqZYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcKboJ%2FbtqwNupXwkX%2FjtzpkJWyCpFkDkH9ktqZYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;자세히&amp;nbsp;보기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://kr.vuejs.org/v2/guide/state-management.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;상태 관리&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;자식&amp;nbsp;컴포넌트에서&amp;nbsp;property가&amp;nbsp;변경되는&amp;nbsp;것을&amp;nbsp;부모에&amp;nbsp;반영하고&amp;nbsp;싶다면?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;=&amp;gt; .sync를&amp;nbsp;사용.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;자식&amp;nbsp;컴포넌트가&amp;nbsp;.sync를&amp;nbsp;가지는&amp;nbsp;속성을&amp;nbsp;변경하면&amp;nbsp;값의&amp;nbsp;변경이&amp;nbsp;부모에&amp;nbsp;반영된다.&amp;nbsp;&lt;br /&gt;편리하지만&amp;nbsp;단방향&amp;nbsp;데이터&amp;nbsp;흐름이&amp;nbsp;아니기&amp;nbsp;때문에&amp;nbsp;장기적으로&amp;nbsp;유지보수에&amp;nbsp;문제가&amp;nbsp;생긴다.&amp;nbsp;&lt;br /&gt;자식&amp;nbsp;속성을&amp;nbsp;변경하는&amp;nbsp;코드는&amp;nbsp;부모의&amp;nbsp;상태에&amp;nbsp;영향을&amp;nbsp;미치기&amp;nbsp;때문에&amp;nbsp;자~알&amp;nbsp;사용해야&amp;nbsp;한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;부모&amp;nbsp;상태에&amp;nbsp;영향을&amp;nbsp;미치는&amp;nbsp;코드를&amp;nbsp;더욱&amp;nbsp;일관적이고&amp;nbsp;명백하게&amp;nbsp;만들어야&amp;nbsp;한다.&lt;/p&gt;
&lt;p&gt;자세히&amp;nbsp;보기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://kr.vuejs.org/v2/guide/components.html#sync-%EC%88%98%EC%8B%9D%EC%96%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;.sync&lt;span&gt;&amp;nbsp;&lt;/span&gt;수식어&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Vue Router&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://router.vuejs.org/kr/&quot;&gt;https://router.vuejs.org/kr/&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;References&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://kr.vuejs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Vue.js&amp;nbsp;공식&amp;nbsp;홈페이지&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://medium.com/witinweb/vue-js-%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-7780cdd97dd4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Vue.js&amp;nbsp;2.0&amp;nbsp;라이프사이클&amp;nbsp;이해하기&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;그외&amp;nbsp;읽어볼만한&amp;nbsp;글&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://joshua1988.github.io/web-development/vuejs/common-error-cases/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Vue.js&amp;nbsp;입문자가&amp;nbsp;흔히&amp;nbsp;저지르는&amp;nbsp;문법&amp;nbsp;실수&amp;nbsp;총정리&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://michaelnthiessen.com/force-re-render&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The&amp;nbsp;correct&amp;nbsp;way&amp;nbsp;to&amp;nbsp;force&amp;nbsp;Vue&amp;nbsp;to&amp;nbsp;re-render&amp;nbsp;a&amp;nbsp;component&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://medium.com/@denny.headrick/element-for-vuejs-5-things-to-love-and-5-things-to-hate-d6ca336223b4&quot;&gt;Element for VueJS: 5 things to love and 5 things to hate&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Javascript</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>JavaScript Framework</category>
      <category>Vue</category>
      <category>Vue.js</category>
      <category>자바스크립트</category>
      <category>자바스크립트 프레임워크</category>
      <category>프레임워크</category>
      <category>프론트엔드</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/606</guid>
      <comments>https://flyburi.tistory.com/606#entry606comment</comments>
      <pubDate>Mon, 22 Jul 2019 11:23:34 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Java Interface feature 변화의 history - 번역</title>
      <link>https://flyburi.tistory.com/605</link>
      <description>&lt;p&gt;History of Java interface feature changes&lt;/p&gt;
&lt;p&gt;원문 :&amp;nbsp;&lt;a href=&quot;https://www.vojtechruzicka.com/java-interface-history/&quot;&gt;https://www.vojtechruzicka.com/java-interface-history/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;지나가며 글을 읽다가 빠른 번역(잘못된 번역이 많을 수 있습니다)을 해보았습니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Original interfaces&lt;/p&gt;
&lt;p&gt;java 1.0의 interface는 두개의 type만 포함한다. constants와 public abstract methods.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;Constant fields&lt;/p&gt;
&lt;p&gt;Inteface는 field를 포함하고, 보통의 class와는 몇가지 차이점이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- Fields는 value가 할당되어야 한다.(Fields must be assigned a value)&lt;/p&gt;
&lt;p&gt;- Fields는 public static final로 간주된다.(Fields are considered public static final)&lt;/p&gt;
&lt;p&gt;- Public static과 final 변경자는 명시적으로 쓸 필요는 없다. (Public static and final modifiers don't need to be explicitly stated)&lt;/p&gt;
&lt;pre id=&quot;code_1563244373624&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface MyInterface {
    int MY_CONSTANT = 9;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MY_CONSTANT field는 명시적으로 쓰여있지 않아도 public static final인 상수로 구성되어있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Abstract methods&lt;/p&gt;
&lt;p&gt;interface의 메소드는 class method와 다른점이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- method의 body를 가지지 않는다.(Methods don't have bodies)&lt;/p&gt;
&lt;p&gt;- Implementation는 interface를 구현하는 클래스에서 제공된다. (Implementation is provided by classes implementing the interface)&lt;/p&gt;
&lt;p&gt;- 명시적으로 쓰여 있지 않아도 Method는 public abstract으로 간주된다. (Methods are considered public abstract even if not explicitly stated)&lt;/p&gt;
&lt;p&gt;- abstract와 final로 될 수 없고 유효하지 않은 조합이다. (Cannot be final as abstract and final is an invalid combination)&lt;/p&gt;
&lt;pre id=&quot;code_1563244523866&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface MyInterface {
    int doSomething();
    String doSomethingCompletelyDifferent();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Nesting&lt;/p&gt;
&lt;p&gt;Java 1.1 에서는 class 안에 class 개념을 도입했다.&lt;/p&gt;
&lt;p&gt;static과 non-static 형태로 제공된다. interface에는 다른 interface와 class가 포함될 수 있다.&lt;/p&gt;
&lt;p&gt;명시적으로 씌여있지 않더라도 interface와 class는 public static으로 간주된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1563244559304&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface MyInterface {
    class MyClass {
        //...
    }

    interface MyOtherInterface {
        //...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Enums과 Annotations&lt;/p&gt;
&lt;p&gt;Java5 에서&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;Enums과 Annotations가&lt;/span&gt; 추가되었다. 이 두가지 유형은 interface안에 쓰여질 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Generics&lt;/p&gt;
&lt;p&gt;Java 5에서는 Generics이 추가되었는데 generics은 명시적인 type 대신에 used type parameter를 허용한다.&lt;/p&gt;
&lt;p&gt;이 방법으로 코드를 짜면, type safety를 지키면서 다양한 type의 코드와 함께 작동되거나 각 개별 type 에 대한 구현(implementation) 을 제공하는 코드를 작성할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Java 5 에서의 interface는 type parameter를 정의(define)한 다음, method의 return type 이나 method parameter type 대신에 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1563244920051&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Box&amp;lt;T&amp;gt; {
    void insert(T item);
}

class ShoeBox implements Box&amp;lt;Shoe&amp;gt; {
    public void insert(Shoe item) {
        //...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Static methods&lt;/p&gt;
&lt;p&gt;Java 8 부터는 interface에 static method를 포함할 수 있다.&lt;/p&gt;
&lt;p&gt;원래 interface의 method는 모두 abstract 이었고 implementation(구현체)은 없었다. implementation은 interface를 구현하는 class에 책임이 있었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;interface의 static method는 method의 body의 implementation도 제공되어야 했다.&lt;/p&gt;
&lt;p&gt;이런 method를 포함하기 위해서 보통 static 키워드를 사용하고 static method는 기본적으로 public으로 간주한다.&lt;/p&gt;
&lt;pre id=&quot;code_1563244957568&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface MyInterface {
    
    // This works
    static int foo() {
        return 0;
    }

    // This does not work, 
    // static methods in interfaces need body
    static int bar();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;Static method inheritance&lt;/p&gt;
&lt;p&gt;일반적인 static method와 달리 interface의 static method는 상속되지 않는다.&lt;/p&gt;
&lt;p&gt;즉, 이것은 method를 호출하려면 구현하는 클래스 대신에 interface를 바로 접근해서 호출해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1563244989112&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyInterface.staticMethod();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 동작은 다중 상속 문제를 방지하는 데 매우 유용하다. 두 개의 interface를 구현하는 클래스가 있다고 가정 해 보자.&lt;/p&gt;
&lt;p&gt;각 interface에는 동일한 이름과 signature을 가진 static method가 있을 때 어떤 것이 더 우선해야 할까?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;Why is it useful&lt;/p&gt;
&lt;p&gt;interface를 구현한 클래스에 helper methods와 수많은 interface가 있다고 상상해보자.&lt;/p&gt;
&lt;p&gt;interface 외에도 interface에 속한 static method를 가진 유틸리티 클래스가 있다.&lt;/p&gt;
&lt;p&gt;예제는 JDK에서 직접 찾을 수 있다. 인터페이스 java.util.Collection 및 해당 유틸리티 클래스 java.util.Collections.&lt;/p&gt;
&lt;p&gt;인터페이스의 정적 메소드의 경우 이 접근법은 더 이상 필요 없으며 권장되지 않는다. 한 곳에서 모든 것을 함께 가질 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Default methods&lt;/p&gt;
&lt;p&gt;Default methods는 method body를 제공해야하는 방식으로 static method와 유사하다. Default methods는 단순히 default 키워드만 붙여주면 된다.&lt;/p&gt;
&lt;p&gt;static method와는 달리 Default methods는 인터페이스를 구현하는 클래스에 상속된다. 중요한 것은 구현 클래스가 인터페이스에서 제공하는 기본 behavior를 무시할 수 있다는 것이다.&lt;/p&gt;
&lt;p&gt;그러나 한 가지 예외가 있는데 Object의 toString, equals 및 hashCode와 같은 signature로 인터페이스의 Default methods를 사용할 수 없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;Why is it useful&lt;/p&gt;
&lt;p&gt;인터페이스에서 직접 구현하는 것은 좋지 않다. 그렇다면 이 기능이 처음 도입 된 이유는 뭘까?&lt;/p&gt;
&lt;p&gt;인터페이스에는 한 가지 문제가 있는데 일단 인터페이스를 다른 사람들에게 노출시키면 인터페이스를 변경하기가 매우 어렵다.&lt;/p&gt;
&lt;p&gt;Java는 전통적으로 하위 호환성을 매우 중요하게 생각한다. Default methods는 기존 인터페이스를 새로운 메소드로 확장하는 방법을 제공한다.&lt;/p&gt;
&lt;p&gt;중요한 것은 Default methods가 이미 구현을 제공한다는 것이다.&lt;/p&gt;
&lt;p&gt;즉, 인터페이스를 구현하는 클래스는 새로운 메소드를 구현할 필요가 없으면서 여전히 호환 가능하다.&lt;/p&gt;
&lt;p&gt;물론 구현이 적합하지 않은 경우 나중에 기본 메서드를 재정의 할 수도 있다.&lt;/p&gt;
&lt;p&gt;간단히 말해 binary 호환성을 유지하면서 인터페이스를 구현하는 기존 클래스에 새로운 기능을 제공 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;Conflicts&lt;/p&gt;
&lt;p&gt;두 개의 인터페이스를 구현하는 하나의 클래스가 있다고 가정해 보자. 이 인터페이스에는 동일한 이름과 signature을 가진 Default methods가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1563245086744&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface A {
    default int doSomething() {
        return 0;
    }
}

interface B {
    default int doSomething() {
        return 42;
    }
}

class MyClass implements A, B {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 동일한 signature을 사용하는 동일한 Default methods가 두 개의 다른 인터페이스에서 상속되고 각 인터페이스에는 다른 구현이 있다.&lt;/p&gt;
&lt;p&gt;그렇다면 두 구현체 중 어떤 것을 사용해야하는지 클래스가 알 수 있을까?&lt;/p&gt;
&lt;p&gt;알 수 없다. 위의 코드는 컴파일 에러가 난다. 제대로 동작되게 하려면 클래스에서 conflict난 메서드를 override 해야한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Private methods&lt;/p&gt;
&lt;p&gt;Java 8과 default 및 static 메소드의 도입으로 인터페이스는 갑자기 메소드 signatures뿐만 아니라 implementation(구현)을 포함 할 수 있다.&lt;/p&gt;
&lt;p&gt;그러한 구현을 작성할 때 몇 가지 간단한 메소드 중에서 더 복잡한 메소드를 작성하는 것이 좋다. 이러한 코드는 재사용, 유지 및 이해하기가 더 쉽다.&lt;/p&gt;
&lt;p&gt;일반적으로 이러한 메소드는 구현 세부 사항이며 외부에서 볼 수 없고 사용할 수 없으므로 주로 private methods를 사용한다.&lt;/p&gt;
&lt;p&gt;그러나 Java 8에서는 인터페이스에 private methods를 사용할 수 없다. 즉, 다음 중 하나를 수행 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 길고 복잡하며 어려운 method body를 사용할것&lt;/p&gt;
&lt;p&gt;2. 인터페이스의 일부인 helper methods를 사용할 것. 이렇게 하면 캡슐화가 중단되고 interface와 구현 class의 public API가 오염된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다행히 Java 9부터는 인터페이스에서 private methods를 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;다음과 같은 특성을 가지고 있다. :&lt;/p&gt;
&lt;p&gt;- 메소드 body가 있고 abstract이 아니다.&lt;/p&gt;
&lt;p&gt;- static 이거나 non-static 일 수 있다.&lt;/p&gt;
&lt;p&gt;- 구현 클래스와 인터페이스가 상속되지 않는다.&lt;/p&gt;
&lt;p&gt;- 인터페이스에서 다른 메소드를 호출 할 수있다.&lt;/p&gt;
&lt;p&gt;private는 private, abstract, default 또는 static 메소드를 호출 할 수 있다.&lt;/p&gt;
&lt;p&gt;private static은 static 및 static private 메소드만 호출 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1563245133377&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface MyInterface {

    private static int staticMethod() {
        return 42;
    }

    private int nonStaticMethod() {
        return 0;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Chronological order&lt;/p&gt;
&lt;p&gt;Here is a chronological list of the changes by Java version:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Java 1.1&lt;/p&gt;
&lt;p&gt;- Nested classes&lt;/p&gt;
&lt;p&gt;- Nested interfaces&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Java 5&lt;/p&gt;
&lt;p&gt;- Generics&lt;/p&gt;
&lt;p&gt;- Nested enums&lt;/p&gt;
&lt;p&gt;- Nested annotations&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Java 8&lt;/p&gt;
&lt;p&gt;- Default methods&lt;/p&gt;
&lt;p&gt;- Static methods&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Java 9&lt;/p&gt;
&lt;p&gt;- Private methods&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>backend/Java</category>
      <category>Interface</category>
      <category>java</category>
      <category>java interface</category>
      <category>인터페이스</category>
      <category>자바</category>
      <category>자바 인터페이스</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/605</guid>
      <comments>https://flyburi.tistory.com/605#entry605comment</comments>
      <pubDate>Wed, 17 Jul 2019 10:02:32 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Lazy Initialization in Spring Boot 2.2 - 번역</title>
      <link>https://flyburi.tistory.com/604</link>
      <description>&lt;p&gt;&lt;b&gt;Lazy&amp;nbsp;Initialization&amp;nbsp;in&amp;nbsp;Spring&amp;nbsp;Boot&amp;nbsp;2.2&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://spring.io/blog/2019/03/14/lazy-initialization-in-spring-boot-2-2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://spring.io/blog/2019/03/14/lazy-initialization-in-spring-boot-2-2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;위의 글을 읽다가 조금만 번역해 보았습니다. 잘못된 부분이 있을 수 있으니 있다면 제보해주세요~&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;What&amp;nbsp;Does&amp;nbsp;it&amp;nbsp;Mean&amp;nbsp;to&amp;nbsp;be&amp;nbsp;Lazy?&lt;/b&gt;&lt;br /&gt;Spring&amp;nbsp;Framework는&amp;nbsp;기본적으로&amp;nbsp;application&amp;nbsp;context가&amp;nbsp;refresh될때&amp;nbsp;context의&amp;nbsp;모든&amp;nbsp;bean을&amp;nbsp;생성하고&amp;nbsp;dependency들을&amp;nbsp;inject(주입)된다.&lt;br /&gt;대조적으로&amp;nbsp;bean&amp;nbsp;definition이&amp;nbsp;느리게&amp;nbsp;초기화되도록&amp;nbsp;설정되면,&amp;nbsp;필요할&amp;nbsp;때까지는&amp;nbsp;dependency가&amp;nbsp;inject되지&amp;nbsp;않는다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lazy&amp;nbsp;Initialization&amp;nbsp;활성화&amp;nbsp;시키기&lt;/b&gt;&lt;br /&gt;Spring&amp;nbsp;Boot&amp;nbsp;2.2&amp;nbsp;에서는&amp;nbsp;간단하게&amp;nbsp;새로운&amp;nbsp;property를&amp;nbsp;추가할&amp;nbsp;수&amp;nbsp;있는데&amp;nbsp;&lt;a href=&quot;spring.main.lazy-initialization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;spring.main.lazy-initialization&lt;/a&gt;&amp;nbsp;값을&amp;nbsp;true로&amp;nbsp;설정해서&amp;nbsp;쉽게&amp;nbsp;lazy&amp;nbsp;Initialization되게&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lazy&amp;nbsp;Initialization의&amp;nbsp;장점&lt;/b&gt;&lt;br /&gt;Lazy&amp;nbsp;initialization은&amp;nbsp;application이&amp;nbsp;startup&amp;nbsp;될때&amp;nbsp;필요한&amp;nbsp;class들을&amp;nbsp;load하고&amp;nbsp;bean들을&amp;nbsp;생성해서&amp;nbsp;startup&amp;nbsp;시간을&amp;nbsp;줄이는&amp;nbsp;효과가&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DevTools이란?&lt;/b&gt;&lt;br /&gt;Spring&amp;nbsp;Boot의&amp;nbsp;DevTools은&amp;nbsp;개발자&amp;nbsp;생산성을&amp;nbsp;높이기&amp;nbsp;위해&amp;nbsp;제공되고&amp;nbsp;있다.&lt;br /&gt;변경이&amp;nbsp;있을때마다&amp;nbsp;JVM과&amp;nbsp;application을&amp;nbsp;다시&amp;nbsp;시작하지&amp;nbsp;않고&amp;nbsp;DevTools를&amp;nbsp;사용하면&amp;nbsp;동일한&amp;nbsp;JVM에서&amp;nbsp;application을&amp;nbsp;다시&amp;nbsp;시작할&amp;nbsp;수&amp;nbsp;있고&amp;nbsp;몇번&amp;nbsp;재시작하면&amp;nbsp;원래&amp;nbsp;2500m가&amp;nbsp;걸리던&amp;nbsp;시간이&amp;nbsp;거의&amp;nbsp;80%가&amp;nbsp;줄어서&amp;nbsp;500ms가&amp;nbsp;된다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lazy&amp;nbsp;Initialization의&amp;nbsp;단점&lt;/b&gt;&lt;br /&gt;lazy&amp;nbsp;initialization을&amp;nbsp;설정하면&amp;nbsp;startup&amp;nbsp;시간이&amp;nbsp;꽤&amp;nbsp;많이&amp;nbsp;줄어들&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;항상&amp;nbsp;사용하도록&amp;nbsp;설정하거나&amp;nbsp;기본적으로&amp;nbsp;사용하도록&amp;nbsp;설정되어&amp;nbsp;있지&amp;nbsp;않은지&amp;nbsp;궁금할&amp;nbsp;수&amp;nbsp;있는데,&amp;nbsp;lazy&amp;nbsp;initialization에는&amp;nbsp;몇가지&amp;nbsp;단점이&amp;nbsp;있다.&lt;br /&gt;더&amp;nbsp;이상&amp;nbsp;로드되지&amp;nbsp;않는&amp;nbsp;class와&amp;nbsp;bean들이&amp;nbsp;필요하기&amp;nbsp;전까지는&amp;nbsp;생성되지&amp;nbsp;않으므로&amp;nbsp;초기에&amp;nbsp;startup(시작)될때&amp;nbsp;식별할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;문제를&amp;nbsp;모를&amp;nbsp;수가&amp;nbsp;있다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;이런&amp;nbsp;문제는&amp;nbsp;no&amp;nbsp;class&amp;nbsp;def&amp;nbsp;found&amp;nbsp;errors나&amp;nbsp;out&amp;nbsp;of&amp;nbsp;memory&amp;nbsp;error,&amp;nbsp;잘못된&amp;nbsp;설정으로&amp;nbsp;실패하는&amp;nbsp;경우(failures&amp;nbsp;due&amp;nbsp;to&amp;nbsp;misconfiguration)들의&amp;nbsp;오류가&amp;nbsp;포함될&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;web&amp;nbsp;application에서&amp;nbsp;lazy&amp;nbsp;initialization는&amp;nbsp;bean&amp;nbsp;initialization를&amp;nbsp;trigger하는&amp;nbsp;HTTP&amp;nbsp;요청의&amp;nbsp;대기&amp;nbsp;시간을&amp;nbsp;증가시킬&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;&lt;br /&gt;일반적으로&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;요청이지만&amp;nbsp;load-balancing와&amp;nbsp;auto-scaling에&amp;nbsp;악영향을&amp;nbsp;미칠&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Is&amp;nbsp;This&amp;nbsp;Thing&amp;nbsp;Switched&amp;nbsp;On?&lt;/b&gt;&lt;br /&gt;lazy&amp;nbsp;initialization가&amp;nbsp;appllication에서&amp;nbsp;어떤&amp;nbsp;영향을&amp;nbsp;미치는지&amp;nbsp;확실하지&amp;nbsp;않을때&amp;nbsp;debugger를&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;도움이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;bean&amp;nbsp;중&amp;nbsp;하나의&amp;nbsp;생성자에&amp;nbsp;breakpoint를&amp;nbsp;걸어놓으면&amp;nbsp;초기화&amp;nbsp;시점을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;lazy&amp;nbsp;initialization가&amp;nbsp;활성화된&amp;nbsp;Spring&amp;nbsp;Boot&amp;nbsp;Web&amp;nbsp;Application에서&amp;nbsp;@Controller&amp;nbsp;bean은&amp;nbsp;Spring&amp;nbsp;MVC&amp;nbsp;DispatcherServlet이나&amp;nbsp;Spring&amp;nbsp;WebFlux의&amp;nbsp;DispatcherHandler에&amp;nbsp;대한&amp;nbsp;첫번째&amp;nbsp;요청이&amp;nbsp;생성될&amp;nbsp;때까지&amp;nbsp;생성되지&amp;nbsp;않는다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lazy&amp;nbsp;Initialization&amp;nbsp;설정을&amp;nbsp;해야할&amp;nbsp;때&lt;/b&gt;&lt;br /&gt;lazy&amp;nbsp;initialization이&amp;nbsp;지연&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있으므로&amp;nbsp;지연&amp;nbsp;시간이&amp;nbsp;크게&amp;nbsp;단축&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있지만&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;단점이&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;개발중이라면&amp;nbsp;lazy&amp;nbsp;initialization과&amp;nbsp;DevTools의&amp;nbsp;hot&amp;nbsp;restarts로&amp;nbsp;생산성을&amp;nbsp;획기적으로&amp;nbsp;향상시킬&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;application&amp;nbsp;integration&amp;nbsp;tests할&amp;nbsp;때도&amp;nbsp;test의&amp;nbsp;특정&amp;nbsp;type의&amp;nbsp;테스트에서&amp;nbsp;초기화되는&amp;nbsp;bean의&amp;nbsp;수를&amp;nbsp;제한함으로써&amp;nbsp;테스트&amp;nbsp;실행&amp;nbsp;시간을&amp;nbsp;줄이기&amp;nbsp;위해&amp;nbsp;이미&amp;nbsp;Spring&amp;nbsp;Boot의&amp;nbsp;Test&amp;nbsp;slice를&amp;nbsp;사용하고&amp;nbsp;있을텐데&amp;nbsp;lazy&amp;nbsp;initialization는&amp;nbsp;비슷한&amp;nbsp;최종&amp;nbsp;결과를&amp;nbsp;얻기&amp;nbsp;위한&amp;nbsp;대체&amp;nbsp;매커니즘을&amp;nbsp;제공한다.&lt;br /&gt;slicing을&amp;nbsp;테스트할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;application을&amp;nbsp;구성할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;position에&amp;nbsp;있지&amp;nbsp;않거나&amp;nbsp;특정&amp;nbsp;type의&amp;nbsp;테스트에&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;slice가&amp;nbsp;없는&amp;nbsp;경우&amp;nbsp;lazy&amp;nbsp;initialization을&amp;nbsp;활성화하면&amp;nbsp;초기화&amp;nbsp;된&amp;nbsp;bean이&amp;nbsp;테스트에&amp;nbsp;필요하다.&amp;nbsp;이렇게&amp;nbsp;하면&amp;nbsp;test&amp;nbsp;실행&amp;nbsp;시간이&amp;nbsp;단축된다.&amp;nbsp;특히&amp;nbsp;개발중에&amp;nbsp;테스트를&amp;nbsp;단독으로&amp;nbsp;실행하는&amp;nbsp;경우&amp;nbsp;더욱&amp;nbsp;단축된다.&lt;br /&gt;&lt;br /&gt;마지막으로&amp;nbsp;production에서&amp;nbsp;lazy&amp;nbsp;initialization을&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;좋지만&amp;nbsp;이럴&amp;nbsp;경우에는&amp;nbsp;조심스럽게&amp;nbsp;해야&amp;nbsp;한다.&lt;br /&gt;web&amp;nbsp;applications의&amp;nbsp;경우&amp;nbsp;container&amp;nbsp;orchestration은&amp;nbsp;응답&amp;nbsp;속도가&amp;nbsp;더&amp;nbsp;빨라지는&amp;nbsp;/health&amp;nbsp;endpoint의&amp;nbsp;이점을&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있지만&amp;nbsp;application&amp;nbsp;자체의&amp;nbsp;endpoint&amp;nbsp;중&amp;nbsp;하나에&amp;nbsp;대한&amp;nbsp;최초&amp;nbsp;요청일때&amp;nbsp;지연&amp;nbsp;시간이&amp;nbsp;증가&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;&lt;br /&gt;또&amp;nbsp;모든&amp;nbsp;component가&amp;nbsp;사용되면&amp;nbsp;원하지&amp;nbsp;않는&amp;nbsp;메모리&amp;nbsp;에러를&amp;nbsp;피하기&amp;nbsp;위해&amp;nbsp;lazy&amp;nbsp;initialization을&amp;nbsp;비활성화해서&amp;nbsp;application의&amp;nbsp;JVM&amp;nbsp;의&amp;nbsp;사이즈를&amp;nbsp;조정해야&amp;nbsp;한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;br /&gt;참고 Link&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Spring&amp;nbsp;Tips:&amp;nbsp;Be&amp;nbsp;Lazy&amp;nbsp;AND&amp;nbsp;Fast&amp;nbsp;with&amp;nbsp;Spring&amp;nbsp;Boot&amp;nbsp;2.2.M1!&lt;br /&gt;&lt;a href=&quot;https://spring.io/blog/2019/03/14/spring-tips-be-lazy-and-fast-with-spring-boot-2-2-m1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://spring.io/blog/2019/03/14/spring-tips-be-lazy-and-fast-with-spring-boot-2-2-m1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Spring&amp;nbsp;Boot&amp;nbsp;Lazy&amp;nbsp;Loading&amp;nbsp;Beans&amp;nbsp;Example&lt;br /&gt;&lt;a href=&quot;https://www.onlinetutorialspoint.com/spring-boot/spring-boot-lazy-loading-beans-example.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.onlinetutorialspoint.com/spring-boot/spring-boot-lazy-loading-beans-example.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>backend/Spring</category>
      <category>Spring</category>
      <category>springboot</category>
      <category>스프링</category>
      <category>스프링부트</category>
      <category>스프링프레임워크</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/604</guid>
      <comments>https://flyburi.tistory.com/604#entry604comment</comments>
      <pubDate>Tue, 16 Jul 2019 11:20:09 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Java Iterator를 Java Stream 으로 변환하기</title>
      <link>https://flyburi.tistory.com/603</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;원문&amp;nbsp; &lt;a href=&quot;https://www.javacodegeeks.com/2018/08/java-iterator-stream.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;Java Iterator to Java 8 Stream&lt;/a&gt; 을 가볍게 번역한 글입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;list 대신 Iterator 객체를 반환하는 다른 라이브러리를 써야할 때가 있는데, 라이브러리의 관점에서는 문제가 없지만 반환된 iterator에서 Java 8 stream을 사용하려는 경우 문제가 될 수 있다.&lt;/p&gt;&lt;p&gt;Iterator를 Iterable로 변환한 다음 쉽게 stream 쓸 수 있는 방법이 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;line-numbers language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;Iterator&lt;jsonvalue&gt; iterator = elements.iterator();
Iterable&lt;jsonvalue&gt; valueIterable = () -&amp;gt; iterator;

List&lt;string&gt; StreamSupport.stream(valueIterable.spliterator(), false)
                .map(element -&amp;gt; element.asString())
.collect(Collectors.toList());
&lt;/string&gt;&lt;/jsonvalue&gt;&lt;/jsonvalue&gt;&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Iterator 클래스는 stream으로 사용할 수 없지만 Iterable은 가능하다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;iterator() 메소드를 오버라이드해서 새로운 Iterable 클래스를 셍상히야 우리가. stream하려는 Iterator를 리턴한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아직 stream 가능하지 않은 Iterable이 있는데 이건 StreamSupport 클래스를 사용하여 Iterable을 stream으로 변환해야한다.&lt;/p&gt;</description>
      <category>backend/Java</category>
      <category>Iterable</category>
      <category>Iterator</category>
      <category>java</category>
      <category>java8</category>
      <category>stream</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/603</guid>
      <comments>https://flyburi.tistory.com/603#entry603comment</comments>
      <pubDate>Fri, 7 Sep 2018 09:29:31 +0900</pubDate>
    </item>
    <item>
      <title>[책] 함수형 사고 - Chapter 2. 전환 - 2.4 골치 아프게 비슷비슷한 이름들.</title>
      <link>https://flyburi.tistory.com/602</link>
      <description>&lt;p&gt;[책] 함수형 사고 - Chapter 2. 전환&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;책 함수형 사고(Functional Thinking)을 읽고, 관련 예제를 살펴보며 간단 정리한 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;책 예제와는 조금 다를 수도 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;참고) 영문 책의 예제&lt;/p&gt;
&lt;p&gt;https://github.com/oreillymedia/functional_thinking&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;2.4 골치 아프게 비슷비슷한 이름들 - 스칼라 버전&lt;/h1&gt;
&lt;pre class=&quot;line-numbers language-java&quot;&gt; 
&lt;code class=&quot;language-java&quot;&gt;
/** 필터(filter) **/

//각 숫자가 3으로 나뉘어야 한다는 조건을 가진 코드 블록을 filter() 함수를 적용한다.
val numbers = List.range(1, 11)
numbers filter (x =&amp;gt; x % 3 == 0)
//res0: List[Int] = List(3, 6, 9)

//스칼라에서는 매개변수를 언더바로 치환하는게 가능하므로 더 간결하게 코드를 짤 수 있다.
numbers filter (_ % 3 == 0)
//res1: List[Int] = List(3, 6, 9)

val words = List(&quot;the&quot;, &quot;quick&quot;, &quot;brown&quot;, &quot;fox&quot;, &quot;jumped&quot;, &quot;over&quot;, &quot;the&quot;, &quot;lazy&quot;, &quot;dog&quot;)
words filter (_.length == 3)
//res2: List[String] = List(the, fox, the, dog)

//스칼라의 필터 연산 중 다른 한 가지는 컬렉션을 여러 조각으로 분리한 결과를 리턴하는 partition() 함수
//분리 조건을 정하는 함수를 전달하여 어떻게 분리할지를 정한다.
//다음 partition() 함수는 3으로 나뉘는가 여부에 따라 분리된 두 목록을 리턴한다.
numbers partition (_ % 3 == 0)
//res3: (List[Int], List[Int]) = (List(3, 6, 9),List(1, 2, 4, 5, 7, 8, 10))

//filter() 함수는 조건에 맞는 요소들의 컬렉션을 리턴하는 반면, find() 함수는 조건을 만족시키는 첫번째 요소만 리턴한다.
numbers find (_ % 3 == 0)
//res4: Option[Int] = Some(3)

numbers find (_ &amp;lt; 0)
//res5: Option[Int] = None

//컬렉션에서 주어진 술어 함수에 만족시키는 요소를 간직하거나 또는 버리는 함수들도 가지고 있다.
//takeWhile() 함수는 컬렉션의 앞에서부터 술어함수를 만족시키는 값들의 최대 집합을 리턴한다.
List(1, 2, 3, -4, 5, 6, 7, 8, 9, 10) takeWhile (_ &amp;gt; 0)
//res6: List[Int] = List(1, 2, 3)


// dropWhile() 함수는 술어 함수를 만족시키는 최다수의 요소를 건너뛴다.
words dropWhile (_ startsWith (&quot;t&quot;))
//res7: List[String] = List(quick, brown, fox, jumped, over, the, lazy, dog)



/** 맵(map) **/
//모든 함수형 언어에서 볼 수 있는 맵.
//맵 함수는 함수와 컬렉션을 받아서 이 함수를 각 요소에 적용한 후 컬렉션을 리턴한다.
//리턴된 컬렉션은 개개의 값은 변했지만 필터의 경우와는 달리 원래 컬렉션과 크기는 같다.

List(1, 2, 3, 4, 5) map (_ + 1)
//res8: List[Int] = List(2, 3, 4, 5, 6)

//map() 함수는 컬렉션의 각 요소가 변형된 값을 리턴하는 것 외에 아래 경우에는 문자열의 각 요소의 길이를 목록으로 리턴한다.
words map (_.length)
//res9: List[Int] = List(3, 5, 5, 3, 6, 4, 3, 4, 3)

//중첩을 펼치는 연산을 플래트닝(Flattening)이라고 한다.
List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)) flatMap (_.toList)
//res10: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

//flatMap() 함수는 전통적인 의미에서 중첩되지 않은 것처럼 보이는 자료구조에도 적용된다.
//문자열의 목록은 중첩된 문자들의 배열로 볼 수 있다.
//words flatMap  (_.toList)
//res11: List[Char] = List(t, h, e, q, u, i, c, k, b, r, o, w, n, f, o, x, j, u, m, p, e, d, o, v, e, r, t, h, e, l, a, z, y, d, o, g)

/** 폴드(fold)/리듀스(reduce) **/
//스칼라는 동적 타이핑 언어인 그루비나 클로저에서는 다루지 않는 다양한 자료형 시나리오들을 해결해야 하기 때문에 폴드 연산 종류가 가장 다양하다.

//합계를 내는 데에는 리듀스를 주로 사용한다.
List.range(1, 10) reduceLeft ((a, b) =&amp;gt; a + b)
//res12: Int = 45

List.range(1, 10) reduceLeft (_ + _)
//res12: Int = 45

//reduceLeft() 함수는 첫째 요소가 연산의 좌항이라고 간주한다. 덧셈은 피연산자의 위치에 상관없지만, 나눗셈과 같은 경우에는 순서가 중요하다.
//연산자가 적용되는 순서를 뒤바꾸려면 reduceRight()를 사용하라.
//reduceRight() 함수는 피연산자의 순서를 바꾸는 것이 아니라, 연산의 방향을 뒤바꾼다.
//8 - 9를 먼저 연산하고, 그 결과를 다음 연산의 두번째 매개변수로 사용한다.
List.range(1, 10) reduceRight (_ - _)
// 8 - 9 = -1
// 7 - (-1) = 8
// 6 - 8 = -2 ...
//res13: Int = 5

//리듀스와 같은 고수준의 추상 개념을 어떤 경우에 사용하는 가를 터득하는 것이 함수형 프로그래밍을 마스터하는 방법 중의 하나이다.
//이 예제는 reduceLeft()를 사용하여 컬렉션에 들어있는 가장 긴 단어를 찾아낸다.
words.reduceLeft((a, b) =&amp;gt; if (a.length &amp;gt; b.length) a else b)
//res14: String = jumped

//리듀스와 폴드는 서로 중복되는 기능을 가지고 있지만 조금씩 차이가 있다.
//스칼라에서 reduceLeft[B&amp;gt;:A](op: (B,A) =&amp;gt; B) :B의 시그니처를 보면 각 요소를 결합시키는 함수가 유일한 매개변수이다.
//초기값은 컬렉션의 첫번째 요소로 간주한다.
//반면에 foldLeft[B](z:B)(op:(B,A) =&amp;gt;B):B의 시그니처는 초기 시드 값을 포함하기 때문에 목록의 요소와 다른 자료형의 리턴값을 가능하게 해준다.
List.range(1,10).foldLeft(0)(_ + _)
//res15: Int = 45

//스칼라는 연산자 오버로딩을 지원한다.
//자주 사용되는 두 폴드 연산 foldLeft와 foldRight는 상응하는 연산자 /:과 :\가 있다.
//foleLeft를 사용한 합의 더욱 간결한 버전을 만들어보자.
(0 /: List.range(1,10)) (_ + _)
//res16: Int = 45

//foldRight() 함수나 :\ 연산자를 사용하여 목록 각 요소간의 계단식 차를 구할 수 있다.
(List.range(1,10) :\ 0) (_ - _)
//res17: Int = 5
&lt;/code&gt;
&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>backend</category>
      <category>Book</category>
      <category>functional thinking</category>
      <category>Programming</category>
      <category>Scala</category>
      <category>스칼라</category>
      <category>함수형 사고</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/602</guid>
      <comments>https://flyburi.tistory.com/602#entry602comment</comments>
      <pubDate>Sun, 22 Jul 2018 21:25:38 +0900</pubDate>
    </item>
    <item>
      <title>[책] 함수형 사고 - Chapter 2. 전환</title>
      <link>https://flyburi.tistory.com/601</link>
      <description>&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(102, 102, 102); font-family: &amp;quot;Spoqa Han Sans&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;책 함수형 사고(Functional Thinking)을 읽고, 관련 예제를 살펴보며 간단 정리한 것입니다.&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(102, 102, 102); font-family: &amp;quot;Spoqa Han Sans&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;책 예제와는 조금 다를 수도 있습니다.&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(102, 102, 102); font-family: &amp;quot;Spoqa Han Sans&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(102, 102, 102); font-family: &amp;quot;Spoqa Han Sans&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;참고) 영문 책의 예제&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(102, 102, 102); font-family: &amp;quot;Spoqa Han Sans&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;&lt;a href=&quot;https://github.com/oreillymedia/functional_thinking&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;color: rgb(51, 51, 51);&quot;&gt;https://github.com/oreillymedia/functional_thinking&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br style=&quot;color: rgb(102, 102, 102); font-family: &amp;quot;Spoqa Han Sans&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;Chapter 2. 전환&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;명령형 처리&lt;/h2&gt;&lt;p&gt;명령형 프로그래밍이란 상태를 변형하는 일련의 명령들로 구성된 프로그래밍 방식.&lt;/p&gt;&lt;p&gt;전형적인 for 루프가 명령형 프로그래밍의 훌륭한 예. 초기 상태를 설정하고 되풀이할때마다 일련의 명령을 실행한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;명령형 프로그래밍은 개발자로 하여금 루프 내에서 연산하기를 권장한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;책에 나와 있는 예제에서는 세가지를 실행했다.&lt;/p&gt;&lt;p&gt;한 글자짜리 이름을 필터했고, 목록에 남아있는 이름들을 대문자로 변형하고, 이 목록을 하나의 문자열로 변환했다.&lt;/p&gt;&lt;p&gt;우선 이 세가지 작업을 목록에 적용할 '유용한 작업들'이라고 정의하자.&amp;nbsp;&lt;/p&gt;&lt;p&gt;명령형 언어에서는 세 가지 작업에 모두 저수준의 매커니즘을(목록 내에서 반복해서) 사용해야 한다.&lt;/p&gt;&lt;p&gt;함수형 언어들은 이런 작업을 위한 몇몇 도우미(helper)들을 제공한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;함수형 처리&lt;/h2&gt;&lt;p&gt;함수형 프로그래밍은 프로그램을 수학 공식을 모델링하는 표현과 변형으로 기술하며, 가변 상태를 지양한다.&lt;/p&gt;&lt;p&gt;개발자는 고계함수에 매개변수로 주어지는 함수를 이용하여 저수준의 작업을 커스터마이즈할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;의사코드를 사용하여 개념화해보자.&lt;/p&gt;&lt;p&gt;listOfEmps&lt;/p&gt;&lt;p&gt;-&amp;gt; filter(x.length &amp;gt; 1)&lt;/p&gt;&lt;p&gt;-&amp;gt; transform(x.capitalize)&lt;/p&gt;&lt;p&gt;-&amp;gt; convert(x + &quot;,&quot; + y)&lt;/p&gt;
&lt;pre class=&quot;line-numbers language-java&quot;&gt; 
&lt;code class=&quot;language-java&quot;&gt;
/**
 * Chapter 2. 전환
 * 예제 : 어떤 이름 목록에서, 한 글자로 된 이름을 제외한 모든 이름의 첫글자를 대문자화해서 쉼표로 연결한 문자열을 구하자.
 */
public class TheCompanyProcess {

	//for문을 이용한 명령형 처리
	public String cleanNames(List&lt;string&gt; listOfNames) {
		StringBuilder result = new StringBuilder();
		for (int i = 0; i &amp;lt; listOfNames.size(); i++) {
			if (listOfNames.get(i).length() &amp;gt; 1) {
				result.append(capitalizeFirstLetter(listOfNames.get(i))).append(&quot;,&quot;);
			}
		}
		return result.substring(0, result.length() - 1);
	}

	//함수형 처리
	//고계함수에 매개변수로 주어지는 함수(고계함수)를 이용.
	public String cleanNamesLambda(List&lt;string&gt; names) {
		if (names == null) return &quot;&quot;;

		return names.stream()
				.filter(name -&amp;gt; name != null)
				.filter(name -&amp;gt; name.length() &amp;gt; 1)
				.map(name -&amp;gt; capitalizeFirstLetter(name))
				.collect(Collectors.joining(&quot;,&quot;));
	}

	private String capitalizeFirstLetter(String s) {
		return s.substring(0, 1).toUpperCase() + s.substring(1, s.length());
	}
}
&lt;/string&gt;&lt;/string&gt;&lt;/code&gt;
&lt;/pre&gt;</description>
      <category>backend</category>
      <category>functional</category>
      <category>functional thinking</category>
      <category>Programming</category>
      <category>함수형 사고</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/601</guid>
      <comments>https://flyburi.tistory.com/601#entry601comment</comments>
      <pubDate>Sun, 22 Jul 2018 15:50:42 +0900</pubDate>
    </item>
    <item>
      <title>[책] 함수형 사고 - Chapter 1. 왜</title>
      <link>https://flyburi.tistory.com/600</link>
      <description>&lt;p&gt;책 함수형 사고(Functional Thinking)을 읽고, 관련 예제를 살펴보며 간단 정리한 것입니다.&lt;/p&gt;
&lt;p&gt;책 예제와는 조금 다를 수도 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;참고) 영문 책의 예제&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/oreillymedia/functional_thinking&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/oreillymedia/functional_thinking&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;Chapter 1. 왜&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;전혀 새로운 프로그래밍 패러다임의 문제는 새로운 언어를 배우는 것이 아니고, 다른 방식으로 사고하는 법을 배우는 것.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;객체지향 프로그래밍은 움직이는 부분을 캡슐화하여 코드 이해를 돕고, 함수형 프로그래밍은 움직이는 부분을 최소화하여 코드 이해를 돕는다.&lt;/p&gt;
&lt;p&gt;- 마이클 페더스&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;함수형 개발자는 적은 수의 자료구조와 그것들을 잘 이해하기 위한 최족화된 방법을 만들기를 선호한다.&lt;/p&gt;
&lt;p&gt;객체지향형 개발자는 항상 새로운 자료구조와 그것에 부착된 메서드를 만든다. 클래스와 통신 메시지를 만드는 것이 지배적인 객체지향 패러다임이다.&lt;/p&gt;
&lt;p&gt;모든 자료구조를 캡슐화하면 메스드 수준의 재사용보다는 큰 프레임워크 스타일의 재사용을 선호하게 된다.&lt;/p&gt;
&lt;p&gt;함수형 프로그래밍 구조는 세부적인 단계에서 쉽게 코드를 재사용할수 있게 한다.&lt;/p&gt;
&lt;pre class=&quot;line-numbers language-java&quot;&gt; 
&lt;code class=&quot;language-java&quot;&gt;
/**
 * Chapter 1. 왜
 * 예제 : 텍스트 파일을 읽고, 가장 많이 사용된 단어들을 찾고, 그 단어들과 빈도를 정렬된 목록으로 출력하라.
 */

public class Words {

	private Set&lt;string&gt; NON_WORDS = new HashSet&lt;string&gt;() {
		{
			add(&quot;,&quot;);
		}
	};

// 자바 8  이전의 단어 빈도 수 세기
	public Map freq(String words) {
		TreeMap&lt;string, integer=&quot;&quot;&gt; wordMap = new TreeMap&amp;lt;&amp;gt;();

		Matcher m = Pattern.compile(&quot;\\w+&quot;).matcher(words);

		while (m.find()) {
			String word = m.group().toLowerCase();
			if (!NON_WORDS.contains(word)) {
				if (wordMap.get(word) == null) {
					wordMap.put(word, 1);
				} else {
					wordMap.put(word, wordMap.get(word) + 1);
				}
			}
		}

		return wordMap;
	}

// 자바 8  이후의 단어 빈도 수 세기
	public Map freqLambda(String words) {
		TreeMap&lt;string, integer=&quot;&quot;&gt; wordMap = new TreeMap&amp;lt;&amp;gt;();

		regexForList(words, &quot;\\w+&quot;).stream()
				.map(w -&amp;gt; w.toLowerCase())
				.filter(w -&amp;gt; !NON_WORDS.contains(w))
				.forEach(w -&amp;gt; wordMap.put(w, wordMap.getOrDefault(w, 0) + 1));
		return wordMap;
	}

	private List&lt;string&gt; regexForList(String words, String regex) {
		List wordList = new ArrayList();
		Matcher m = Pattern.compile(regex).matcher(words);
		while (m.find()) {
			wordList.add(m.group());
		}

		return wordList;
	}
}
&lt;/string&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string&gt;&lt;/string&gt;&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>backend</category>
      <category>Book</category>
      <category>functional thinking</category>
      <category>IT책</category>
      <category>Programming</category>
      <category>책</category>
      <category>함수형 사고</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/600</guid>
      <comments>https://flyburi.tistory.com/600#entry600comment</comments>
      <pubDate>Sun, 15 Jul 2018 22:35:53 +0900</pubDate>
    </item>
    <item>
      <title>[ios] iphone 무선 디버깅 연결하기</title>
      <link>https://flyburi.tistory.com/599</link>
      <description>&lt;p&gt;iphone app 개발시, USB 쓰기 귀찮으니까 무선으로 연결해보자! 아주 간단!!&lt;/p&gt;&lt;p&gt;블로깅하는게 더 오래걸리는...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하지만, Xcode 9에서 새로 지원된 기능인 만큼.&lt;/p&gt;&lt;p&gt;Xcode 9 이상, iOS 11 이상에서만 지원한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Xcode &amp;gt; Window&lt;/p&gt;&lt;p&gt;Devices and Simulators 를 선택.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 285px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/996ACA3A5B3598B835&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F996ACA3A5B3598B835&quot; width=&quot;285&quot; height=&quot;360&quot; filename=&quot;2.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;Devices 탭에&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;connect via network 선택이 기본으로 선택해제 되어 있으니, 체크 해주고 나오면 끝! 빌드해서 실행해보자!&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99FC6A3A5B3598B901&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99FC6A3A5B3598B901&quot; width=&quot;820&quot; height=&quot;513&quot; filename=&quot;스크린샷 2018-06-29 오전 11.21.17.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Mobile/ios &amp;amp; swift</category>
      <category>APP</category>
      <category>IOS</category>
      <category>iPhone</category>
      <category>mobile</category>
      <category>swift</category>
      <category>아이폰</category>
      <category>아이폰 앱 개발</category>
      <category>앱개발</category>
      <author>버리야</author>
      <guid isPermaLink="true">https://flyburi.tistory.com/599</guid>
      <comments>https://flyburi.tistory.com/599#entry599comment</comments>
      <pubDate>Mon, 2 Jul 2018 21:29:49 +0900</pubDate>
    </item>
  </channel>
</rss>