<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ahri.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 13 Aug 2023 07:52:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. ahri.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ahreum-kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[<폭스바겐은 왜 고장난 자동차를 광고했을까?> 를 읽고  ]]></title>
            <link>https://velog.io/@ahreum-kim/%ED%8F%AD%EC%8A%A4%EB%B0%94%EA%B2%90%EC%9D%80-%EC%99%9C-%EA%B3%A0%EC%9E%A5%EB%82%9C-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%A5%BC-%EA%B4%91%EA%B3%A0%ED%96%88%EC%9D%84%EA%B9%8C-%EB%A5%BC-%EC%9D%BD%EA%B3%A0</link>
            <guid>https://velog.io/@ahreum-kim/%ED%8F%AD%EC%8A%A4%EB%B0%94%EA%B2%90%EC%9D%80-%EC%99%9C-%EA%B3%A0%EC%9E%A5%EB%82%9C-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%A5%BC-%EA%B4%91%EA%B3%A0%ED%96%88%EC%9D%84%EA%B9%8C-%EB%A5%BC-%EC%9D%BD%EA%B3%A0</guid>
            <pubDate>Sun, 13 Aug 2023 07:52:00 GMT</pubDate>
            <description><![CDATA[<p>호랑이는 가죽을 남기고 브랜드는 스토리를 남긴다. 기업들의 브랜드 전략, 혁신, 아이디어 등에 관련한 책이다. 짧은 이야기들을 통해 글로벌 기업들의 브랜당, 문제상황과 해결과정 등을 보여준다. 여러 에피소드들 중 파트별로 기억에 남는 에피소드를 소개하고자 한다. </p>
<h4 id="1-브랜드--폭스바겐-나이키">1. 브랜드 : 폭스바겐, 나이키</h4>
<p><strong>&lt;&lt;폭스바겐은 왜 고장난 자동차를 광고했을까?&gt;&gt;</strong>
책의 제목이지만 266 페이지중, 단 3 페이지만 차지한, 수많은 이야기 중 하나다. 광고는 보통 자사의 장점 만을 얘기한다. 폭스바겐은 불량이 난 차를 광고했다. 폭스바겐의 품질검사에서 어떻게 이 차량이 불량 판정을 받았는지, 어떤 검사원이 이 불량을 발견했는지 광고했다. 자사의 엄격한 품질검사 과정을 보여줌으로써 소비자들의 신뢰를 얻었다. 책 제목으로 선정된 것에 비해 매우 짧은 스토리였지만, 제목만으로 소비자(=나)의 관심을 끌은 것에 대해 마케팅에 대한 이야기를 소개하는 책 답다는 생각이 들었다. </p>
<p><strong>&lt;&lt;나이키: 저스트 두 잇 의 탄생&gt;&gt;</strong>
댄은 밤늦도록 나이키의 광고 카피를 고민했다. 그러다 사형수의 마지막 유언이 스쳐 지나갔다. 죽기전, 마지막으로 하고 싶은 말이 있냐는 질문에 사형수는 답했다. &#39;Let&#39;s do it.(자, (사형집행을) 시작합시다)&#39; 댄은 다시 광고 카피를 생각했다. 사형수의 최후진술이 마음에 들지 않았다. 다시 고쳐서 적었다. &#39;Just do it.&#39; 생뚱맞은 상황을 떠올리며 얻게된 슬로건. 영감은 언제나 예기치 않은 순간에 떠오른다. 계속 코딩에 대한 생각을 하며 산책을 하면 퍼뜩(!) 해결방법이 떠오르는 것처럼. </p>
<h4 id="2-혁신--튜브영국지하철-에이비스">2. 혁신 : 튜브(영국지하철), 에이비스</h4>
<p><strong>&lt;&lt;튜브 : 영국의 지하철이 최악에서 최고가 된 작은 비밀&gt;&gt;</strong>
세계 최초의 지하철인 영국의 튜브 지하철. 평판은 좋지 못했다. 여러 투자로 지하철 환경을 개선해도 부정적인 평가가 많았다. 취한 전략은 &#39;무소식이 희소식 안내방송 전략.&#39; 이전의 안내방송은 정류장과 방향을 알려주거나 안전에 유의하라는 방송, 혹은 문제상황을 알려주는 방송이 다였다. 좋은 이야기에 대한 방송은 없었다. 그래서 좋은 소식을 알리기 시작했다. 우수한 서비스를 알리는 방송, 지하철이 문제없이 운행되고 있다는 방송. 승객 만족도가 점차 올라갔고 파리와 마드리드를 이기고 최고의 지하철이 되었다. 
회사에서 보고를 할때도 마찬가지일 것이다. 프로젝트가 문제없이 진행되고 있다는 보고. 이미 앞서서 버그를 고쳐두었기 떄문에 다른 문제들이 생기지 않았다는 보고. 너무 자주하면 안되겠지만 무소식이 희소식 전략이 중요한 것 같다. </p>
<p><strong>&lt;&lt;에이비스 : 렌터카 넘버2 업체의 생존전략&gt;&gt;</strong>
에이비스는 심각한 적자 상황이었다. 이를 타개하기 위해 회사에 긍정적인 이미지가 필요했다. 2등 전략의 광고를 통해 성공했다. &quot;에이비스는 업계 2위에 불과합니다. 그러므로 우리는 더욱 노력합니다.&quot; 업계 2위임을 선언하며, 소비자들에게 최선을 다하겠다고 전했다. 실제로도 소비자들에게 향상된 서비스를 제공하기 위해 노력했다. &#39;1등만 기억하는 더러운 세상&#39; 이라는 유행어가 있다. 수능을 보면 그 해 1등이 누구인지 궁금해한다. 브랜드에서도 oo업계 1위 를 홍보한다. 그러나 생각을 바꾸어 보면, 우리가 기억하는 2등도 있다. &#39;만년 2등 홍진호.&#39; 브랜딩을 하는데 있어서는 2등의 효과(라이벌 효과)도 중요하다고 생각한다. 사람들이 1등을 기억할때 자연스럽게 2등도 따라올테니. </p>
<h4 id="3-아이디어-실행-리더--굿럭-마가린-토이스토리">3. 아이디어, 실행, 리더 : 굿럭 마가린, 토이스토리</h4>
<p><strong>&lt;&lt;굿럭 마가린 : 퍼스트레이디의 마가린 광고는 왜 실패했을까?&gt;&gt;</strong>
미국 전대통령 루스벨트의 영부인인 엘리너 루스벨트. 엘리너를 모델로 마가린 광고를 했으나 광고효과는 부진했다. 모델 자체가 워낙 유명인이기에 엘리너가 광고를 했다는 사실만 사람들에게 기억되었다. 마가린 제품 자체는 관심에 없었다. 무조건 유명한 사람을 쓴다고 제품홍보가 되지는 않는다. 무언가를 광고하려면 항상 유념해야 할 사항이다. 목적은 제품을 광고하는 것이다. 그 목적을 이룰 수 있을지 고민하며 광고를 진행하자.</p>
<p><strong>&lt;&lt;토이스토리 : 스티브 잡스의 철학, 토이스트리의 탄생&gt;&gt;</strong>
잡스는 픽사 직원에게 당부했다. 우수한 품질을 보장해야 한다. 
대중이 브랜드에 대해 느끼는 방식은 은행 계좌와 같다. 예금을 할 수도, 인출을 할 수도 있다. 인출 계좌가 되는 일이 없도록 하자. 애플에서 컴퓨터를 만들면 컴퓨터의 수명은 고작 4~5년 이지만, 영화들은 이 세상에 영원히 남게된다. 잡스는 언제나 더 높은 수준을 추구하고 도달하도록 유도했고, 이를 바탕으로 픽사의 토이스토리가 탄생했다. 
잡스가 말한 &#39;브랜드는 은행 계좌&#39; 라는 점이 와닿았다. 소비자들이 브랜드에 흥미가 떨어지고 신뢰를 잃게되면 계좌는 바닥날 수 있다. 언제나 브랜드의 평판을 유지하기 위해 애써야 하고 품질을 최상으로 보장하도록 해야 한다. </p>
<blockquote>
</blockquote>
<h3 id="나의-주저리">나의 주저리</h3>
<p>재미있었다. 짧은 이야기들로 구성되어 있어 쉽게 읽혔다. 당시 기업들이 직면한 세세한 상황을 알 수는 없지만 다양한 기업들이 생사의 과정에서 취한 전략들을 읽었다. &#39;브랜드&#39; 라는 것은 참 어렵다. 이미지를 쌓아가는 것도, 유지하는 것도 어렵지만, 특히, 브랜드의 가치가 훼손되었을때 다시 신뢰를 회복하는 것도 무척이나 어렵다. 내가 한 기업을 운영하는 것은 아니지만 &#39;나&#39;라는 사람을 운영하는 기업가(?)로써 자신을 어떻게 브랜딩해야 하는가에도 접목시켜볼 만한 책인 것 같다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[<나를 지키는 심리학> 을 읽고]]></title>
            <link>https://velog.io/@ahreum-kim/%EB%82%98%EB%A5%BC-%EC%A7%80%ED%82%A4%EB%8A%94-%EC%8B%AC%EB%A6%AC%ED%95%99-%EC%9D%84-%EC%9D%BD%EA%B3%A0</link>
            <guid>https://velog.io/@ahreum-kim/%EB%82%98%EB%A5%BC-%EC%A7%80%ED%82%A4%EB%8A%94-%EC%8B%AC%EB%A6%AC%ED%95%99-%EC%9D%84-%EC%9D%BD%EA%B3%A0</guid>
            <pubDate>Fri, 28 Jul 2023 09:41:17 GMT</pubDate>
            <description><![CDATA[<p>읽으면서 내가 기대했던 내용을 담은 책은 아니라서 아쉬웠다.
어떻게 심리학을 통해 나를 지켜갔는지, 개인의 감정이나 상황과 이를 어떻게 대처했는지 등을 좀 더 구체적으로 서술해 주리라 기대했다. *<em>죽고 싶지만, 떡볶이는 먹고 싶어 (백세희 에세이) *</em> 와 같은 책이라 기대했으나, 정신분석학의 측면에서 여러 개인의 사례와 이에 대한 해결(?) 방법을 다루고 있다.
그렇지만 읽으면서 느끼는 바도 있고 다양한 사례가 있는 만큼 각각에 맞는 해결 방법이 있으니, 그리고 내가 겪었던 문제들도 생각나고, 무엇보다 책이 술술 읽히니 가히 괜찮은 책이라 하겠다.</p>
<h3 id="1-못난-게-아니라-마음이-힘든-겁니다">1. 못난 게 아니라 마음이 힘든 겁니다.</h3>
<p> 파트 1 에서 가장 공감 갔던 사례는 학습된 무기력과 적응장애, 목적 없는 질주이다.</p>
<p>이직하고 회사에 다니면서, 그 팀에서 내가 가장 못하는 사람 같았다. 다들 너무나도 잘하고 어나더레벨처럼 보였다. 면접 볼 때는 열심히 하겠다고 잘할 수 있다고 해놓고서는, 막상 회사에 다니면서 자신감이 엄청나게 떨어졌다. 내가 못 하는 일을 시킬까 봐 전전긍긍 하기도 하고 학습된 무기력 수준이 아니라 그냥 나는 뭘 할 수 있나…? 어떻게 해야 하나…? 나랑 맞지 않은 회사를 온 것 같았다.</p>
<p>책에서는 학습된 무기력일 때, 내가 아무것도 할 수 없는 하찮은 존재라 느껴질 때, 작은 것부터 시도하라고 한다. 운동이라도 요리라도. 나는 이것을 잘하는 사람이구나. 이렇게 하나씩 긍정적인 경험을 다시 학습해야 한다고. 적응장애를 겪을 땐, 자신을 이해하라고 한다. 힘들어하고 있는 자기 자신을 깨닫고 이해하고 지지해주라고. 나를 응원해주라고 한다. 목적 없는 질주하고 있다면? 당연히 목적을 찾아야겠지.버킷리스트든, 무엇이든 목적을 가지라 한다.</p>
<p>나는 힘들었을 때, 블라인드 댓글에 있던 책 구절로 위로받았다. 회사에서의 모습이 당신의 전부는 아니라고. 어쩌면 회사에서 당신은 무능할 수도 있지만, 그건 단지 회사에서일 뿐이라고. 당신은 그것보다 더 많은, 다양한 면을 더 많이 가지고 있다고(예전에 캡처해서 저장해두었는데 삭제한 듯). 지금은 힘들었던 적응의 시기를 지나 잘 먹고 잘 잔다. 이런 시간이 부정적이지만은 않다. 이렇게 힘듦의 시기를 지나면 좀 더 단단해지기도 하기에.  </p>
<h3 id="2-상처받은-건-그가-아니라-나-입니다">2. 상처받은 건 그가 아니라 &#39;나&#39; 입니다.</h3>
<p> 파트 2에서 마음에 와닿은 문장은 &quot;우리는 누구나 공격자가 될 수 있다&quot;</p>
<p> 누군가가 나에게 공격자가 될 수 있는 만큼, 나 또한 누군가에게 공격자가 될 수 있다. 나도 너무나 나약하고 부족한 사람이라는 것을 항상 기억하자. 또한 기억해야 할 것은, &quot;자기가 하기 싫은 일을 남에게 하게 해서는 안 된다&quot;&lt;논어&gt;</p>
<h3 id="3-나부터-잘-알아야-일도-더-잘됩니다">3. 나부터 잘 알아야 일도 더 잘됩니다.</h3>
<p>회의 공포증, 걱정 조절하기, 거울 자아의 사례가 기억에 남는다. 회의 공포증은 내 경우엔, 공포라기보다는 떨리는 정도다. 마음에 짐이 되는 정도? 왜냐면 회의를 할 때 각자 무슨 일을 했고 어떻게 했고 남은 일은 뭔지 얘기하는데, 발표하는 것 같고 말을 잘하지 못하는 것 같고 평가받는 것 같아서 떨렸다. 그래서 내가 선택한 방법은 대본을 쓰는 거였다. 대본이 있으면 안 떨리고, 말도 좀 더 정리된 채로 전달이 되어서, 지금도 열심히 회의 시간에 대본을 읽고 있다. 그리고 목소리가 떨릴 때는 잠시 숨을 한번 쉬고 다시 읽으면 괜찮아진다. 언젠가는 뭐 대본 없이도 말을 잘 전달할 수 있는 사람이 되겠지.</p>
<p>걱정 조절하기. 근데 걱정은 어떻게 조절하는 거예요? 나는 원래부터 걱정 순이라서 그냥 걱정을 열심히 충분히 하고 살기로 했다. 걱정하면 좋은 점이 있다. 나름 스스로 최악의 상황을 걱정했기에 현실이 긍정적으로된다(대부분 최악의 상황은 오지 않기에). &quot;오 최악의 상황은 피했군. 굿굿<del>!&quot;<br>완벽한 내가 되려는 거울 자아. 대학생 때 완벽해야 한다는 강박을 많이 극복했던 것 같다. 나는 내가 생각한 만큼 완벽한 사람이 될 수는 없다고. 나는 완전 연약한 인간이라고. 완벽하지 못한 나를 보며 실망하는 게 아니라, 오늘의 나를 칭찬하는 거다. 오늘 열심히 책을 읽고 독후감 쓴 나 자신 칭찬해</del>!</p>
<h3 id="4-그럼에도-내-마음이-가장-소중합니다">4. 그럼에도 내 마음이 가장 소중합니다.</h3>
<p>모든 일, 모든 상황에서 내 마음이 가장 소중하다. 다른 사람 아니고 나. 남의 판단 아니고 나. 그냥 나.</p>
<blockquote>
</blockquote>
<h3 id="나의-주저리--나">나의 주저리 : 나</h3>
<p>&quot;나&quot;라는 단어를 말할 때, 가장 자신의 목소리가 나온다고 한다. 나. 당신이 주인공이라는 말이 있듯이, 나 자신이 나의 삶의 가장 중요한 사람이라는 것을 기억하자. 삶의 많은 부분을 겪어왔음에, 잘 지나갔음에 감사하다. 그리고 무엇보다 <code>나</code>를 잘 돌아보고 응원해야 한다는 것에 공감한다. 오늘도 나 자신, 수고 많았고 앞으로도 응원한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[<지적 대화를 위한 넓고 얇은 지식> 을 읽고]]></title>
            <link>https://velog.io/@ahreum-kim/%EC%A7%80%EC%A0%81-%EB%8C%80%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%84%93%EA%B3%A0-%EC%96%87%EC%9D%80-%EC%A7%80%EC%8B%9D-%EC%9D%84-%EC%9D%BD%EA%B3%A0</link>
            <guid>https://velog.io/@ahreum-kim/%EC%A7%80%EC%A0%81-%EB%8C%80%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%84%93%EA%B3%A0-%EC%96%87%EC%9D%80-%EC%A7%80%EC%8B%9D-%EC%9D%84-%EC%9D%BD%EA%B3%A0</guid>
            <pubDate>Sun, 16 Jul 2023 14:28:18 GMT</pubDate>
            <description><![CDATA[<p>A와 B가 있다. A는 1억 원의 빵이 있고 B는 1억 원의 빵 공장이 있다. 여기서 부의 가치가 더 높은 사람은 누굴까? ** B다!!!** A는 생산물(빵)을 소유했고, B는 생산수단(빵 공장)을 소유한 것이기 때문이다.</p>
<p>생산수단은 생산물을 생산해 낼 수 있다. 책에서는 5개의 분야 역사, 경제, 정치, 사회, 윤리에 관해 설명하지만, 특히 생산수단의 변화가 만들어 낸 역사의 흐름이 인상 깊어서 역사 중심으로 책의 내용을 정리하고자 한다. </p>
<h3 id="역사">역사</h3>
<h4 id="원시-고대-중세-근대-현대--생산수단과-공급과잉">원시, 고대, 중세, 근대, 현대 : 생산수단과 공급과잉</h4>
<p>&lt;생산수단&gt;
** 원시**는 공산사회로 재산을 공동으로 소유하고 관리하는 시대다. 소득이 있으면 함께 나누고 없으면 함께 굶는다. 생산수단도 소유주도 없는 평등한 사회다.</p>
<p> <strong>고대</strong> 시대는 토지, 영토가 중요한 생산수단이다. 생산수단은 왕이 소유했고 다른 사람의 노동력을 이용할 수 있는 도구가 되었다. 토지가 없는 사람들은 토지를 소유한 사람의 밑으로 들어가 일한다. 왕, 노예 등의 계급이 만들어졌다. <strong>중세</strong> 시대. 왕, 성직자, 영주, 기사, 농노, 노예 등 계급은 더욱 세분된다. 생산수단을 왕뿐만 아니라 영주도 소유한다.</p>
<p> <strong>근대</strong>사회는 자본주의사회다. 생산수단이 공장과 자본으로 바뀐다. 생산수단의 소유주는 왕이 아닌 부르주아다. 계급은 크게 부르주아와 프롤레타리아(생산수단을 소유하지 않은 자들)로 나뉜다.</p>
<p> &lt;자본주의 : 공급과잉의 사회&gt;
 산업혁명에 의해 자본주의 시대가 도래한다. 자본주의의 특징은 공급이 수요보다 큰, 공급과잉의 사회다. 공급과잉을 해결하기 위한 방법은 첫째, 수요를 늘리는 것이다. 많아진 공산품들을 소비할 시장이 필요해진다. 식민지를 통해 시장을 개척해 나갔다. 이 과정에서 1차 세계대전이 일어났다.</p>
<p> 공급과잉을 해결하기 위한 두 번째 방법은 가격을 낮추는 것이다. 가격경쟁은 인건비를 줄이기 위한 구조조정으로 이어졌고, 대량실업이 발생했으며 이에 따라 소비심리가 위축되었다. 경제 대공황이 찾아왔다. 대공황을 해결하기 위해 미국은 뉴딜정책을 러시아는 공산주의, 독일의 군국화 등 각국은 다양한 정책을 펼쳤다. 독일의 군국화는 2차 세계대전을 일으켰다.</p>
<p> <strong>현대</strong> 시대는 세계대전이 끝난 후 승전국인 미국과 소련 중심으로 냉전 시대가 도래한다. 자본주의와 공산주의가 대립했다. 냉전 이후, 자본주의가 독주하는 시대가 되어 역사는 오늘날에 이르렀다.  </p>
<blockquote>
</blockquote>
<h3 id="나의-주저리--생산수단의-힘">나의 주저리 : 생산수단의 힘</h3>
<p>(제 생각과 느낀점입니다)
생산수단이 중요하다는 것을 알고 있었지만 책을 읽으면서 내가 체감하고 있는 것 이상으로 너무나도 중요하다고 느꼈다. 역사는 주요 생산수단이 &#39;무엇&#39; 이고 &#39;누가&#39; 소유하냐에 따라 흘러왔다. 시대에 따라 토지, 공장, 자본과 같은 생산수단이 생겼고 왕, 영주, 부르주아가 생산수단을 소유했다. 생산수단의 변화로 (특히 공장) 세계는 전쟁이 발발하기도 하고, 경제 대공황을 맞이하기도 하며 현재에 이르렀다.</p>
<p>이렇게나 중요한 생산수단! 현재는 어떤 생산수단이 있고 과거와 무엇이 다르며, 누가 소유하고 있을까?</p>
<p>1) 과거의 생산수단은 현대에서도 여전히 중요할까?
중요하다. 그러나 각 생산수단의 가치는 동일하지 않다. 즉, &#39;어떤 부가가치를 창출할 수 있는 생산수단인지?&#39;도 중요하다. 땅으로 예를 들자면, 팔릴만한 가치가 있는 땅인가? 건물을 지을 수 있는 곳인가? 아무것도 개발 못 하는 땅인가? 에 따라 땅의 가치가 다르다.</p>
<p>2) 현대에 새로 생겨난 생산수단이 있을까? 과거와 다른 점은?
&#39;플랫폼&#39;이다. 예를 들면, 유튜브. 유튜브는 사람들이 자기 창작물(동영상)을 올리는 공간이다. 유튜브는 사람들에게 동영상을 노출할 수 있는 공간을 제공한다. 사람들은 자기 노동력의 결과인 동영상을 올린다. 즉, 생산수단은 유튜브가 생산물은 사람들이 창작하는 것이다.</p>
<p>과거와 다른 점은, 생산수단이 &#39;무형&#39;이라는 점이다. 토지, 공장과 같은 생산수단은 유형의 것이었고 때문에 한정적이었다. 서로 한정된 자원을 가지고 차지하기 위해 싸우기도 했다. 그러나 유튜브는 무형이다. 한계가 없다. 그렇기 때문에 전 세계로 생산수단의 영향력을 뻗칠 수가 있다.</p>
<p>3) 현대는 누가 생산수단의 소유자인가? 생산수단을 소유한 자들이 너무 많다. 특정하기가 어렵다. 눈에 보이기로는 재벌. CEO. 회장님 등등이 아닐까?</p>
<p>4) &#39;나&#39;는 소유자인가? 아니. 나는 아직 소유하지 못한 자이다.
그럼 나는 좌절해야 하는가? 나는 &#39;아직&#39; 소유하지 못했다는 말에 주목하자. 현대 사회의 생산 수단은 무형의 수단이 많아진 만큼, 예전보다는 생산 수단을 소유할 가능성은 커졌다. 그리고 새로운 생산수단을 만들어 낼 가능성도 커졌다.
자기 브랜딩의 시대. 라고 하지 않나? 자기 자신이 생산수단이자 생산물이 될 수도 있다. 아직은 어떤 생산수단을 만들어야 할지, 내가 할 수 있는지 고민이지만 어찌 되었든 &#39;계속 노동해야 하는 노동자&#39;로서 만의 삶은 벗어나야 한다는 것은 알겠다. </p>
<p>넓고 다양한 지식을 얻기 위해 책을 읽었는데, 미래의 먹거리를 향한 고민이 되어버렸다ㅎㅎ 생산수단의 힘을 계속 생각하면서 나는 어떤 생산수단을 소유할 것인지! 나는 어떤 것을 할 수 있는지! 계속 고민해가야겠다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[연관관계 매핑]]></title>
            <link>https://velog.io/@ahreum-kim/%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91</link>
            <guid>https://velog.io/@ahreum-kim/%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91</guid>
            <pubDate>Sat, 18 Jun 2022 14:50:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런 (자바 ORM 표준 JPA 프로그래밍 - 기본편, 김영한) 강의를 듣고 정리한 내용입니다</p>
</blockquote>
<h2 id="연관관계-매핑">연관관계 매핑</h2>
<h3 id="1-단방향과-양방향--매핑의-방향">1. 단방향과 양방향 : 매핑의 방향</h3>
<h4 id="1-단방향--member-와-order-order-에서만-member-를-조회하고-member에서는-order-조회-x">1) 단방향 : Member 와 Order. Order 에서만 Member 를 조회하고 Member에서는 Order 조회 X.</h4>
<p>Member : id, name ...
Order : id, <strong>member_id(FK)</strong>, ...</p>
<pre><code class="language-java">@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;
    ...}

@Entity
@Table(name = &quot;ORDERS&quot;)
public class Order {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = &quot;memberId&quot;, insertable = false, updatable = false)
    private Member member; 
    ...}</code></pre>
<h4 id="2-양방향--member와-order-서로-조회함">2) 양방향 : Member와 Order 서로 조회함.</h4>
<pre><code class="language-java">@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;

    // 연관관계 추가
    @OneToMany(mappedBy = &quot;member&quot;)
    private List&lt;Order&gt; Orders = new ArrayList&lt;Member&gt;();

    ...}

@Entity
@Table(name = &quot;ORDERS&quot;)
public class Order {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = &quot;memberId&quot;, insertable = false, updatable = false)
    private Member member; 
    ...}</code></pre>
<ul>
<li>연관관계의 주인이 외래키(FK) 등록/수정 관리. 주인이 아니면 조회만 가능</li>
<li>FK가 있는 쪽이 주인(Order)이 되고, 주인이 아닌쪽(Member)는 mapped by 를 통해 어디로 매핑되어 있는지 정의해야 함</li>
</ul>
<p>*주의 1 : 순수 객체 상태를 고려해서 항상 양쪽에서 값을 설정하도록 해야 함</p>
<pre><code class="language-java">@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = &quot;member&quot;)
    private List&lt;Order&gt; Orders = new ArrayList&lt;Member&gt;();

    public void setOrder(Order order){
        order.setMember(this); //연관관계 주인에게 값 설정
        this.orders.add(order); //주인이 아닌 객체도 값 설정
    }
    ...
}
</code></pre>
<p>*주의 2 : 양방향 매핑시에 무한 루프를 조심 (toString(), lombok 등)
Member 의 toString() -&gt; Order 의 toString() -&gt; Member 의 toString() ... 무한루프 발생</p>
<pre><code class="language-java">@Override
public String toString(){
    return &quot;Member [ id= &quot; +id+&quot; , orders= &quot;+orders ...; 
}

@Override
public String toString(){
    return &quot;Order [ id= &quot; +id+&quot; , members= &quot;+members ...; 
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[객체지향의 사실과 오해(1, 2장)]]></title>
            <link>https://velog.io/@ahreum-kim/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-%EC%82%AC%EC%8B%A4%EA%B3%BC-%EC%98%A4%ED%95%B41-2%EC%9E%A5</link>
            <guid>https://velog.io/@ahreum-kim/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-%EC%82%AC%EC%8B%A4%EA%B3%BC-%EC%98%A4%ED%95%B41-2%EC%9E%A5</guid>
            <pubDate>Sat, 11 Jun 2022 13:21:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>객체지향의 사실과 오해를 읽고 정리한 내용입니다. 제가 느낀대로 정리한 것이기에 책의 내용, 구성과 다소 다를 수 있습니다. </p>
</blockquote>
<h2 id="1장-협력하는-객체-들의-공동체">1장. 협력하는 객체 들의 공동체</h2>
<h4 id="1-객체의-자율성">1) 객체의 자율성</h4>
<p>현실 세계를 모방하는 것이 아닌, 새로운 세계를 창조하는 것. 객체가 스스로 상태를 관리하는 점(자율성)이 현실세계와 다름 (요청에 의해 스스로 자신의 상태를 바꿈)</p>
<p>ex) 
(현실) 사람이 컵에 물을 따름 -&gt; 컵의 물 높이가 변화됨 ( 0 -&gt; 30cm, 수동적)
(코드) 사람 객체가 물을 따랐다는 요청을 컵 객체에게 보냄 -&gt; 컵 객체 스스로 물 높이를 변화시킴 ( 0 -&gt; 30cm, 능동적, 자율성)</p>
<h4 id="2-역할-책임--협력">2) 역할, 책임 , 협력</h4>
<p>기능을 만들어가는 과정은 역할, 책임, 협력을 통해 이뤄짐</p>
<p>협력을 하는 방법 : 객체사이의 요청과 응답</p>
<p>역할과 책임 : 협력하는 사람들이 그 안에서 차지하는 책임, 임무 (ex, 손님의 역할은 주문)
여러 객체가 동일한 역할 수행 가능함. 역할은 대체 가능하며, 각 객체는 책임을 수행하는 방법은 자율적으로 선택할 수 있고, 하나의 객체가 동시에 여러 역할을 수행할 수 있음</p>
<h2 id="2장-이상한-나라의-객체">2장. 이상한 나라의 객체</h2>
<h4 id="1-상태---객체는-상태를-가지며-상태는-변경가능">1) 상태  : 객체는 상태를 가지며 상태는 변경가능</h4>
<p>프로퍼티 : 객체의 상태를 구성하는 모든 특징. 변경되지 않음. 정적. 속성(단순한 값) + 링크(다른 객체 가리킴)
프로퍼티 값 : 시간이 흐름에 따라 변경됨. 동적
링크 : 객체와 객체 사이의 의미 있는 연결</p>
<h4 id="2-행동--상태를-변화시키는-것은-객체의-행동">2) 행동 : 상태를 변화시키는 것은 객체의 행동</h4>
<p>행동이란 외부의 요청에 응답하기 위해 동작하고 반응하는 활동
행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있음
행동은 외부에 가시적이어야 함</p>
<ul>
<li>캡슐화 : 객체는 상태를 감추구 외부에 행동만 노출함. 외부에서 객체에 접근할 유일한 방법은 행동일뿐임. 
상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만듦</li>
</ul>
<h4 id="3-식별자--객체는-유일하게-식별-가능-어떤-객체를-다른-객체와-구분하는-데-사용하는-객체의-프로퍼티">3) 식별자 : 객체는 유일하게 식별 가능. 어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티</h4>
<p>값 : 식별자 없음. 값의 상태는 변하지 않음. 불변 상태. 숫자, 날짜, 시간, 금액 등. 상태가 같으면 두 인스턴스 같은 것으로 판단함(동등성)
객체 : 시간에 따라 변경되는 상태. 행동을 통해 상태 변경함. 가변 상태. 식별자를 기반으로 객체가 같은지 판단(동일성) </p>
<h2 id="나의-생각-정리">나의 생각 정리</h2>
<h3 id="객체지향이란">객체지향이란?</h3>
<p>각 객체 들에게 역할, 책임을 부여하고 객체 간의 협력을 통해 필요한 기능을 구현해 가는 것
궁극적인 목표를 달성하기 위해, 목표를 작은 책임들로 세분화하고, 각각의 책임을 수행할 수 있는 역할을 가진 객체가 다른 객체간의 요청&amp;응답 으로 소통하는 것</p>
<h3 id="객체에-집중한다는-것-≠-클래스에-집중한다는-것">객체에 집중한다는 것 ≠ 클래스에 집중한다는 것</h3>
<p>책에서는 객체지향 설계와 클래스 지향 설계는 다르다고 말함.
클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중해야 함. 
클래스는 단지 구현 메커니즘일뿐 코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환해야 함
--&gt; 클래스는 객체를 만들어내는 틀이고 객체는 인스턴스. 객체의 역할은 각각 로직에 따라 다를 수 있다고 이해했음. 하지만 현실적으로 객체와 클래스를 분리해서 설계하고 개발한다는 것이 와닿지는 않았음</p>
<h3 id="그-외">그 외...</h3>
<p>그 외에도 알겠지만 모르겠고 모르겠지만 알겠고 하는 부분들이 있었는데 나중에 예시를 보면 더 잘 이해가 될 것 같다. 객체지향을 좀 더 명확히 정의내릴 수 있게 하고 생각해보게 한다는 점에서 좋았다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[엔티티 매핑]]></title>
            <link>https://velog.io/@ahreum-kim/%EC%97%94%ED%8B%B0%ED%8B%B0-%EB%A7%A4%ED%95%91</link>
            <guid>https://velog.io/@ahreum-kim/%EC%97%94%ED%8B%B0%ED%8B%B0-%EB%A7%A4%ED%95%91</guid>
            <pubDate>Wed, 25 May 2022 12:40:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런 (자바 ORM 표준 JPA 프로그래밍 - 기본편, 김영한) 강의를 듣고 정리한 내용입니다</p>
</blockquote>
<h2 id="객체와-테이블-매핑--entity">객체와 테이블 매핑 : @Entity</h2>
<ul>
<li>JPA 를 사용해 테이블과 매핑할 클래스에 사용</li>
<li>@NoArgsConstructor 등 기본 생성자를 필수로 만들어야 함<pre><code class="language-java">@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity(name = &quot;user&quot;)
public class Member {
}
// user 테이블과 Member 클래스 매핑</code></pre>
</li>
</ul>
<h2 id="필드와-컬럼-매핑--column-enumerated-lob-transient-등">필드와 컬럼 매핑 : @Column, @Enumerated, @Lob, @Transient 등</h2>
<pre><code class="language-java">@Entity(name = &quot;user&quot;)
public class Member {
 @Id
 private Long id;

 @Column(name = &quot;name&quot;)  //컬럼 매핑 name(DB 칼럼이름), insertable/updateable (등록, 변경 가능여부)
 private String username;

 @Enumerated(EnumType.STRING) // enum 타입 매핑. EnumType.STRING 으로 사용
 private Type userType;

 @Lob    //BLOB(byte[], java.sql. BLOB), CLOB(String, char[], java.sql.CLOB) 매핑. 속성 없음
 private String description;

 @Transient  //매핑 무시. DB와 관련 없음. 메모리상에서만 값을 갖고 싶을떄 사용함
 private String tempName;

}</code></pre>
<h2 id="기본키-매핑--id-generatedvalue">기본키 매핑 : @Id, @GeneratedValue</h2>
<h4 id="id--직접-할당시-사용">@Id : 직접 할당시 사용</h4>
<pre><code class="language-java"> @Id
 private Long id;</code></pre>
<pre><code class="language-java">member.setId(4L);</code></pre>
<h4 id="generatedvalue--자동생성">@GeneratedValue : 자동생성</h4>
<ul>
<li><p>1) IDENTITY 
PK생성 데이터베이스에 위임 
MySQL, PostgreSQL, SQL Server, DB2 등에서 사용
em.persist() 시점에 즉시 insert 쿼리 실행(보통 jpa는 커밋 시점에 insert 쿼리 실행하지만 이 경우는 예외)</p>
<pre><code class="language-java">@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;</code></pre>
</li>
<li><p>2) SEQUENCE
데이터베이스 시퀀스 오브젝트 사용
오라클, PostgreSQL, DB2, H2 데이터베이스 등에서 사용
@SequenceGenerator 필요</p>
<pre><code class="language-java">@Entity
@SequenceGenerator(
  name = &quot;MEMBER_SEQ_GENERATOR&quot;,
  sequenceName = &quot;MEMBER_SEQ&quot;, //매핑할 데이터베이스 시퀀스 이름
  initialValue = 1, allocationSize = 1)
public class Member {
  @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &quot;MEMBER_SEQ_GENERATOR&quot;)
  private Long id;
}

//위와 동일
@Entity
public class Member {
  @Id
  @SequenceGenerator(name = &quot;SEQ&quot;, sequenceName = &quot;MEMBER_SEQ&quot;, initialValue = 1, allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &quot;SEQ&quot;)
  private Long id;
}
</code></pre>
</li>
</ul>
<p>//allocationSize 시퀀스 한 번 호출에 증가하는 수</p>
<pre><code>
- 3) TABLE: 키 생성용 테이블을 따로 만들어 관리
모든 DB에서 사용 가능하나 성능 이슈 있음. 잘 사용 안하므로 패스
@TableGenerator 필요

- 4) AUTO: DB에 따라 1) 2) 3) 의 전략 자동 지정</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[JPA 구동 방식과 영속성 컨텍스트]]></title>
            <link>https://velog.io/@ahreum-kim/JPA-%EA%B5%AC%EB%8F%99-%EB%B0%A9%EC%8B%9D%EA%B3%BC-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@ahreum-kim/JPA-%EA%B5%AC%EB%8F%99-%EB%B0%A9%EC%8B%9D%EA%B3%BC-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Wed, 18 May 2022 15:28:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런 (자바 ORM 표준 JPA 프로그래밍 - 기본편, 김영한) 강의를 듣고 정리한 내용입니다</p>
</blockquote>
<h2 id="1-jpa-구동방식">1. JPA 구동방식</h2>
<h4 id="1-persistence----설정정보-조회-meta-infpersistencexml">1) Persistence --&gt; 설정정보 조회 (META-INF/persistence.xml)</h4>
<pre><code class="language-java">&lt;persistence-unit name=&quot;hello&quot;&gt; //EntityManagerFactory 인자값이 됨
        &lt;properties&gt;
            &lt;!-- 필수 속성 --&gt;
            &lt;property name=&quot;javax.persistence.jdbc.driver&quot; value=&quot;org.h2.Driver&quot;/&gt;
            &lt;property name=&quot;javax.persistence.jdbc.user&quot; value=&quot;유저&quot;/&gt;
            &lt;property name=&quot;javax.persistence.jdbc.password&quot; value=&quot;비밀번호&quot;/&gt;
            &lt;property name=&quot;javax.persistence.jdbc.url&quot; value=&quot;url정보&quot;/&gt;
            &lt;property name=&quot;hibernate.dialect&quot; value=&quot;org.hibernate.dialect.H2Dialect&quot;/&gt;
            &lt;!-- 옵션 --&gt;
            &lt;property name=&quot;hibernate.show_sql&quot; value=&quot;true&quot;/&gt;
            &lt;property name=&quot;hibernate.format_sql&quot; value=&quot;true&quot;/&gt;
            &lt;property name=&quot;hibernate.use_sql_comments&quot; value=&quot;true&quot;/&gt;
            &lt;!--&lt;property name=&quot;hibernate.hbm2ddl.auto&quot; value=&quot;create&quot; /&gt;--&gt;
        &lt;/properties&gt;
&lt;/persistence-unit&gt;</code></pre>
<h4 id="2-persistence----entitymanagerfactory-생성1개만">2) Persistence --&gt; EntityManagerFactory 생성(1개만)</h4>
<pre><code class="language-java">//웹서버 올라오는 시점에 1개만 생성됨
EntityManagerFactory emf = Persistence.createEntityManagerFactory(&quot;hello&quot;);

emf.close();</code></pre>
<h4 id="3-entitymanagerfactory----entitymanager-여러개-생성">3) EntityManagerFactory --&gt; EntityManager 여러개 생성</h4>
<pre><code class="language-java">EntityManagerFactory emf = Persistence.createEntityManagerFactory(&quot;hello&quot;);

//고객의 요청마다, 트랜잭션 단위마다 생성됨. 모든 데이터 변경은 트랜잭션 안에서 실행함
EntityManager em = emf.createEntityManager();
//code 들이 들어감
em.close();

emf.close();</code></pre>
<h2 id="2-영속성-컨텍스트">2. 영속성 컨텍스트</h2>
<h4 id="1-엔티티의-생명주기">1) 엔티티의 생명주기</h4>
<ul>
<li><p>비영속 (new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태</p>
<pre><code class="language-java">//Member 객체만 만들었음
Member member = new Member();
member.setId(1L);
member.setName(&quot;helloA&quot;);</code></pre>
</li>
<li><p>영속 (managed) : 영속성 컨텍스트에 관리되는 상태</p>
<pre><code class="language-java">//Member 객체를 영속성 컨텍스트에 넣음
em.persist(member);</code></pre>
</li>
<li><p>준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태</p>
<pre><code class="language-java">//영속성 분리함
em.detach(member);
//영속성 컨텍스트 완전히 초기화
em.clear();
//영속성 컨텍스트 종료
em.close()</code></pre>
</li>
<li><p>삭제 (removed) : 삭제된 상태</p>
<pre><code class="language-java">//찾아서 
Member findMember = em.find(Member.class, 1L);
//삭제함
em.remove(findMember);</code></pre>
</li>
</ul>
<h4 id="2-플러시flush--쿼리-바로-날려주는-기능">2) 플러시(Flush) : 쿼리 바로 날려주는 기능</h4>
<p>-&gt; 영속성 컨텍스트에 넣었다고 해서 바로 쿼리가 실행되지 않고 커밋 직전에 실행됨</p>
<pre><code class="language-java">Member member = new Member();
member.setId(2L);
member.setName(&quot;hello2&quot;);

System.out.println(&quot;=========== BEFORE =========&quot;);
em.persist(member);
System.out.println(&quot;=========== AFTER =========&quot;);</code></pre>
<pre><code class="language-java">=========== BEFORE =========
=========== AFTER =========
Hibernate: 
    /* insert helloJpa.Member
        */ insert 
        into
            Member
            (name, id) 
        values
            (?, ?)</code></pre>
<p>-&gt; flush를 사용하면 영속성 컨텍스트의 변경내용을 바로 DB에 반영함</p>
<pre><code class="language-java">System.out.println(&quot;=========== BEFORE =========&quot;);
em.persist(member);
em.flush();
System.out.println(&quot;=========== AFTER =========&quot;)</code></pre>
<pre><code class="language-java">=========== BEFORE =========
Hibernate: 
    /* insert helloJpa.Member
        */ insert 
        into
            Member
            (name, id) 
        values
            (?, ?)
=========== AFTER =========</code></pre>
<ul>
<li>flush() 말고도 커밋시, JPQL 쿼리 실행시 플러시가 자동 호출됨</li>
</ul>
<h4 id="3-영속성-컨텍스트의-이점">3) 영속성 컨텍스트의 이점</h4>
<ul>
<li>1차 캐시 : 영속성 컨텍스트에 있는 값은 DB를 조회하지 않고 바로 가져옴<pre><code class="language-java">System.out.println(&quot;=========== BEFORE =========&quot;);
em.persist(member); //영속화
Member findMember = em.find(Member.class, 3L); //영속성 컨텍스트에서 가져옴
System.out.println(&quot;이름 : &quot;+findMember.getName());
System.out.println(&quot;=========== AFTER =========&quot;);</code></pre>
<pre><code class="language-java">=========== BEFORE =========
이름 : hello3
=========== AFTER =========
Hibernate: 
  /* insert helloJpa.Member
      */ insert 
      into
          Member
          (name, id) 
      values
          (?, ?)
</code></pre>
</li>
</ul>
<pre><code>- 동일성 보장
```java
Member findMember1 = em.find(Member.class, 4L);
Member findMember2 = em.find(Member.class, 4L);
System.out.println(findMember1 == findMember2); //true</code></pre><ul>
<li>트랜잭션 지원하는 쓰기 지연(flush, 커밋, JPQL쿼리 실행전까지 모은 영속성 컨텍스트의 SQL 실행)</li>
<li>변경 감지 -&gt; 엔티티와 스냅샷을 비교해서 변경이 되면 update 쿼리 생성<pre><code class="language-java">Member findMember1 = em.find(Member.class, 4L);
findMember1.setName(&quot;hello~~!!!!&quot;);</code></pre>
<pre><code class="language-java">      update
          Member 
      set
          name=? 
      where
          id=?</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[클래스 다이어그램]]></title>
            <link>https://velog.io/@ahreum-kim/%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8</link>
            <guid>https://velog.io/@ahreum-kim/%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8</guid>
            <pubDate>Tue, 10 May 2022 13:14:51 GMT</pubDate>
            <description><![CDATA[<h2 id="클래스-다이어그램">클래스 다이어그램</h2>
<p>클래스의 구성요소 및 클래스간의 관계를 표한하는 대표적인 UML</p>
<h4 id="uml-unified-modeling-language">UML (Unified Modeling Language)</h4>
<p>도메인을 모델로 표현해주는 대표적인 모델링 언어
의사소통, 설계, 전체 시스템의 구조 및 클래스의 의존성 파악 등을 위해 사용됨</p>
<h2 id="클래스-다이어그램의-클래스-표현하는-기본요소">클래스 다이어그램의 클래스 표현하는 기본요소</h2>
<h3 id="1-클래스">1. 클래스</h3>
<h4 id="1-접근제어자">1) 접근제어자</h4>
<pre><code>+ : public
- : private
# : protected</code></pre><h4 id="2-속성">2) 속성</h4>
<pre><code>접근제어자 이름:타입 = 기본값

ex) private String name = &quot;&quot;;
--&gt; - name : String = &quot;&quot;</code></pre><h4 id="3-메소드">3) 메소드</h4>
<pre><code>접근제어자 이름(파라미터 속성): 리턴값 {abstract : 추상메소드일 경우만}

ex) public String getName(String name) 
-&gt; + getName(String) : String 

ex) public abstract String getName(String name) 
-&gt; + getName(String) : String {abstract}
</code></pre><h3 id="2-스테레오-타입">2. 스테레오 타입</h3>
<p>UML에서 제공하는 기본요소 외의 추가적인 확장요소 </p>
<pre><code>&lt;&lt; interface &gt;&gt; 
&lt;&lt; abstract &gt;&gt;
&lt;&lt; component &gt;&gt;</code></pre><h3 id="3-클래스-간의-관계">3. 클래스 간의 관계</h3>
<p><img src="https://velog.velcdn.com/images/ahreum-kim/post/a773ff69-dcf4-4789-a286-9a3e0aff8876/image.png" alt="클래스 관계 종류">
(출처 : <a href="https://www.nextree.co.kr/p6753/">https://www.nextree.co.kr/p6753/</a>)</p>
<h4 id="1-generalization--일반화---상속-실선-비어있는-화살표">1) Generalization ( 일반화 ) : 상속 (실선, 비어있는 화살표)</h4>
<p><img src="https://velog.velcdn.com/images/ahreum-kim/post/be250575-9c51-4e6e-9faf-2d032902a400/image.png" alt=""></p>
<pre><code class="language-java">public class Subject {
    private String code;
    private String name;

    public void study() {
        System.out.println(&quot;공부&quot;);
    }
}

public class English extends Subject {
    @Override
    public void study() {
        System.out.println(&quot;영어공부&quot;);
    }
}</code></pre>
<h4 id="2-realization--실체화---interface-실제로-구현-점선-비어있는-화살표">2) Realization ( 실체화 ) : interface 실제로 구현 (점선, 비어있는 화살표)</h4>
<p><img src="https://velog.velcdn.com/images/ahreum-kim/post/9883a167-a35c-4ea7-b7c9-8be785615040/image.png" alt=""></p>
<pre><code class="language-java">public interface Subject {
    public void study();
}

public class English implements Subject {
    @Override
    public void study() {
        System.out.println(&quot;영어공부&quot;);
    }
}</code></pre>
<h4 id="3-dependency--의존---어떤-클래스가-다른-클래스-참조-메서드-내에서-다른-클래스의-객체를-생성하거나-사용-리턴받아-사용하는-것-점선-화살표">3) Dependency ( 의존 ) : 어떤 클래스가 다른 클래스 참조. 메서드 내에서 다른 클래스의 객체를 생성하거나 사용, 리턴받아 사용하는 것 (점선, 화살표)</h4>
<p><img src="https://velog.velcdn.com/images/ahreum-kim/post/536e2526-e0ca-488f-9a1b-78415eb3d87e/image.png" alt=""></p>
<pre><code class="language-java">public class English {
    public Schedule createSchedule() {
        return new Schedule(); //create &lt;&lt; create &gt;&gt; 으로 표현
    }
  // 그외에도 &lt;&lt;local&gt;&gt;, &lt;&lt;parameter&gt;&gt; 로도 사용 가능함
}</code></pre>
<h4 id="4-association--연관---다른-객체의-참조-양방향일-경우-실선만-방향성이-있으면-화살표">4) Association ( 연관 ) : 다른 객체의 참조 (양방향일 경우 실선만, 방향성이 있으면 화살표)</h4>
<p>Aggregation ( 집합 ) :  연관의 집합관계를 나타내는 것. Collection이나 Array를 이용하는 관계. 코드상으로 분리하기 애매하므로 생략함 (실선, 빈다이아몬드)
<img src="https://velog.velcdn.com/images/ahreum-kim/post/811a617e-51ce-484c-9037-c02127d7f7ff/image.png" alt=""></p>
<pre><code class="language-java">1 : 1개의 표현
* : 0 ~ n 개의 표현
n...m : n 부터 m까지 연관관계를 맺음

public class English {
    public List&lt;Schedule&gt; scheduleList;
}</code></pre>
<h4 id="5-composition--합성---강한-결합의-관계-참조하는-클래스의-라이프-사이클이-종속적-실선-채워진-다이아몬드">5) Composition ( 합성 ) : 강한 결합의 관계. 참조하는 클래스의 라이프 사이클이 종속적 (실선, 채워진 다이아몬드)</h4>
<p><img src="https://velog.velcdn.com/images/ahreum-kim/post/47f7c6ff-0ee5-4bc6-975f-0ae9e4368b3e/image.png" alt=""></p>
<p> English 클래스가 사용하지 않는 경우가 발생했을때 Schedule도 참조가 불가능한 상태가 됨</p>
<h4 id="참고-사이트">참고 사이트</h4>
<p><a href="https://sabarada.tistory.com/72">https://sabarada.tistory.com/72</a>
<a href="https://www.nextree.co.kr/p6753/">https://www.nextree.co.kr/p6753/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mybatis 의 동작원리]]></title>
            <link>https://velog.io/@ahreum-kim/Mybatis-%EC%9D%98-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC</link>
            <guid>https://velog.io/@ahreum-kim/Mybatis-%EC%9D%98-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC</guid>
            <pubDate>Sun, 08 May 2022 06:15:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><a href="https://terasolunaorg.github.io/guideline/5.0.x/en/ArchitectureInDetail/DataAccessMyBatis3.html">Mybatis3</a> 를 참고하여 정리하였습니다. 더 자세한 내용은 해당 내용을 확인하세요.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ahreum-kim/post/6f9733c7-684c-4b13-aea7-0b66b9fb1bda/image.png" alt=""></p>
<h3 id="mybatis-구성-요소-및-관련-파일">Mybatis 구성 요소 및 관련 파일</h3>
<p>MyBatis configuration file 
데이터베이스의 연결 대상, 매핑 파일의 경로, 마이바티스의 동작 설정 등을 자세하게 설명하는 파일</p>
<p>org.apache.ibatis.session. SqlSessionFactoryBuilder
마이바티스환경 설정 파일 읽고 SqlSessionFactory 생성</p>
<p>org.apache.ibatis.session. SqlSessionFactory
SqlSession 생성하기 위한 요소</p>
<p>org.apache.ibatis.session. SqlSession
SQL 실행 및 트랜잭션 제어를 위한 API를 제공하는 컴포넌트</p>
<p>Mapper interface
매핑 파일에 정의된 SQL 함수를 호출하는 인터페이스</p>
<p>Mapping file
실행할 SQL 문이 있는 파일</p>
<h3 id="애플리케이션-시작시">애플리케이션 시작시</h3>
<p>(1) SqlSessionFactoryBuilder에 SqlSessionFactory 빌드하도록 요청</p>
<p>(2) SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 MyBatis 구성 파일을 읽음</p>
<p>(3) SqlSessionFactoryBuilder는 MyBatis 구성 파일의 정의를 기반으로 SqlSessionFactory를 생성</p>
<h3 id="클라이언트-요청에-의해-수행">클라이언트 요청에 의해 수행</h3>
<p>(4) 클라이언트가 애플리케이션에 대한 프로세스 요청</p>
<p>(5) 애플리케이션은 (SqlSessionFactoryBuilder를 사용하여 빌드된) SqlSessionFactory에서 SqlSession을 가져옴</p>
<p>(6) SqlSessionFactory는 SqlSession을 생성하고 이를 애플리케이션에 반환</p>
<p>(7) 애플리케이션은 SqlSession 에서 Mapper 인터페이스의 구현 개체를 가져옴</p>
<p>(8) 애플리케이션은 Mapper 인터페이스 메서드를 호출 (“Mapper interface mechanism” → Mapper interface 메커니즘에 대해 자세히 알고싶다면 여기로...)</p>
<p>(9) Mapper 인터페이스의 구현 객체는 SqlSession 메서드를 호출하고 SQL 실행을 요청</p>
<p>(10) SqlSession은 매핑 파일에서 실행할 SQL 가져와 실행</p>
<h3 id="mybatis-sql-실행-예제">Mybatis SQL 실행 예제</h3>
<pre><code class="language-java">@Mapper
public interface TestMapper {
    List&lt;String&gt; findNameById(String id);
}</code></pre>
<pre><code class="language-xml">&lt;mapper namespace=&quot;~~(생략).TestMapper&quot;&gt;
    &lt;select id=&quot;findNameById&quot;
            parameterType=&quot;String&quot;
            resultType=&quot;String&quot;&gt;
        select name from test where id = #{id}
    &lt;/select&gt;
&lt;/mapper&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Guava Table]]></title>
            <link>https://velog.io/@ahreum-kim/Guava-Table</link>
            <guid>https://velog.io/@ahreum-kim/Guava-Table</guid>
            <pubDate>Wed, 23 Feb 2022 14:47:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><a href="https://www.baeldung.com/guava-table">Guide to Guava Table</a> 을 보며 정리한 내용입니다. 예제는 그대로 사용했으며, 자세한 내용은 링크를 확인하세요:)</p>
</blockquote>
<h2 id="guava-table">Guava Table</h2>
<ul>
<li>행. 열, 셀값을 포함하는 테이블 구조의 컬렉션</li>
<li>행과 열은 순서가 지정된 키 쌍으로 작동 </li>
<li>DB의 테이블 형식으로 사용 가능함</li>
</ul>
<h4 id="1-creating-4-가지-방법">1. Creating (4 가지 방법)</h4>
<p>1) HashBasedTable</p>
<pre><code class="language-java">Table&lt;String, String, Integer&gt; universityCourseSeatTable = HashBasedTable.create();</code></pre>
<p>2) TreeBasedTable : 정렬 사용시</p>
<pre><code class="language-java">Table&lt;String, String, Integer&gt; universityCourseSeatTable = TreeBasedTable.create();</code></pre>
<p>3) ArrayTable : 행, 열 및 테이블 크기 고정시</p>
<pre><code class="language-java">List&lt;String&gt; universityRowTable = Lists.newArrayList(&quot;Mumbai&quot;, &quot;Harvard&quot;);
List&lt;String&gt; courseColumnTables = Lists.newArrayList(&quot;Chemical&quot;, &quot;IT&quot;, &quot;Electrical&quot;);

Table&lt;String, String, Integer&gt; universityCourseSeatTable = ArrayTable.create(universityRowTable, courseColumnTables);</code></pre>
<p>4) ImmutableTable : 불변의 Table 인스턴스</p>
<pre><code class="language-java">Table&lt;String, String, Integer&gt; universityCourseSeatTable 
= ImmutableTable.&lt;String, String, Integer&gt; builder().put(&quot;Mumbai&quot;, &quot;Chemical&quot;, 120).build();</code></pre>
<h4 id="2-사용방법">2. 사용방법</h4>
<p>1) 검색</p>
<pre><code class="language-java"> universityCourseSeatTable.put(&quot;Mumbai&quot;, &quot;Chemical&quot;, 120);

 int seatCount = universityCourseSeatTable.get(&quot;Mumbai&quot;, &quot;Chemical&quot;); //120</code></pre>
<p>2) 항목 있는지 확인</p>
<pre><code class="language-java">universityCourseSeatTable.put(&quot;Mumbai&quot;, &quot;Chemical&quot;, 120);

boolean entryIsPresent = universityCourseSeatTable.contains(&quot;Mumbai&quot;, &quot;Chemical&quot;); //true
boolean courseIsPresent = universityCourseSeatTable.containsColumn(&quot;IT&quot;); //false
boolean universityIsPresent = universityCourseSeatTable.containsRow(&quot;Mumbai&quot;); //true
boolean seatCountIsPresent = universityCourseSeatTable.containsValue(60); //false</code></pre>
<p>3) 제거</p>
<pre><code class="language-java">universityCourseSeatTable.put(&quot;Mumbai&quot;, &quot;Chemical&quot;, 120);

int seatCount = universityCourseSeatTable.remove(&quot;Mumbai&quot;, &quot;Chemical&quot;); //120</code></pre>
<p>4) 행 기준으로 셀값 맵</p>
<pre><code class="language-java">universityCourseSeatTable.put(&quot;Mumbai&quot;, &quot;IT&quot;, 60);
universityCourseSeatTable.put(&quot;Havard&quot;, &quot;IT&quot;, 120);
universityCourseSeatTable.put(&quot;Mumbai&quot;, &quot;Chemical&quot;, 120);

Map&lt;String, Integer&gt; universitySeatMap = universityCourseSeatTable.column(&quot;IT&quot;);
/*
IT 기준으로 맵으로 만들어짐
&quot;Mumbai&quot;, 60
&quot;Havard&quot;, 120
*/

Map&lt;String, Map&lt;String, Integer&gt;&gt; courseKeyUniversitySeatMap = universityCourseSeatTable.columnMap();
/* 행 기준으로 만들어짐
&quot;IT&quot;, &lt;&quot;Mumbai&quot;, 60&gt;
&quot;IT&quot;, &lt;&quot;Havard&quot;, 120&gt;
&quot;Chemical&quot;, &lt;&quot;Mumbai&quot;,120&gt;
*/</code></pre>
<p>5) 열 기준으로 셀값 맵</p>
<pre><code class="language-java">universityCourseSeatTable.put(&quot;Mumbai&quot;, &quot;IT&quot;, 60);
universityCourseSeatTable.put(&quot;Havard&quot;, &quot;IT&quot;, 120);
universityCourseSeatTable.put(&quot;Mumbai&quot;, &quot;Chemical&quot;, 120);

Map&lt;String, Integer&gt; courseSeatMap = universityCourseSeatTable.row(&quot;Mumbai&quot;);
/*
Mumbai 기준으로 만들어짐
&quot;IT&quot;, 60
&quot;Chemical&quot;, 120
*/</code></pre>
<p>6) 키 가져오기</p>
<pre><code class="language-java">universityCourseSeatTable.put(&quot;Mumbai&quot;, &quot;Chemical&quot;, 120);
universityCourseSeatTable.put(&quot;Mumbai&quot;, &quot;IT&quot;, 60);
universityCourseSeatTable.put(&quot;Harvard&quot;, &quot;Electrical&quot;, 60);
universityCourseSeatTable.put(&quot;Harvard&quot;, &quot;IT&quot;, 120);

//행 키 : Mumbai , Harvard
Set&lt;String&gt; universitySet = universityCourseSeatTable.rowKeySet();

//열 키 : Chemical, IT, Electrical
Set&lt;String&gt; courseSet = universityCourseSeatTable.columnKeySet();</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Redux Toolkit (리덕스 툴킷)과 createSlice()]]></title>
            <link>https://velog.io/@ahreum-kim/Redux-Toolkit-%EB%A6%AC%EB%8D%95%EC%8A%A4-%ED%88%B4%ED%82%B7%EA%B3%BC-createSlice</link>
            <guid>https://velog.io/@ahreum-kim/Redux-Toolkit-%EB%A6%AC%EB%8D%95%EC%8A%A4-%ED%88%B4%ED%82%B7%EA%B3%BC-createSlice</guid>
            <pubDate>Mon, 07 Feb 2022 14:28:41 GMT</pubDate>
            <description><![CDATA[<h2 id="redux-toolkit리덕스-툴킷이란">Redux Toolkit(리덕스 툴킷)이란?</h2>
<ul>
<li>Redux 를 더 쉽게 사용하기 위한 도구</li>
<li>기존 Redux의 여러 문제점을 보완해줌</li>
</ul>
<h4 id="redux-의-문제점">Redux 의 문제점</h4>
<ol>
<li><p>무수한 보일러플레이트 코드가 필요함. 
액션 타입, 액션 생성 함수, 액션별 리듀서를 각각 정의 하는 방식</p>
</li>
<li><p>리덕스 스토어 환경 설정 복잡함
상태관리를 위해 만들어야 하는 파일이 많고 복잡함</p>
</li>
<li><p>패키지를 많이 추가해야 함</p>
</li>
</ol>
<h4 id="---redux-toolkit은-보일러플레이트-코드를-최소화하고-하나의-파일-안에-정의할-수-있도록-하였음">--&gt; Redux Toolkit은 보일러플레이트 코드를 최소화하고 하나의 파일 안에 정의할 수 있도록 하였음</h4>
<h4 id="-기존-예시-">[ 기존 예시 ]</h4>
<ol>
<li>액션 타입<pre><code class="language-react">export type StudyState = {
startStudyTime: number|null,
studyTime: number|null,
}
export type StudyAction = ActionType&lt;typeof actions&gt;</code></pre>
</li>
<li>액션 생성 함수<pre><code class="language-react">export const
START_STUDY = &#39;study/START_STUDY&#39;,
END_STUDY = &#39;study/END_STUDY&#39;
</code></pre>
</li>
</ol>
<p>export const startStudy = createAction(START_STUDY, action =&gt; (startStudyTime: number) =&gt; action(startStudyTime))
export const endStudy = createAction(END_STUDY, action =&gt; (studyTime: number) =&gt; action(studyTime))</p>
<pre><code>3. 액션 리듀서
```react
//3-1. 초기화
const initialState: StudyState = {
  startStudyTime: null,
  studyTime: null,
}

export default createReducer&lt;StudyState, StudyAction&gt;(initialState, {
  [START_STUDY]: (state, action) =&gt; {
    const startStudyTime: number = action.payload

    return produce&lt;StudyState&gt;(state, draft =&gt; {
      draft.startStudyTime = startStudyTime
      draft.studyTime = null
    })
  },
  [END_STUDY]: (state) =&gt; {
  const studyTime: number = action.payload

    return produce&lt;StudyState&gt;(state, draft =&gt; {
      draft.studyTime = studyTime
      draft.startStudyTime = null
    })
  }
})</code></pre><ol start="4">
<li>스토어별 취합<pre><code class="language-react">export { default } from &#39;./reducer&#39;;
export * from &#39;./actions&#39;;
export * from &#39;./types&#39;;</code></pre>
</li>
</ol>
<h2 id="redux-toolkit의-createslice">Redux Toolkit의 createSlice()</h2>
<h4 id="액션-타입-액션-생성-함수-액션별-리듀서-취합-파일-등을-하나의-파일로-통합할-수-있게-함">액션 타입, 액션 생성 함수, 액션별 리듀서, 취합 파일 등을 하나의 파일로 통합할 수 있게 함</h4>
<ul>
<li>createSlice에 선언된 슬라이스 이름을 따라서 리듀서와 액션 생성자, 액션 타입 자동 생성</li>
<li>따로 createAction, createReducer를 작성할 필요 없음</li>
</ul>
<pre><code class="language-react">//1. 액션 타입
export type StudyState = {
  startStudyTime: number|null,
  studyTime: number|null,
}

//3-1. 초기화
const initialState: StudyState = {
  startStudyTime: null,
  studyTime: null,
}


const studySlice = createSlice({
    name: &#39;study&#39;, // 2. 액션 생성 함수의 앞에 부분. &#39;study/START_STUDY&#39; 의 study
    initialState,
    reducers: { //2+3. 액션 생성과 리듀서를 한번에 함수로 정의
        startStudy(state, action: PayloadAction&lt;number&gt;) {
            const startStudyTime: number = action.payload

            state.startStudyTime = startStudyTime
            state.studyTime = null
        },
        endStudy(state, action: PayloadAction&lt;number&gt;) {
            const studyTime: number = action.payload

            state.studyTime = studyTime
            state.startStudyTime = null
        }
    }
})

export default studySlice.reducer
export const { startStudy, endStudy } = studySlice.actions</code></pre>
<p>그 외의 더 많은 리덕스 툴킷의 유용한 API 를 보고 싶다면,  <a href="http://blog.hwahae.co.kr/all/tech/tech-tech/6946/">[Redux Toolkit (리덕스 툴킷)은 정말 천덕꾸러기일까?]</a> 를 참고하세요:)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ JPA 프로젝트 생성 - H2 Database 세팅(Feat.에러...)]]></title>
            <link>https://velog.io/@ahreum-kim/JPA-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1-H2-Database-%EC%84%B8%ED%8C%85Feat.%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@ahreum-kim/JPA-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1-H2-Database-%EC%84%B8%ED%8C%85Feat.%EC%97%90%EB%9F%AC</guid>
            <pubDate>Sat, 05 Feb 2022 13:25:49 GMT</pubDate>
            <description><![CDATA[<p>JPA 프로젝트를 생성하기 위해 우선 H2 Database 세팅을 해봅니다.</p>
<h2 id="1-h2-데이터베이스-설치">1. H2 데이터베이스 설치</h2>
<p><a href="https://www.h2database.com/html/main.html">https://www.h2database.com/html/main.html</a>
<img src="https://images.velog.io/images/ahreum-kim/post/34e188b3-16b9-4a71-8723-6adc5f0eefb7/image.png" alt=""></p>
<p>윈도우일 경우 Windows Installer , 맥일 경우 All Platforms 선택</p>
<h2 id="2-압축-해제후-해당-파일의-bin에서-터미널-열고-h2-실행">2. 압축 해제후, 해당 파일의 bin에서 터미널 열고 H2 실행</h2>
<pre><code>./h2.sh</code></pre><p>잠깐!!! Permission denied 가 뜬다면?!</p>
<pre><code>-bash: ./h2.sh: Permission denied

//아래순으로 입력해주세요
chmod 755 h2.sh
./h2.sh</code></pre><h2 id="3-h2-설정">3. H2 설정</h2>
<p>connect 누르기
<img src="https://images.velog.io/images/ahreum-kim/post/c7bbe9ea-2d29-4977-8b4f-6dbabfdef85b/image.png" alt=""></p>
<p>잠깐!!! 아래처럼 에러가 뜬다면?!
<img src="https://images.velog.io/images/ahreum-kim/post/fa54c79c-afd6-4eeb-bb2f-46685d023839/image.png" alt=""></p>
<p>--&gt; C:/Users/사용자명/test 파일이 없어서 생기는 문제!
사용자명 파일에 텍스트 파일을 만들고 이름을 test.mv.db 로 저장후 connect 누르기
<img src="https://images.velog.io/images/ahreum-kim/post/42f9150e-7f63-4a8c-b5ef-1e6c9fb72aef/image.png" alt=""></p>
<p>--&gt;그래도 안 됨... JDBC URL 을 바꿔보자. 밑에 나온 경로를 그대로 URL로 옮기기 
<img src="https://images.velog.io/images/ahreum-kim/post/3240c8b3-3055-47ed-bcc9-65632ed5177d/image.png" alt=""></p>
<p>==&gt; 성공! 
<img src="https://images.velog.io/images/ahreum-kim/post/a29e5cba-db66-4166-90b1-ed91641fba13/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리액트 18 새로운 기능]]></title>
            <link>https://velog.io/@ahreum-kim/%EB%A6%AC%EC%95%A1%ED%8A%B8-18-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5</link>
            <guid>https://velog.io/@ahreum-kim/%EB%A6%AC%EC%95%A1%ED%8A%B8-18-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5</guid>
            <pubDate>Sun, 23 Jan 2022 12:23:59 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>노마드 코더의 <a href="https://www.youtube.com/watch?v=7mkQi0TlJQo">완전 새로운 리액트가 온다? 핵심정리 10분컷</a> 을 보고 요약한 내용입니다. </p>
</blockquote>
<h2 id="1-react-suspense">1. React Suspense</h2>
<p>v16~17 | code splitting with React.lazy(Client)
v18    | Data fetching via compatible libraries, like Relay.(Client)
     Streaming server rendering(Server)</p>
<h4 id="suspense-없을때">Suspense 없을때</h4>
<p>로딩 체크하는 로직이 컴포넌트 내부에 있음</p>
<pre><code class="language-react">function Profile(){
    const {data: profile, isLoading } = useQuery(&quot;profile&quot;,fn);
    if(isLoading){ 
        return &lt;Loader /&gt;;
        }

    return &lt;dib&gt;Hello {profile.name}! Welcome!&lt;/div&gt;
}
</code></pre>
<h4 id="suspense-있을때">Suspense 있을때</h4>
<p>로딩 상태를 컴포넌트와 분리, Suspense 를 사용하면 로딩 state 잊어도 됨. 로딩 상태를 컴포넌트와 분리</p>
<pre><code class="language-react">function Profile(){
    const {data: profile} = useQuery(&quot;profile&quot;,fn);;
    return &lt;div&gt;Hello {profile.name}! Welcome!&lt;/div&gt;
}
</code></pre>
<p>Loading state가 컴포넌트 외부로 빠짐. 로딩 로직이 밖으로 빠짐으로써 컴포넌트 흐름 파악이 훨씬 간결해짐</p>
<pre><code class="language-react">&lt;Suspense fallback={&lt;Loader /}&gt;
    &lt;Profile /&gt;
&lt;/Suspense&gt;</code></pre>
<h2 id="2-server-side-rendering">2. Server Side Rendering</h2>
<h4 id="client-side-rendering--모든-것이-클라이언트쪽에서-일어남">Client side rendering : 모든 것이 클라이언트쪽에서 일어남</h4>
<ul>
<li>서버 : 브라우저가 다운받을 JS 파일을 제공 
브라우저 : 리액트 코드가 들어있는 JS 파일 실행함
리액트 :  유저가 볼 수 있는 모든 HTML 요소와 UI 렌더링</li>
<li>웹사이트에는 어떠한 콘텐츠나 UI가 없으며, JS가 브라우저에서 비활성화되거나 다운로드가 느려지면 유저는 빈 화면만 보게 됨</li>
</ul>
<h4 id="server-side-rendering-">Server side rendering :</h4>
<ul>
<li>서버 : 유저에게 응답하기 전에, 서버에서 리액트를 실행
리액트  : ui를 렌더링하고 결과 HTMl 을 제공. 해당 html를 유저에게 제공 
브라우저 : html 페이지만 갖고 있고 인터렉션은 없음</li>
<li>서버사이드가 클라이언트보다 복잡하지만 유저경험이 좋음</li>
</ul>
<h4 id="서버사이드의-문제">서버사이드의 문제!</h4>
<p>서버에서 먼저 전체 어플리케이션을 렌더링하게 때문에 어느 한 컴포넌트가 로딩하는데 오래걸리면 백엔드에서 전체 렌더링하는 동안 유저는 빈화면을 볼 수 있음.</p>
<pre><code class="language-react">&lt;App&gt;
    &lt;Header /&gt;
    &lt;Posts /&gt;
&lt;/App&gt;</code></pre>
<h4 id="해결-suspense가-활성화된-서버사이드-렌더링">해결! Suspense가 활성화된 서버사이드 렌더링</h4>
<ul>
<li>Suspense로 post 컴포넌트를 감싸서 유저는 header를 볼 수 있음 
서버 사이드에서 로딩을 끝낼 때, http 스트림을 사용해 리액트는 loader 컴포넌트의 html을 post 컴포넌트의 결과 html 로 대체함. </li>
<li>suspense 덕분에 어플리케이션이 빠르게 렌더링할 수 있음 . <pre><code class="language-react">&lt;App&gt;
  &lt;Header /&gt;
  &lt;Suspense fallback={&lt;Loader /&gt;}&gt;
      &lt;Posts /&gt;
  &lt;/Suspense&gt;
&lt;/App&gt;</code></pre>
Suspense 덕분에 전체 애플리케이션을 한꺼번에 로드할 필요가 없음
아직 hydreate 안된 걸 유저가 선택하면 유저가 인터렉션하기 원하는 그 컴포넌트 hydrate 로딩을 먼저함</li>
</ul>
<h4 id="server-component">Server component</h4>
<ul>
<li>서버 컴포넌트는 백엔드에서만 존재하는 리액트js코드를 쓸 수 있음</li>
<li>파일명을 통해 미리 어느 컴포넌트가 브라우저가 렌더링할지 서버가 렌더링할지 선택가능 </li>
<li>로딩이 빨라지고 ux도 엄청 향상됨
매우 무거운 패키지에 의존하는 컴포넌트가 있다면, 클라이언트 사이드 렌더링에서는 유저는 코드 그리고 해당 패키지를 다운로드해야하므로 로딩 속도도 오래걸리고 어플리케이션 사이즈 커짐
서버 컴포넌트로 전환하면 컴포넌트 렌더링은 서버에서 수행되고 렌더링의 결과값만 유저에게 스트리밍 됨.</li>
<li>DB랑 직접적으로 커뮤니케이션 하는 리액트 컴포넌트가 생김. SQL 쿼리 수행 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA8 추가된 Annotation]]></title>
            <link>https://velog.io/@ahreum-kim/JAVA8-%EC%B6%94%EA%B0%80%EB%90%9C-Annotation</link>
            <guid>https://velog.io/@ahreum-kim/JAVA8-%EC%B6%94%EA%B0%80%EB%90%9C-Annotation</guid>
            <pubDate>Tue, 11 Jan 2022 12:58:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런의 더자바, JAVA8 강의를 들으며 정리한 내용입니다.</p>
</blockquote>
<p>어노테이션이 궁금하다면 여기부터 읽어보세요:)
<a href="https://velog.io/@ahreum-kim/Annotation">어노테이션이란?</a></p>
<h2 id="java8-추가된-annotation-변화">JAVA8 추가된 Annotation 변화</h2>
<h2 id="1-annotation-을-타입-선언부에서도-사용할-수-있음">1. Annotation 을 타입 선언부에서도 사용할 수 있음</h2>
<p>@Target({ElementType.TYPE_PARAMETER}) // 타입 변수에만 사용
@Target({ElementType.TYPE_USE})       // 타입 변수를 포함해서 모든 타입 선언부에 사용</p>
<h4 id="type_parameter-사용예제">TYPE_PARAMETER 사용예제</h4>
<pre><code class="language-java">@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_PARAMETER})
public @interface Chicken {
}

public static &lt;@Chicken C&gt;/*타입파라미터*/ void print(C c/* 타입 */){
    System.out.println(c);
}</code></pre>
<p>타입에 선언하려고 한다면?
<img src="https://images.velog.io/images/ahreum-kim/post/2bcbc991-3098-43a5-83cb-a8fba7e28187/image.png" alt=""></p>
<h4 id="type_use-사용예제">TYPE_USE 사용예제</h4>
<pre><code class="language-java">@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
public @interface Pizza {
}

public static &lt;@Pizza C&gt;/*타입파라미터*/ void println(@Pizza C c/* 타입 */){
    System.out.println(c);
}</code></pre>
<h2 id="2-annotation-을-중복해서-사용할-수-있음">2. Annotation 을 중복해서 사용할 수 있음</h2>
<h4 id="중복-예제">중복 예제</h4>
<p>컨테이너 어노테이션은 중복 사용하려는 어노테이션의 @Retention, @Target 보다 같거나 더 넓어야 함</p>
<pre><code class="language-java">@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
public @interface PizzaContainer {
    Pizza[] value();
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
@Repeatable(PizzaContainer.class) //컨테이너 추가
public @interface Pizza {
    String value();
}

@Pizza(&quot;고르곤졸라&quot;)
@Pizza(&quot;슈퍼슈프림&quot;)
public class Main {

public static void main(String[] args){
            Pizza[] pizzas = Main.class.getAnnotationsByType(Pizza.class);
            Arrays.stream(pizzas).forEach(c-&gt;{
                System.out.println(c.value());
            });
        // 고르존졸라, 슈퍼슈프림
        }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Annotation]]></title>
            <link>https://velog.io/@ahreum-kim/Annotation</link>
            <guid>https://velog.io/@ahreum-kim/Annotation</guid>
            <pubDate>Mon, 03 Jan 2022 15:51:10 GMT</pubDate>
            <description><![CDATA[<h2 id="annotation이란">Annotation이란?</h2>
<ul>
<li>비즈니스 로직에 영향을 주지 않으면서 소스코드에 메타데이터(데이터에 대한 데이터)를 표현하는 방법</li>
<li>특정 소스를 어떤 용도로 쓸지, 어떤 역할을 줄지 결정할 수 있음</li>
<li>AOP 관점</li>
</ul>
<h2 id="annotation-만들기">Annotation 만들기</h2>
<pre><code class="language-java">@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ahreumAnnotation {
    //Element
    String value() default &quot;Ahreum Annotation Test&quot;;
}
</code></pre>
<h4 id="retentionretentionpolicy--어느-시점까지-보유할지-결정">@Retention(RetentionPolicy.~) : 어느 시점까지 보유할지 결정</h4>
<ul>
<li>@Retention(RetentionPolicy.RUNTIME): 런타임시 어노테이션 정보를 가져옴. 리플렉션 이용</li>
<li>@Retention(RetentionPolicy.SOURCE) : 소스상에서만 유지. Compile 이후 삭제</li>
<li>@Retention(RetentionPolicy.CLASS)  : 리플렉션 이용해 어노테이션 정보를 얻을 수 없음. 바이트 코드 파일까지 정보 유지</li>
</ul>
<h4 id="targetelementtype--적용대상">@Target({ElementType.~}) : 적용대상</h4>
<ul>
<li>ElementType.PACKAGE              : 패키지 선언시</li>
<li>ElementType.TYPE                     : 타입 선언시</li>
<li>ElementType.CONSTRUCTOR         : 생성자 선언시</li>
<li>ElementType.FIELD            : 멤버 변수 선언시</li>
<li>ElementType.METHOD           : 메소드 선언시</li>
<li>ElementType.ANNOTATION_TYPE :  어노테이션 타입 선언시</li>
<li>ElementType.LOCAL_VARIABLE  : 지역 변수 선언시</li>
<li>ElementType.PARAMETER       :  매개 변수 선언시</li>
<li>ElementType.TYPE_PARAMETER : 타입 변수에만 사용</li>
<li>ElementType.TYPE_USE         : 모든 타입 선언부에 사용</li>
</ul>
<h4 id="inherited--자식-클래스가-어노테이션-상속-가능">@Inherited : 자식 클래스가 어노테이션 상속 가능</h4>
<h4 id="repeatable--반복적으로-어노테이션-선언-가능">@Repeatable : 반복적으로 어노테이션 선언 가능</h4>
<h2 id="사용-예제">사용 예제</h2>
<pre><code class="language-java">public class AhreumDto {

    @ahreumAnnotation
    private String title; //디폴트값 들어감

    @ahreumAnnotation(value = &quot;title2 번째&quot;)
    private String title2;

    public String getTitle(){
        return title;
    }
    public String getTitle2(){
        return title2;
    }
}</code></pre>
<pre><code class="language-java">public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        Field[] fields = AhreumDto.class.getDeclaredFields();
        AhreumDto instance = AhreumDto.class.newInstance();
        for(Field f : fields){
            System.out.println(f.getName()); //title, title2 (field 출력됨)
            f.setAccessible(true);
            f.set(instance,f.getAnnotation(ahreumAnnotation.class).value());
        }
        System.out.println(instance.getTitle()); // Ahreum Annotation Test
        System.out.println(instance.getTitle2()); // title2 번째
    }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Optional API]]></title>
            <link>https://velog.io/@ahreum-kim/Optional-API</link>
            <guid>https://velog.io/@ahreum-kim/Optional-API</guid>
            <pubDate>Mon, 27 Dec 2021 15:16:51 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런의 더자바, JAVA8 강의를 들으며 정리한 내용입니다.</p>
</blockquote>
<h2 id="optional">Optional</h2>
<ul>
<li>값 한 개가 있을수도 있고 없을수도 있을때 사용함 </li>
<li>주로 결과값이 NULL 가능성이 있을때 사용</li>
<li>리턴값으로만 쓰기를 권장</li>
<li>Optional 은 또다른 Optional 로 감싸지 말기</li>
</ul>
<h2 id="optional-api">Optional API</h2>
<ol>
<li><p>Optional 만들기
Optional.of() : null이 안나올때 사용
Optional.ofNullable() : null이 올수도 있을때
Optional.empty() : null을 담고 있는,비어있는 Optional 객체 받아올때 사용</p>
</li>
<li><p>Optional에 값이 있는지 없는지 확인하기
isPresent()
isEmpty() (Java 11부터 제공)</p>
<pre><code class="language-java">List&lt;B_OnlineClass&gt; classes1 = new ArrayList&lt;&gt;();
classes1.add(new B_OnlineClass(1,&quot;spring boot&quot;,true));
classes1.add(new B_OnlineClass(2,&quot;study with me&quot;,false));
classes1.add(new B_OnlineClass(3,&quot;JPA&quot;,true));
</code></pre>
</li>
</ol>
<p>Optional<B_OnlineClass> optional = classes1.stream()
                .filter(oc -&gt; oc.getTitle().startsWith(&quot;ss&quot;))
                .findFirst();</p>
<p>boolean present = optional.isPresent();
System.out.println(present); //false</p>
<pre><code>
3. Optional에 있는 값 가져오기
get() : 비어있을때는 NoSuchElementException

4. Optional에 값이 있는 경우에 그 값을 가지고 ~~를 하라.
ifPresent(Consumer)
```java
optional.ifPresent(oc -&gt; System.out.println(oc.getTitle()));</code></pre><ol start="5">
<li>값이 있으면 가져오고 없으면~
orElse(T) : 없으면 실행
orElseGet(Supplier)
orElseThrow() : 없으면 에러 던지기<pre><code class="language-java">B_OnlineClass b_onlineClass = optional.orElse(new B_OnlineClass(6,&quot;sss&quot;,true));
System.out.println(b_onlineClass.getTitle()); //sss
</code></pre>
</li>
</ol>
<p>B_OnlineClass b_onlineClass3 = optional.orElseThrow(IllegalStateException::new); // Exception in thread &quot;main&quot; java.lang.IllegalStateException
System.out.println(b_onlineClass3.getTitle());</p>
<p>```</p>
<ol start="6">
<li>Optional 값 제어하기
Optional filter(Predicate) : 값 걸러내기
Optional map(Function) : 값 변환하기
Optional flatMap(Function): Optional 안에 들어있는 인스턴스가 Optional인 경우에 사용하면 편리</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Stream API]]></title>
            <link>https://velog.io/@ahreum-kim/Stream-API</link>
            <guid>https://velog.io/@ahreum-kim/Stream-API</guid>
            <pubDate>Mon, 20 Dec 2021 13:55:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런의 더자바, JAVA8 강의를 들으며 정리한 내용입니다.</p>
</blockquote>
<h2 id="stream">Stream</h2>
<ul>
<li>스트림으로 처리하는 데이터는 오직 한번만 처리</li>
<li>스트림이 처리하는 원본의 데이터는 변경하지 않음</li>
<li>중개 오퍼레이션은 근본적으로 lazy<pre><code class="language-java">List&lt;String&gt; names = new ArrayList&lt;&gt;();
names.add(&quot;ahreum&quot;); names.add(&quot;jenny&quot;); names.add(&quot;nami&quot;);
</code></pre>
</li>
</ul>
<p>Stream<Object> stringStream = names.stream().map(String::toUpperCase);</p>
<p>// 원본 데이터를 바꾸지 않음
names.forEach(System.out::print); //ahreum jenny nami
stringStream.forEach(System.out::println); // AHREUM JENNY NAMI</p>
<p>//중개형 oprator는 lazy 하다. 종료형 오퍼레이터가 있어야 중개형이 실행됨. 없으면 실행 안되고 선언만 됨
names.stream().map((s) -&gt; {
    System.out.println(s); // 실행안됨
    return s.toUpperCase();
});</p>
<p>names.stream().map((s) -&gt; {
    System.out.println(s);
    return s.toUpperCase();
}).collect(Collectors.toList()); //실행됨. ahreum jenny nami</p>
<pre><code>
## Stream 파이프라인
1. 시작
- 한개, stream()

2. 중개
- 여러개 사용 가능, Stream을 리턴
- filter, map, limit, skip, sorted, ...

3. 종료
- 한개 사용 가능, Stream을 리턴하지 않음
- collect, allMatch, count, forEach, min, max, ...

## Stream API
1. 걸러내기 : Filter(Predicate)

2. 변경하기 : Map(Function) 또는 FlatMap(Function)

3. 생성하기 : generate(Supplier) 또는 Iterate(T seed, UnaryOperator)

4. 제한하기 : limit(long) 또는 skip(long)

5. 스트림에 있는 데이터가 특정 조건을 만족하는지 확인 : anyMatch(), allMatch(), nonMatch()

6. 개수 세기 : count()

7. 스트림을 데이터 하나로 뭉치기 : reduce(identity, BiFunction), collect(), sum(), max()

```java
List&lt;B_OnlineClass&gt; classes1 = new ArrayList&lt;&gt;();
classes1.add(new B_OnlineClass(1,&quot;springBoot&quot;,true));
classes1.add(new B_OnlineClass(2,&quot;studyWithMe&quot;,false));
classes1.add(new B_OnlineClass(3,&quot;JPA&quot;,true));
classes1.add(new B_OnlineClass(4,&quot;react&quot;,false));
classes1.add(new B_OnlineClass(5,&quot;spring java8&quot;,true));

//1. 걸러내기
System.out.println(&quot;close 되지 않은 수업&quot;);
classes1.stream()
    .filter(Predicate.not(B_OnlineClass::getClosed))
    .forEach(n-&gt;System.out.println(n.getTitle())); //studyWithMe react


List&lt;B_OnlineClass&gt; classes2 = new ArrayList&lt;&gt;();
classes2.add(new B_OnlineClass(6,&quot;sinNanDa&quot;,true));
classes2.add(new B_OnlineClass(7,&quot;Test sul&quot;,false));
classes2.add(new B_OnlineClass(8,&quot;hey&quot;,true));

List&lt;List&lt;B_OnlineClass&gt;&gt; ahreumEvents = new ArrayList&lt;&gt;();
ahreumEvents.add(classes1);
ahreumEvents.add(classes2);

//2. 변경하기
System.out.println(&quot;두 수업 목록에 있는 모든 수업 아이디 출력&quot;);
ahreumEvents.stream()
    .flatMap(Collection::stream)    //list 를 flat하게 만듦
    .forEach(oc -&gt; System.out.println(oc.getId())); //1 2 3 4 5 6 7 8

// 3. 생성하기, 4. 제한하기
System.out.println(&quot;10부터 1씩 증가하는 무제한 스트림 중에서 앞에 10개 빼고 최대 10개 까지만&quot;);
Stream.iterate(10, i-&gt;i+1)
    .skip(10)
     .limit(10)
    .forEach(System.out::println);</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[메소드 레퍼런스]]></title>
            <link>https://velog.io/@ahreum-kim/%EB%A9%94%EC%86%8C%EB%93%9C-%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4</link>
            <guid>https://velog.io/@ahreum-kim/%EB%A9%94%EC%86%8C%EB%93%9C-%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4</guid>
            <pubDate>Mon, 13 Dec 2021 13:52:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런의 더자바, JAVA8 강의를 들으며 정리한 내용입니다.</p>
</blockquote>
<h2 id="메소드-레퍼런스란">메소드 레퍼런스란?</h2>
<p>람다 표현식이 단 하나의 메소드만을 호출하는 경우, 불필요한 매개변수를 제거하여 간결하게 표현하도록 해줌 </p>
<h4 id="메소드를-참조하는-방법">메소드를 참조하는 방법</h4>
<pre><code> 스태틱 메소드 참조               |  타입::스태틱 메소드
 특정 객체의 인스턴스 메소드 참조    |  객체 레퍼런스::인스턴스 메소드
 임의 객체의 인스턴스 메소드 참조    |  타입::인스턴스 메소드 
 생성자 참조                    |  타입::new </code></pre><h4 id="1-스태틱-메소드-참조">1. 스태틱 메소드 참조</h4>
<pre><code class="language-java">public class A_MethodReference {
 //static method
 public static String hi(String name){
        return  &quot;hi &quot;+name;
    }
}

//static method reference
UnaryOperator&lt;String&gt; hi = A_MethodReference::hi; 
System.out.println(hi.apply(&quot;ahreum&quot;)); // hi ahreum</code></pre>
<h4 id="2-특정-개체의-인스턴스-메소드-참조">2. 특정 개체의 인스턴스 메소드 참조</h4>
<pre><code class="language-java">public class A_MethodReference {
//instance method
public String hello(String name){
        return &quot;hello &quot;+name;
    }
}

//instance method reference
A_MethodReference a_methodReference = new A_MethodReference();
UnaryOperator&lt;String&gt; hello = a_methodReference::hello;
System.out.println(hello.apply(&quot;ahreum&quot;)); // hello ahreum</code></pre>
<h4 id="3-임의의-객체에-인스턴스-메소드-참조하는-경우">3. 임의의 객체에 인스턴스 메소드 참조하는 경우</h4>
<pre><code class="language-java">String[] names = {&quot;vvv&quot;,&quot;ahreum&quot;,&quot;hong&quot;};
Arrays.sort(names, String::compareToIgnoreCase);
           //Comparator 함수형 인터페이스
System.out.println(Arrays.toString(names)); // ahreum, hong, vvv</code></pre>
<h4 id="4-생성자-참조">4. 생성자 참조</h4>
<pre><code class="language-java">public class A_MethodReference {
    private String name;

   //입력값 없는 생성자 (case 1)
    public A_MethodReference(){
    }
   //입력값 받는 생성자 (case 2)
    public A_MethodReference(String name){
        this.name = name;
    }
}

//constructor reference
//입력값 없는 생성자 만들어짐 (case 1)
Supplier&lt;A_MethodReference&gt; a_methodReferenceSupplier= A_MethodReference::new;
a_methodReferenceSupplier.get(); // 이 때 만들어짐

//입력값 받는 생성자 만들어짐 (case 2)
Function&lt;String, A_MethodReference&gt; ahriGreeting = A_MethodReference::new;
A_MethodReference aMethodReference2 = ahriGreeting.apply(&quot;ahreum&quot;);
System.out.println(aMethodReference2.getName()); // ahreum</code></pre>
<blockquote>
<p>compareTo() 와 compareToIgnoreCase()</p>
</blockquote>
<ul>
<li>int compareTo(String str) : 인자값으로 비교대상 String 값을 받아서 int 로 반환함 
ex) &quot;abc&quot;.compareTo(&quot;def&quot;)</li>
<li>int compareToIgnoreCase() : compareTo와 비슷하나 대소문자 무시</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[람다]]></title>
            <link>https://velog.io/@ahreum-kim/%EB%9E%8C%EB%8B%A4</link>
            <guid>https://velog.io/@ahreum-kim/%EB%9E%8C%EB%8B%A4</guid>
            <pubDate>Mon, 06 Dec 2021 15:17:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런의 더자바, JAVA8 강의를 들으며 정리한 내용입니다.</p>
</blockquote>
<h2 id="람다란">람다란?</h2>
<ul>
<li>익명 함수</li>
<li>파라미터, 화살표, 바디(람다의 반환값)로 이루어져 있음<pre><code>(파라미터1, 파라미터2, ...) -&gt; {반환값}</code></pre></li>
<li><strong>쉐도잉</strong> 하지 않음. 
로컬클래스, 익명클래스는 새로 scope을 만들지만 람다는 람다를 감싸고 있는 것과 scope이 같음</li>
</ul>
<h2 id="로컬클래스-익명클래스와-람다-비교">로컬클래스, 익명클래스와 람다 비교</h2>
<h4 id="로컬클래스와-익명클래스">로컬클래스와 익명클래스</h4>
<pre><code class="language-java">final int baseNumber = 10;

//로컬클래스
class LocalClass{

      void printBaseNumber(){
                System.out.println(baseNumber); //10
            }

            void printBaseNumber2(){
                int baseNumber = 11;
                System.out.println(baseNumber); //11
            }
        }

 //익명클래스 
 Consumer&lt;Integer&gt; integerConsumer = new Consumer&lt;Integer&gt;() {
            Integer baseNumber = 11;
            @Override
            public void accept(Integer integer) {
                System.out.println(baseNumber);
            }
        };       
</code></pre>
<p>함수 안의 baseNumber 값에 영향을 받음 (scope 다르기 때문) </p>
<h4 id="람다">람다</h4>
<pre><code class="language-java">//람다
IntConsumer printInt = (i) -&gt; {
    System.out.println(baseNumber); //10
};</code></pre>
<p><img src="https://images.velog.io/images/ahreum-kim/post/1fda0688-086b-4802-a008-5ecd306c1d11/image.png" alt=""></p>
<p>람다를 감싸고 있는 부분과 scope 이 같아서 baseNumber 사용시, 컴파일 에러가 남</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Functional Interface]]></title>
            <link>https://velog.io/@ahreum-kim/Functional-Interface-1yl1rc8j</link>
            <guid>https://velog.io/@ahreum-kim/Functional-Interface-1yl1rc8j</guid>
            <pubDate>Sun, 05 Dec 2021 05:58:10 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런의 더자바, JAVA8 강의를 들으며 정리한 내용입니다.</p>
</blockquote>
<h2 id="함수형-인터페이스란">함수형 인터페이스란?</h2>
<ul>
<li>추상 메소드를 딱 하나만 가지고 있는 인터페이스 (SAM, Single Abstract Method)<pre><code>//A_FunctionalInterface.java
public interface A_FunctionalInterface {
  void doIt(); // abstract
}
</code></pre></li>
</ul>
<p>//Main.java
A_FunctionalInterface functionalInterface = () -&gt; {
    System.out.println(&quot;hello&quot;);
};
functionalInterface.doIt(); //hello</p>
<pre><code>
## 자바에서 미리 정의한 함수 인터페이스
- 함수를 First class object (일급객체) 로 사용할 수 있음
    - 사용할 때 다른 요소들과 아무런 차별이 없다는 뜻
    - 다른 객체들에 일반적으로 적용가능한 연산을 모두 지원하는 객체
- 순수 함수 (Pure function)
    - 사이드 이팩트가 없음. 입력값이 동일하면 결과값이 동일
    - 상태가 없음 (함수 밖에 있는 값을 사용하지 않는다.)
- 고차 함수 (Higher-Order Function)
    - 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있음
- 불변성(변하지 않음)

### 1. Function
T 타입을 받아서 R 타입을 리턴. R apply(T t). andThen, compose</code></pre><p>Function&lt;Integer,Integer&gt; plus10 = (i) -&gt; i+10;
Function&lt;Integer,Integer&gt; multiply2 = (i) -&gt; i*2;</p>
<p>//compose 는 괄호 안 부터 실행 : multiply2 -&gt; plus10 
System.out.println(plus10.compose(multiply2).apply(1)); //1<em>2+10 = 12
//andThen 는 괄호를 나중에 실행 : plus10 -&gt; multiply2 
System.out.println(plus10.andThen(multiply2).apply(1)); //(1+10)</em>2 = 22</p>
<pre><code>
### 2. BiFunction&lt;T, U, R&gt;
두 개의 값(T, U)를 받아서 R 타입을 리턴. R apply(T t, U u)</code></pre><p>BiFunction&lt;Integer,Integer,Integer&gt; multiply = (i,j) -&gt; i*j;</p>
<p>System.out.println(multiply.apply(10,5)); // 50</p>
<pre><code>
### 3. Consumer&lt; T &gt;
T 타입을 받아서 아무값도 리턴하지 않는 함수. void Accept(T t). andThen</code></pre><p>Consumer<Integer> printT = System.out::println; 
        // (i) -&gt; System.out.println(i);
printT.accept(10); // 10</p>
<pre><code>
### 4. Supplier&lt; T &gt;         
  T 타입의 값을 제공. T get()</code></pre><p>Supplier<Integer> ten = () -&gt; 10;</p>
<p>System.out.println(ten.get()); //10</p>
<pre><code>
### 5. Predicate&lt; T &gt;        
  T 타입을 받아서 boolean을 리턴. boolean test(T t). And, Or, Negate</code></pre><p>Predicate<String> startsWithAhri = (s) -&gt; s.startsWith(&quot;ahri&quot;);</p>
<p>System.out.println(startsWithAhri.test(&quot;ahriNara&quot;)); //true</p>
<pre><code>




</code></pre>]]></description>
        </item>
    </channel>
</rss>