<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>main_function</title>
    <link>https://mainfunction.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 25 May 2026 21:49:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>MAIN</managingEditor>
    <item>
      <title>[Go/Golang] 채널(channel)</title>
      <link>https://mainfunction.tistory.com/entry/GoGolang-%EC%B1%84%EB%84%90channel</link>
      <description>&lt;p&gt;호어의 CSP(Communicating Sequential Processes) 컨셉에서 파생된 Go의 채널은 동기화 기본 요소 중 하나입니다. 앞선 &lt;a href=&quot;https://mainfunction.tistory.com/entry/GoGolang-%EA%B3%A0%EB%A3%A8%ED%8B%B4goroutine-Deep-Dive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;글&lt;/a&gt;에서 언급했던 것처럼&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;메모리 공유를 통해 통신하지 말라! 대신 통신을 통해 메모리를 공유해라!&lt;/blockquote&gt;
&lt;p&gt;라는 것이 모토입니다.&lt;/p&gt;
&lt;p&gt;이는 스트림처럼 어딘가에서 데이터를 흘려보내면 다른 곳에서 그 값을 받아서 사용합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611140763427&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 양방향 채널
var thisIsChannel chan interface {}
thisIsChannel = make(chan interface{})

// 단방향 채널
var receiveChannel &amp;lt;-chan interface{} // 수신 전용 채널
var sendChannel chan&amp;lt;- interface{}    // 송신 전용 채널

stringStream := make(chan string)
go func() {
    stringStream &amp;lt;- &quot;Hello&quot;
}()

fmt.Println(&amp;lt;-stringStream)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Buffered / Unbuffered channel&lt;/h2&gt;
&lt;p&gt;아래와 같이 채널 생성시 버퍼의 크기를 입력해주면 buffered 채널이 생성되고 그렇지 않으면 unbuffered 채널이 생성됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dataStream := make(chan interface{}, 10)&lt;br /&gt;: 버퍼링된 채널 같은 경우 채널에서 읽기가 수행되지 않더라도 버퍼 크기만큼의 데이터를 받아줄 수 있습니다. 단, 버퍼가 꽉 차게 되면 blocking을 하고 버퍼에 빈 자리가 생길 때까지 기다립니다.&lt;/li&gt;
&lt;li&gt;dataStream := make(chan interface{})&lt;br /&gt;: 버퍼가 없는 채널은 데이터를 보낼 때 다른 곳에서 데이터를 전달받을 것을 보장하기 위해 blocking을 하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;294&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3gWxQ/btqUf0ybvHv/fRByhYBikH9vMVSnlIxZ70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3gWxQ/btqUf0ybvHv/fRByhYBikH9vMVSnlIxZ70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3gWxQ/btqUf0ybvHv/fRByhYBikH9vMVSnlIxZ70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3gWxQ%2FbtqUf0ybvHv%2FfRByhYBikH9vMVSnlIxZ70%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;294&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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;만약 버퍼 사이즈가 3인 정수형 채널을 생성했다면 큐에 쌓이듯이 1,2,3은 순차적으로 블록킹 없이 채널로 들어오게 됩니다. 물론 중간에 채널에서 값을 읽어가면 FIFO 구조로 먼저 데이터가 빠지겠지만요. 중간에 그런 과정이 없다면 1, 2, 3이 순차적으로 쌓이고 채널의 버퍼가 다 차게 되면 그 뒤에 값을 넣는 부분에서 블록킹이 됩니다.&amp;nbsp;이후 채널에서부터 값을 받아가면 블록킹되어 있던 4가 채널로 전송이됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming</category>
      <category>go</category>
      <category>go channel</category>
      <category>golang</category>
      <category>고언어</category>
      <author>MAIN</author>
      <guid isPermaLink="true">https://mainfunction.tistory.com/59</guid>
      <comments>https://mainfunction.tistory.com/entry/GoGolang-%EC%B1%84%EB%84%90channel#entry59comment</comments>
      <pubDate>Wed, 20 Jan 2021 20:15:37 +0900</pubDate>
    </item>
    <item>
      <title>도서 - 연오의 파이썬</title>
      <link>https://mainfunction.tistory.com/entry/%EB%8F%84%EC%84%9C-%EC%97%B0%EC%98%A4%EC%9D%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
      <description>&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/96426841&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/96426841&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1610796181071&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;연오의 파이썬&quot; data-og-description=&quot;프로그래밍의 원리를 알아야파이썬 문법이 보인다!이 책은 프로그래밍 지식이 전혀 없는 사람을 대상으로 한다. 파이썬 설치부터 기초 개념, 문법, 프로그램 개발 방법까지 차근차근 다룬다. 저&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/96426841&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/96426841&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mYgTm/hyIXjISl23/iENpZwckObr21KTGVIEZJ0/img.jpg?width=312&amp;amp;height=400&amp;amp;face=111_89_264_134&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/96426841&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/96426841&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mYgTm/hyIXjISl23/iENpZwckObr21KTGVIEZJ0/img.jpg?width=312&amp;amp;height=400&amp;amp;face=111_89_264_134');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;연오의 파이썬&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;프로그래밍의 원리를 알아야파이썬 문법이 보인다!이 책은 프로그래밍 지식이 전혀 없는 사람을 대상으로 한다. 파이썬 설치부터 기초 개념, 문법, 프로그램 개발 방법까지 차근차근 다룬다. 저&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3줄 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비전공자 또는 프로그래밍 언어 입문자(다른 언어를 해본 적 없는 입문자)에게 강추!&lt;/li&gt;
&lt;li&gt;다른 프로그래밍 언어 책과 달리 비유 등으로 매우 &lt;b&gt;쉽게 설명&lt;/b&gt;되어 있음&lt;/li&gt;
&lt;li&gt;온라인 doc 등으로 문법만 간략하게 익힌 사람들에게 추천(예제, 연습문제, 실무에서 많이 쓸 법한 구문 등 포함)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;비전공자인 동생과 지인들에게 프로그래밍? 코딩?에 대한 환상을 깨고 자동화 툴로써 활용하기를 바라며 종종 파이썬을 가르치고 있다. 파이썬을 비롯한 프로그래밍 언어를 남에게 가르치다 보면 당연하다고 생각한 것들을 이해하지 못할 때가 있고 이를 이해시키고 이걸 '왜' 쓰는지를 묻는 경우가 많다. 이 책은 그것을 쉽게 설명하고, 단순 파이썬 문법 뿐만 아니라 여러 케이스들을 소개하면서 익힐 수 있게 해주는 아주 좋은 파이썬 기본서이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 쉽게 설명된 소제목(챕터명)&lt;/h3&gt;
&lt;p&gt;이 책에서 가장 마음에 든 것은 인덱스 구성이다. 대부분의 프로그래밍 입문서는 문법 그대로를 설명한다. 예를 들어 if문 배우기, 조건문 다루기, 예외처리 등과 같이 말이다. 아주 딱딱하고 처음 접하는 사람으로서 뭘 배우는 단원인지 해당 챕터를 공부를 해봐야 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;하지만 연오의 파이썬은 그렇지 않다. 아래는 실제 이 책의 챕터들이다.&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2장 수식을 계산하고 정보를 기억하기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;3장 함수로 문제를 나누어 풀기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;4장 여러 가지 유형의 데이터 다루기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;5장 컬렉션으로 데이터를 모으고 정돈하기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;6장 선택과 반복으로 실행 흐름 조정하기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;7장 컬렉션을 중첩&amp;middot;순회&amp;middot;가공하기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;8장 클래스로 데이터 분류하기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;9장 오류를 방지하고 해결하기&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;아마도 다른 책에선 5장 자료구조(리스트, 딕셔너리), 6장 제어문과 반복문, 8장 클래스, 9장 예외처리 등과 같이 설명했을 것이다. 하지만 이 책에서는 아래와 같이&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;선택과 반복으로 뭘 할 수 있지?&lt;br /&gt;아~ 실행의 흐름을 조정할 수 있구나!&amp;nbsp;&lt;/blockquote&gt;
&lt;p&gt;라고 직관적으로 알 수 있게 풀이했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 코드에 대한 자세한 설명&lt;/h3&gt;
&lt;p&gt;예제 코드에 대해 주석으로 설명하고, 필요하다면 번호를 달아서 본문에서 아주 상세하게 해설하고 있다. 이 부분은 뒷 장에서 나오는 응용 프로그램 만들기 챕터에서 아주 많은 도움이 된다. 실제로 파이썬 입문자에게 보여줬을 때&amp;nbsp; 책만 보고도 코드를 쉽게 이해하고 활용할 수 있었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 기본 문법 외 배울 것들이 많다.&lt;/h3&gt;
&lt;p&gt;zip() 함수로 엮기, map, filter, &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;list comprehension&lt;/span&gt; 등에 대한 예시도 있고, 문법에 어긋나진 않지만 좋은 코드를 작성할 수 있게끔 조언도 곁들여져 있어서 현업에서 사수 조언을 받는 느낌이다.&lt;/p&gt;
&lt;p&gt;사실 파이썬은 온라인에 공개된 자료도 많고&amp;nbsp; &lt;a href=&quot;https://wikidocs.net/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;wikidocs.net/43&lt;/a&gt; 같은 좋은 자료도 처음부터 끝까지 모두 공개가 되어 있어서 문법을 익히는 데에는 무리가 없다. 하지만 굳이 책을 사서 본다면 저런 추가적인 정보들을 얻기 위함이 아닐까 생각된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 연습문제가 많이 수록되어 있어서 혼자 공부하기에도 좋은 것 같다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;실제로 동생과 비전공 입문자들에게 책을 빌려줬을 때 굉장히 도움이 많이 되었던 책이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;나온지 얼마되지 않아서 보이는 오타나 뒷부분의 응용 프로그램 만들기 부분에서 코드 가독성이 좀 아쉬다거나 책만 보고 코드를 칠 때 뭐가 바뀐건지 diff 표시가 안됐다? 정도를 제외하곤 글과 아기자기한 그림으로 쉽게 자세하게 설명한 좋은 입문서이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Book/IT</category>
      <category>Python</category>
      <category>python 책</category>
      <category>연오의 파이썬</category>
      <category>파이썬</category>
      <category>파이썬 기본서</category>
      <author>MAIN</author>
      <guid isPermaLink="true">https://mainfunction.tistory.com/58</guid>
      <comments>https://mainfunction.tistory.com/entry/%EB%8F%84%EC%84%9C-%EC%97%B0%EC%98%A4%EC%9D%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC#entry58comment</comments>
      <pubDate>Sat, 16 Jan 2021 21:10:48 +0900</pubDate>
    </item>
    <item>
      <title>[Go/Golang] 2. 고루틴(goroutine) Deep Dive</title>
      <link>https://mainfunction.tistory.com/entry/GoGolang-%EA%B3%A0%EB%A3%A8%ED%8B%B4goroutine-Deep-Dive</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;CSP (Communicating Sequential Processes)&lt;/h2&gt;
&lt;p&gt;Go언어, 고루틴을 다루면서 대표적으로 듣는 컨셉이 CSP 입니다. 저 자체가 논문의 제목이자 Go 언어가 동시성을 모델링한 방식입니다.&lt;/p&gt;
&lt;p&gt;프로그래밍에서 두 가지 기본 요소인 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;입력과 출력&lt;/b&gt;&lt;/span&gt;이 간과하고 있고, 특히 동시에 실행되는 코드의 경우에 더욱 그렇다 라는 접근 방식이 CSP의 핵심이라고 합니다. Go 언어는 CSP의 핵심 원칙을 통합한 최초의 언어 중 하나라고 합니다.&lt;/p&gt;
&lt;p&gt;I/O 제어와 프로세스 통신이 Go의 동시성 프로그래밍의 기반입니다. 공유 메모리 모델을 대규모 프로그램이나 복잡한 프로그램에서 올바르게 활용하기 어렵고, 제약사항도 많기 때문에 이러한 방식을 택했다고 알려져 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래의 내용이 Go 언어의 동시성 핵심 철학입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;메모리 공유를 통해 통신하지 말라! 대신 통신을 통해 메모리를 공유해라!&lt;br /&gt;&lt;br /&gt;단순화를 목표로 하고, 가능하면 채널을 사용하고 고루틴을 무한정 쓸 수 있는 자원처럼 다루어라!&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;goroutine은 coroutine 중 하나이다.&lt;/h2&gt;
&lt;p&gt;고루틴은 OS Thread도 아니고 Green Thread도 아닙니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Green Thread&lt;br /&gt;주로 runtime library나 VM에서 사용하는 방식으로 대표적으로 JVM 내에서 생성하는 스레드(user-level thread)가 있습니다. JVM에 의해 컨트롤되며 1.3 버전 이전까지는 1:N 맵핑의 완전 user-level thread였지만 현재는 Kernel Thread와 1:1 맵핑되는 방식입니다.&lt;br /&gt;그린 스레드는 원래 자바 스레드 관련 라이브러리 이름이었고 1.1 ~ 1.3버전까지 쓰다가 사라지고 그린 스레드라는 이름만 통용되고 있는 상태입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;goroutine은 coroutine이라고 불리는 더 높은 수준의 추상화입니다. 코루틴은 동시에 실행되는 서브루틴(함수, 클로저 등)으로서, 비선점적(Non-preemptive)이라서 중간에 끼어들 수 없습니다. 대신 코루틴은 중단(suspend)이나 재진입(reentry)할 수 있는 여러 지점을 가지고 있습니다. 단, goroutine은 block 상태일 때만 중단이 가능하다는 점이 차이점입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;goroutine의 장점&lt;/h2&gt;
&lt;p&gt;고루틴은 OS 스레드보다 가벼운 경량 스레드입니다. 자바의 스레드의 경우 약 1MB 메모리가 필요하고 거기에 스레드끼리의 여유 공간인 guard page까지 필요한데 반해 고루틴은 2KB(v1.3기준)의 스택 공간만 차지합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또한 Context Switching 시 일반적인 스레드는 16개의 범용 레지스터, PC, SP, segment 레지스터, 16개의 XMM 레지스터 등 많은 것을 저장하고 복구해야 하지만 &lt;u&gt;&lt;b&gt;고루틴&lt;/b&gt;은 3개의 레지스터(PC, SP, DX)만 저장 및 복구&lt;/u&gt;하면 되기 때문에 컨텍스트 스위칭 비용이 매우 적습니다. 이게 만얀 무거웠다면 N개의 OS 스레드에 M개의 고루틴을 계속 스케줄링하면서 실행하는 데에 큰 부하가 있었을 것입니다.&lt;/p&gt;
&lt;p&gt;위와 같은 이유들 때문에 고루틴을 경량 스레드라고 불리고 있으며 초기 스타팅 타임도 꽤 빠르다고 알려져있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;고루틴은 OS thread와 M:N 맵핑&lt;/h2&gt;
&lt;p&gt;Go의 경우 자바의 concurrency model과 마찬가지로 fork-join 모델을 입니다. fork로 분기하여 main 고루틴과 sayHello 고루틴이 동시에 실행되는 방식이죠.&lt;/p&gt;
&lt;pre id=&quot;code_1611056379774&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func main() {
    var wg sync.WaitGroup
    sayHello := func() {
        defer wg.Done()
        fmt.Println(&quot;Hello&quot;)
    }
    
    wg.Add(1)
    go sayHello()
    
    wg.Wait()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&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; width=&quot;618&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byqsNM/btqT17ec1jN/ihBXc5dkrwM2cb0vhIoqR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byqsNM/btqT17ec1jN/ihBXc5dkrwM2cb0vhIoqR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byqsNM/btqT17ec1jN/ihBXc5dkrwM2cb0vhIoqR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyqsNM%2FbtqT17ec1jN%2FihBXc5dkrwM2cb0vhIoqR0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;618&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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;위 코드를 그림으로 나타낸 모습입니다. sayHello라는 함수를 고루틴으로 만들어줍니다. sync 패키지의 WaitGroup을 사용하지 않으면 높은 확률로 sayHello가 실행도 안된 상태로 프로그램이 종료될 것입니다. (물론 이것도 경우에 따라 달라지겠죠) 이를 방지하기 위해 명시적으로 해당 고루틴이 끝날 때까지 기다림으로써 적절한 합류 지점을 설정합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&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; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5rGGc/btqT90rpmUM/fkxGjNBKetAzNEyOKDhm90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5rGGc/btqT90rpmUM/fkxGjNBKetAzNEyOKDhm90/img.png&quot; data-alt=&quot;Go scheduling&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5rGGc/btqT90rpmUM/fkxGjNBKetAzNEyOKDhm90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5rGGc%2FbtqT90rpmUM%2FfkxGjNBKetAzNEyOKDhm90%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;Go scheduling&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Go는 내부적으로 OS thread를 지칭하는 m이라는 구조체와 processor 컨텍스트를 일컫는 p구조체, 그리고 마지막으로 고루틴을 지칭하는 g구조체로 구성되어 있습니다. 실제 내부 코드는 공식 레포 링크를 달아뒀으니 참고해주시기 바랍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;goroutine struct&lt;br /&gt;&lt;a href=&quot;https://github.com/golang/go/blob/d047c91a6c0f22af00d1c1e770a9d85201392656/src/runtime/runtime2.go#L404&quot;&gt;github.com/golang/go/blob/d047c91a6c0f22af00d1c1e770a9d85201392656/src/runtime/runtime2.go#L404&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;machine, os thread(POSIX)&lt;br /&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://github.com/golang/go/blob/d047c91a6c0f22af00d1c1e770a9d85201392656/src/runtime/runtime2.go#L486&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/golang/go/blob/d047c91a6c0f22af00d1c1e770a9d85201392656/src/runtime/runtime2.go#L486&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;processor(context)&lt;br /&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://github.com/golang/go/blob/d047c91a6c0f22af00d1c1e770a9d85201392656/src/runtime/runtime2.go#L576&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/golang/go/blob/d047c91a6c0f22af00d1c1e770a9d85201392656/src/runtime/runtime2.go#L576&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;고루틴은 OS 스레드와 M:N 맵핑이기 때문에 스케줄링을 위해서는 이를 담고 있을 큐가 필요하다. 그래서 각 프로세서(P)마다 Local Run Queue가 있고 여기 고루틴이 담겨있다. 코드 상으로 봤을 때 &lt;i&gt;runq&lt;/i&gt; 라는 슬라이스가 256인 것으로 보아 로컬 런큐의 사이즈는 256인 듯합니다.&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; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHix3T/btqT7VxldAV/KqOfr6dZgfT8ZQk7QJEUf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHix3T/btqT7VxldAV/KqOfr6dZgfT8ZQk7QJEUf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHix3T/btqT7VxldAV/KqOfr6dZgfT8ZQk7QJEUf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHix3T%2FbtqT7VxldAV%2FKqOfr6dZgfT8ZQk7QJEUf0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;이 프로세서(P)가 컨텍스트이기 때문에 free한 스레드(M)이 생기거나 시스템 콜 등으로 인한 블록킹이 발생했을 때 P가 스케줄링되어 다른 M으로 할당됩니다. 즉, 실행 중인 스레드가 blocking 상태가 되면 다른 스레드로 현재 컨텍스트를 그대로 넘겨서 처리할 수 있도록 하기 위해 P가 구현되어 있습니다. 이는 Go의 GOMAXPROCS 라는 값으로 조정이 가능합니다.&lt;/p&gt;
&lt;p&gt;Global Run Queue는 스케줄링이 되지 않은 고루틴이나 블록킹 등의 이유로 실행이 멈췄다가 재개되는 고루틴들이 쌓이는 공간이고 이는 Go의 스케줄러에 의해 적당한 프로세스(P)의 Local Run Queue로 스케줄링됩니다.&lt;/p&gt;
&lt;p&gt;Local Run Queue 간의 불균형이 발생할 경우 GOMAXPROCS 값을 고려하여 리밸런싱 작업도 수행됩니다. 이를 goroutine steal 이라고 표현하기도 합니다.&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&gt;&amp;nbsp;&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;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/74820845?OzSrank=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/74820845?OzSrank=1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1611063397384&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;Go 동시성 프로그래밍&quot; data-og-description=&quot;고성능의 멀티 코어 CPU, 클라우드 기반의 비동기 서비스 등 최근 트렌드를 고려하면 프로그램을 작성할 때 동시성을 고려하는 것은 필수 과정이다. 이 책에서는 Go 언어의 동시성 모델과 이론적 &quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/74820845?OzSrank=1&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/74820845&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jV28R/hyIZUIaDsf/040hemDRB39gXL9IFwPm9k/img.jpg?width=320&amp;amp;height=400&amp;amp;face=0_0_320_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/74820845?OzSrank=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/74820845?OzSrank=1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jV28R/hyIZUIaDsf/040hemDRB39gXL9IFwPm9k/img.jpg?width=320&amp;amp;height=400&amp;amp;face=0_0_320_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Go 동시성 프로그래밍&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;고성능의 멀티 코어 CPU, 클라우드 기반의 비동기 서비스 등 최근 트렌드를 고려하면 프로그램을 작성할 때 동시성을 고려하는 것은 필수 과정이다. 이 책에서는 Go 언어의 동시성 모델과 이론적&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://www.timqi.com/2020/05/15/how-does-gmp-scheduler-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.timqi.com/2020/05/15/how-does-gmp-scheduler-work/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1611063350265&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;How does GMP scheduler work&quot; data-og-description=&quot;As we know that There is a runtime when Golang running. The runtime perform the scheduled tasks(goroutine) in user space rather than kernel, so it&amp;rsquo;s more lightweight. It do a better tradeoff be&quot; data-og-host=&quot;www.timqi.com&quot; data-og-source-url=&quot;https://www.timqi.com/2020/05/15/how-does-gmp-scheduler-work/&quot; data-og-url=&quot;https://www.timqi.com/2020/05/15/how-does-gmp-scheduler-work/index.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/F6jIF/hyIZ5JH2Vf/jzAus5gHBTj4q5VuFuZt1K/img.jpg?width=1024&amp;amp;height=768&amp;amp;face=0_0_1024_768,https://scrap.kakaocdn.net/dn/kMcoG/hyIZ7AKkLB/RLbe4aKC16Nc9s5Wyxv7FK/img.jpg?width=1240&amp;amp;height=698&amp;amp;face=0_0_1240_698,https://scrap.kakaocdn.net/dn/N4p4a/hyIZ0n5Hvs/UIwdbkQbay0ZyXFrRlxrB1/img.png?width=696&amp;amp;height=1580&amp;amp;face=0_0_696_1580,https://scrap.kakaocdn.net/dn/NCcQN/hyIZZioK6z/DmAfT0WSyIZq0HFgdMN2qK/img.jpg?width=1024&amp;amp;height=768&amp;amp;face=0_0_1024_768&quot;&gt;&lt;a href=&quot;https://www.timqi.com/2020/05/15/how-does-gmp-scheduler-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.timqi.com/2020/05/15/how-does-gmp-scheduler-work/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/F6jIF/hyIZ5JH2Vf/jzAus5gHBTj4q5VuFuZt1K/img.jpg?width=1024&amp;amp;height=768&amp;amp;face=0_0_1024_768,https://scrap.kakaocdn.net/dn/kMcoG/hyIZ7AKkLB/RLbe4aKC16Nc9s5Wyxv7FK/img.jpg?width=1240&amp;amp;height=698&amp;amp;face=0_0_1240_698,https://scrap.kakaocdn.net/dn/N4p4a/hyIZ0n5Hvs/UIwdbkQbay0ZyXFrRlxrB1/img.png?width=696&amp;amp;height=1580&amp;amp;face=0_0_696_1580,https://scrap.kakaocdn.net/dn/NCcQN/hyIZZioK6z/DmAfT0WSyIZq0HFgdMN2qK/img.jpg?width=1024&amp;amp;height=768&amp;amp;face=0_0_1024_768');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;How does GMP scheduler work&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;As we know that There is a runtime when Golang running. The runtime perform the scheduled tasks(goroutine) in user space rather than kernel, so it&amp;rsquo;s more lightweight. It do a better tradeoff be&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.timqi.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://tech.ssut.me/goroutine-vs-threads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;tech.ssut.me/goroutine-vs-threads/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1611063378749&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Goroutines vs Threads&quot; data-og-description=&quot;Google이 Go 언어를 만들어낸 이후 많은 시스템 관리용 유틸리티, 서버가 Go로 짜여지기 시작했고 매 업데이트마다 엄청난 성능 향상과 발전으로 이제 어디서든 Go 언어로 짜여진 프로그램을 쉽게 &quot; data-og-host=&quot;tech.ssut.me&quot; data-og-source-url=&quot;https://tech.ssut.me/goroutine-vs-threads/&quot; data-og-url=&quot;https://tech.ssut.me/goroutine-vs-threads/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XTd8W/hyIZXrlPg8/55pS08Whym4PXr9kfOTUT0/img.jpg?width=800&amp;amp;height=329&amp;amp;face=0_0_800_329,https://scrap.kakaocdn.net/dn/cJrxa0/hyIZTP1O41/86yRj2yJKMpM43jPB90T91/img.jpg?width=800&amp;amp;height=329&amp;amp;face=0_0_800_329,https://scrap.kakaocdn.net/dn/bjbU0M/hyIZYRkWAm/3QhkPd5kGB3rUm9sKbehdk/img.png?width=972&amp;amp;height=565&amp;amp;face=0_0_972_565&quot;&gt;&lt;a href=&quot;https://tech.ssut.me/goroutine-vs-threads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tech.ssut.me/goroutine-vs-threads/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XTd8W/hyIZXrlPg8/55pS08Whym4PXr9kfOTUT0/img.jpg?width=800&amp;amp;height=329&amp;amp;face=0_0_800_329,https://scrap.kakaocdn.net/dn/cJrxa0/hyIZTP1O41/86yRj2yJKMpM43jPB90T91/img.jpg?width=800&amp;amp;height=329&amp;amp;face=0_0_800_329,https://scrap.kakaocdn.net/dn/bjbU0M/hyIZYRkWAm/3QhkPd5kGB3rUm9sKbehdk/img.png?width=972&amp;amp;height=565&amp;amp;face=0_0_972_565');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Goroutines vs Threads&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Google이 Go 언어를 만들어낸 이후 많은 시스템 관리용 유틸리티, 서버가 Go로 짜여지기 시작했고 매 업데이트마다 엄청난 성능 향상과 발전으로 이제 어디서든 Go 언어로 짜여진 프로그램을 쉽게&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;tech.ssut.me&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming</category>
      <category>concurrency</category>
      <category>CSP</category>
      <category>go</category>
      <category>golang</category>
      <category>goroutine</category>
      <category>고루틴</category>
      <category>고언어</category>
      <category>동시성</category>
      <category>코루틴</category>
      <author>MAIN</author>
      <guid isPermaLink="true">https://mainfunction.tistory.com/57</guid>
      <comments>https://mainfunction.tistory.com/entry/GoGolang-%EA%B3%A0%EB%A3%A8%ED%8B%B4goroutine-Deep-Dive#entry57comment</comments>
      <pubDate>Wed, 13 Jan 2021 20:30:49 +0900</pubDate>
    </item>
    <item>
      <title>[Go/Golang] 1. 동시성(Concurrency)</title>
      <link>https://mainfunction.tistory.com/entry/GoGolang-%EB%8F%99%EC%8B%9C%EC%84%B1Concurrency-1</link>
      <description>&lt;p&gt;Go언어를 통해 동시성의 개념과 Go의 동시성 관점에서의 장점을 알아보려고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;동시성 소개를 시작으로 Go 언어에서 동시성을 다루는 방식과 고루틴의 상세한 소개 등을 시리즈 게시물로 다루려고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;많은 사람들이 '동시성(concurrency)'이란 단어를 들으면 '병렬성(parallelism)'으로 생각하는 경우가 많습니다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하지만 Concurrency != P&lt;span style=&quot;color: #333333;&quot;&gt;arallelism 입니다.&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 부분은 Go 언어의 창시자 중 한 분인 Rob Pike가 강연한 내용이 Go 블로그에 있으니 나중에 한번 참고해보시는 것도 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;vimeo&quot; data-video-url=&quot;https://vimeo.com/49718712&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/f3Ptn/hyIV2lpjrt/2qrki7Ujoheiwgjkz5nuNK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=720_132_852_276,https://scrap.kakaocdn.net/dn/iKs4W/hyIUL6FFze/PWfoWWpEUfCKieKBw5URs1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=720_132_852_276&quot; data-video-width=&quot;500&quot; data-video-height=&quot;281&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://player.vimeo.com/video/49718712&quot; width=&quot;500&quot; height=&quot;281&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;a href=&quot;https://blog.golang.org/waza-talk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog.golang.org/waza-talk&lt;/a&gt;, &lt;a href=&quot;https://vimeo.com/49718712&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;vimeo.com/49718712&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;동시성은 프로세스를 실행하는 독립적인 구성 / 병렬성은 관련있는 계산을 동시에 실행&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;동시성은 한 번에 여러 개의 것들을 다루는 것 / 병렬성은 한 번에 여러 일을 동시에 하는 것&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;concurrency is about structure / parallelism is about execution&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 구문들을 해석하면 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;동시성은 개발된 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;소스코드 자체의 속성&lt;/b&gt;&lt;/span&gt;이고, 병렬 처리는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실행 중인 프로그램의 속성(프로그램 실행의 형태)&lt;/b&gt;&lt;/span&gt;입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;다시 말해 우리는 병렬적인 코드를 작성하는 것이 아니라, 병렬로 실행되기를 바라면서 동시성 코드를 작성하는 것입니다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그렇기 때문에 일반적으로는 병렬성 보단 동시성이 맞습니다. (물론 병렬 처리를 위한 lib 등에선 이를 위한 특별한 처리들을 하고 있지만요.)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;병렬적으로 실행되길 바라지만 만약 환경이 싱글 코어, 싱글 프로세스라면? (극단적 가정)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&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; width=&quot;626&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Ni5R/btqTtqjVPKx/89Bh9iuMAgBvxhN57hULWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Ni5R/btqTtqjVPKx/89Bh9iuMAgBvxhN57hULWK/img.png&quot; data-alt=&quot;극단적인 가정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Ni5R/btqTtqjVPKx/89Bh9iuMAgBvxhN57hULWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Ni5R%2FbtqTtqjVPKx%2F89Bh9iuMAgBvxhN57hULWK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;626&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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;극단적인 가정&lt;/figcaption&gt;
&lt;/figure&gt;
&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;정리하면,&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;우리는 병렬적인 코드는 작성하는 것이 아니라, 병렬로 실행되기를 바라면서 동시성 코드를 작성하는 것입니다.&lt;/li&gt;
&lt;li&gt;동시성 코드가 실제로 병렬로 실행되는지 여부를 모를 수도 있습니다.&lt;/li&gt;
&lt;li&gt;병렬 처리인지 아닌지는 시간 또는 Context에 의해 결정됩니다.&amp;nbsp;&lt;br /&gt;(Context란? 어떤 연산을 원자적이라고 판단할 수 있는 범위를 Context라고 정의)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;동시성을 어렵게 하는 것들&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- Race Condition&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Race condition은 둘 이상의 작업이 올바른 순서로 실행되어야 하지만 코드가 그렇게 작성되지 않아서 이 순서가 보장되지 않을 떄 발생합니다. 대부분 변수를 읽거나 쓰려고 할 때 발생하는 &lt;b&gt;Data Race&lt;/b&gt; 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1610470151548&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var data int
go func() {
    data++
}()
if data == 0 {
    fmt.Printf(&quot;%v&quot;, data)
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;아무것도 출력되지 않을 때 : 고루틴에서 data++을 이미 실행&lt;/li&gt;
&lt;li&gt;0이 출력될 때 : 고루틴 보다 data의 값 체크 및 프린트가 먼저 실행&lt;/li&gt;
&lt;li&gt;1이 출력될 때 : data == 0으로 체크했지만 프린트가 되기 전 고루틴에서 data++을 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1610470728399&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var data int
go func() {
    data++
}()
time.Sleep(1 * time.Second) // 추가
if data == 0 {
    fmt.Printf(&quot;%v&quot;, data)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;중간에 인위적으로 텀을 두어서 코드를 작성한다면? =&amp;gt; data race의 가능성만 약간 낮출 뿐 올바르지 않습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- Atomicity&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;동작하는 컨텍스트(정의된 범위) 내에서 분기가 되거나 중단되지 않는 성질. 하지만 어떤 컨텍스트에서는 원자적인 것이 다른 컨텍스트에서는 아닐 수 있습니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1610470972065&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;i++
// i의 값을 가져온다
// i의 값을 증가시킨다
// i의 값을 저장한다&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;예를 들어 특정 프로세스의 컨텍스트 내에서 원자적이었지만 OS의 컨텍스트에서는 그렇지 않은 경우입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 메모리 접근&amp;nbsp; 동기화&lt;/h4&gt;
&lt;p&gt;다수의 프로세스가 동일한 메모리 영역에 접근하려는 경우, 메모리 접근 동기화 또한 동시성을 어렵게 만드는 원인 중 하나입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610535575547&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var data int
go func() {
    data++ // critical section1
}() 
if data == 0 { // critical section2
    fmt.Println(&quot;the value is 0&quot;)
} else {
    fmt.Printf(&quot;the value is %v&quot;, data) // critical section3
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드는 완전히 비결정적인 코드입니다. 크리티컬 섹션이 3개로 나눠집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;data 변수를 증가시키는 고루틴&lt;/li&gt;
&lt;li&gt;data 값이 0인지 확인하는 if 구문&lt;/li&gt;
&lt;li&gt;출력하기 위해 data의 값을 가져오는 Printf 구문&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Deadlock&lt;/h4&gt;
&lt;p&gt;교착 상태. 동시에 실행 중인 서로 다른 프로세스가 서로 상대방의 작업이 끝나기 기다리는 현상입니다. &lt;a href=&quot;https://namu.wiki/w/%EB%8D%B0%EB%93%9C%EB%9D%BD?from=Deadlock&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;나무위키&lt;/a&gt;에도 나온 아래 시가 잘 표현해준다고 생각합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;먼 길&lt;br /&gt;&lt;br /&gt;아기가 잠드는 걸&lt;br /&gt;보고 가려고&lt;br /&gt;아빠는 머리맡에&lt;br /&gt;앉아 계시고.&lt;br /&gt;아빠가 가시는 걸&lt;br /&gt;보고 자려고&lt;br /&gt;아기는 말똥말똥&lt;br /&gt;잠을 안 자고.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://namu.wiki/w/%EC%9C%A4%EC%84%9D%EC%A4%91&quot;&gt;윤석중&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;아래 조건일 때 발생합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상호 배제(Mutual exclusion)&lt;/li&gt;
&lt;li&gt;점유대기(Hold and wait)&lt;/li&gt;
&lt;li&gt;비선점(No preemption)&lt;/li&gt;
&lt;li&gt;순환대기(Circular wait)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Livelock&lt;/h4&gt;
&lt;p&gt;서로 다른 프로세스가 잠금과 해제를 무한 반복하는 상태입니다. 즉, 무언가 연산을 일어나고 있지만 생산적이거나 개발자가 의도하는 결과에는 도달하지 못하는 상태이죠.&lt;/p&gt;
&lt;p&gt;예를 들어 좁은 골목에서 다른 사람을 만나 서로 비켜주면서 양보해주는 상황인거죠. 아래 과정이 무한 반복으로 일어나는 상황입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상대방에게 양보하기 위해 왼쪽으로 이동 - 상대도 같은 방향으로 이동&lt;/li&gt;
&lt;li&gt;이를 보고 다시 오른쪽으로 이동 - 상대도 같은 방향으로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Starvation&lt;/h4&gt;
&lt;p&gt;말그대로 프로세스가 필요한 자원을 가져오지 못하는 상황입니다. 기아 상태는 보통 스케줄링이나 상호 배제 알고리즘의 오류로 인해 생기는 경우도 있지만 자원 누수로 인해 발생할 수도 있습니다.&lt;/p&gt;
&lt;p&gt;욕심쟁이 작업자와 양보하는 작업자를 구현한 아래 코드로 기아 상태를 일부 재현할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610536811376&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package main

import (
	&quot;fmt&quot;
	&quot;sync&quot;
	&quot;time&quot;
)

var wg sync.WaitGroup
var sharedLock sync.Mutex

const runtime = 1 * time.Second

func main() {
	greedyWorker := func() {
		defer wg.Done()

		var count int
		for begin := time.Now(); time.Since(begin) &amp;lt;= runtime; {
			sharedLock.Lock()
			time.Sleep(4 * time.Nanosecond)
			sharedLock.Unlock()


			count++
		}
		fmt.Printf(&quot;Greedy worker was able to execute %v work loops\n&quot;, count)
	}


	politeWorker := func() {
		defer wg.Done()

		var count int
		for begin := time.Now(); time.Since(begin) &amp;lt;= runtime; {
			sharedLock.Lock()
			time.Sleep(1 * time.Nanosecond)
			sharedLock.Unlock()

			sharedLock.Lock()
			time.Sleep(1 * time.Nanosecond)
			sharedLock.Unlock()

			sharedLock.Lock()
			time.Sleep(1 * time.Nanosecond)
			sharedLock.Unlock()

			sharedLock.Lock()
			time.Sleep(1 * time.Nanosecond)
			sharedLock.Unlock()

			count++
		}
		fmt.Printf(&quot;Polite worker was able to execute %v work loogs\n&quot;, count)
	}

	wg.Add(2)

	go politeWorker()
	go greedyWorker()

	wg.Wait()

}

// Greedy worker was able to execute 705115 work loops
// Polite worker was able to execute 362920 work loogs&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;크리티컬 섹션이 끝났음에도 불구하고 불필요하게 lock을 걸어서 기아 상태를 유발시키고 있습니다. 실제 코드에서는 무엇이 좋다 나쁘다를 판단하기엔 힘들 수도 있습니다. 따라서 상황에 알맞게 선택해야 할 것 같습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;성능을 위해 큰 범위를 동기화할지&amp;nbsp; &amp;nbsp;VS&amp;nbsp; &amp;nbsp;공정성을 위해 세분화된 범위를 동기화할지&lt;/blockquote&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;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/@k.wahome/concurrency-is-not-parallelism-a5451d1cde8d&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;medium.com/@k.wahome/concurrency-is-not-parallelism-a5451d1cde8d&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1610471326864&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Concurrency is not Parallelism&quot; data-og-description=&quot;&amp;ldquo;Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.&amp;rdquo; &amp;mdash; Rob Pike&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@k.wahome/concurrency-is-not-parallelism-a5451d1cde8d&quot; data-og-url=&quot;https://medium.com/@k.wahome/concurrency-is-not-parallelism-a5451d1cde8d&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cuTC7b/hyIVX5sWde/QPWeebFbkJ2tqeNMlhutz0/img.jpg?width=1170&amp;amp;height=766&amp;amp;face=0_0_1170_766,https://scrap.kakaocdn.net/dn/blsToB/hyIUxtM62j/Glyc1YCO6A3HHT9RSC21eK/img.png?width=60&amp;amp;height=31&amp;amp;face=0_0_60_31,https://scrap.kakaocdn.net/dn/Q4nL6/hyIVX5sWcQ/dXAXpXNjqsPkTO39Gl54C1/img.jpg?width=60&amp;amp;height=39&amp;amp;face=0_0_60_39&quot;&gt;&lt;a href=&quot;https://medium.com/@k.wahome/concurrency-is-not-parallelism-a5451d1cde8d&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@k.wahome/concurrency-is-not-parallelism-a5451d1cde8d&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cuTC7b/hyIVX5sWde/QPWeebFbkJ2tqeNMlhutz0/img.jpg?width=1170&amp;amp;height=766&amp;amp;face=0_0_1170_766,https://scrap.kakaocdn.net/dn/blsToB/hyIUxtM62j/Glyc1YCO6A3HHT9RSC21eK/img.png?width=60&amp;amp;height=31&amp;amp;face=0_0_60_31,https://scrap.kakaocdn.net/dn/Q4nL6/hyIVX5sWcQ/dXAXpXNjqsPkTO39Gl54C1/img.jpg?width=60&amp;amp;height=39&amp;amp;face=0_0_60_39');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Concurrency is not Parallelism&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;ldquo;Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.&amp;rdquo; &amp;mdash; Rob Pike&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/74820845&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/74820845&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1610471352126&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;Go 동시성 프로그래밍&quot; data-og-description=&quot;고성능의 멀티 코어 CPU, 클라우드 기반의 비동기 서비스 등 최근 트렌드를 고려하면 프로그램을 작성할 때 동시성을 고려하는 것은 필수 과정이다. 이 책에서는 Go 언어의 동시성 모델과 이론적 &quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/74820845&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/74820845&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bU8XZM/hyIVSQCsLz/5XW8oq7kdPjQINGowZdbj1/img.jpg?width=320&amp;amp;height=400&amp;amp;face=0_0_320_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/74820845&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/74820845&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bU8XZM/hyIVSQCsLz/5XW8oq7kdPjQINGowZdbj1/img.jpg?width=320&amp;amp;height=400&amp;amp;face=0_0_320_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Go 동시성 프로그래밍&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;고성능의 멀티 코어 CPU, 클라우드 기반의 비동기 서비스 등 최근 트렌드를 고려하면 프로그램을 작성할 때 동시성을 고려하는 것은 필수 과정이다. 이 책에서는 Go 언어의 동시성 모델과 이론적&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.golang.org/waza-talk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog.golang.org/waza-talk&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1610471445208&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Concurrency is not parallelism - The Go Blog&quot; data-og-description=&quot;Andrew Gerrand 16 January 2013 If there's one thing most people know about Go, is that it is designed for concurrency. No introduction to Go is complete without a demonstration of its goroutines and channels. But when people hear the word concurrency they &quot; data-og-host=&quot;blog.golang.org&quot; data-og-source-url=&quot;https://blog.golang.org/waza-talk&quot; data-og-url=&quot;https://blog.golang.org/waza-talk&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://blog.golang.org/waza-talk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.golang.org/waza-talk&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;&gt;Concurrency is not parallelism - The Go Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Andrew Gerrand 16 January 2013 If there's one thing most people know about Go, is that it is designed for concurrency. No introduction to Go is complete without a demonstration of its goroutines and channels. But when people hear the word concurrency they&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;blog.golang.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming</category>
      <category>concurrency</category>
      <category>go</category>
      <category>golang</category>
      <category>goroutine</category>
      <category>Go언어</category>
      <category>parallelism</category>
      <category>동시성</category>
      <category>병렬성</category>
      <author>MAIN</author>
      <guid isPermaLink="true">https://mainfunction.tistory.com/56</guid>
      <comments>https://mainfunction.tistory.com/entry/GoGolang-%EB%8F%99%EC%8B%9C%EC%84%B1Concurrency-1#entry56comment</comments>
      <pubDate>Wed, 13 Jan 2021 02:11:52 +0900</pubDate>
    </item>
    <item>
      <title>Go 언어(golang)의 특징</title>
      <link>https://mainfunction.tistory.com/entry/Go-%EC%96%B8%EC%96%B4golang%EC%9D%98-%ED%8A%B9%EC%A7%95</link>
      <description>&lt;h1&gt;Go언어(Golang)&lt;/h1&gt;
&lt;p&gt;Go언어를 단순하게 표현하면 아래와 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simplicity&lt;/li&gt;
&lt;li&gt;Pragmatism&lt;/li&gt;
&lt;li&gt;Concurrency&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Compile Language&lt;/li&gt;
&lt;li&gt;Cross Platform&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not the feature of Go&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No classes&lt;/li&gt;
&lt;li&gt;No inheritance&lt;/li&gt;
&lt;li&gt;No constructors&lt;/li&gt;
&lt;li&gt;No final&lt;/li&gt;
&lt;li&gt;No exceptions&lt;/li&gt;
&lt;li&gt;No annotations&lt;/li&gt;
&lt;li&gt;No user-defined generics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Go언어는 2009년에 구글이 만든 프로그래밍 언어다. Go언어는 데니스 리치와 함께 유닉스와 C언어를 개발한 켄 톰슨 외 컴퓨터 과학계에서 저명한 롭 파이크, 로버트 그리즈머에 의해 설계 및 개발되었다. &amp;quot;40년 동안의 프로그래밍 언어에 대한 연구를 던져버린 유일한 언어&amp;quot;라는 평가를 받고 있다.&lt;/p&gt;
&lt;p&gt;Go라는 이름으로 검색하기 힘들다면 golang(go language) 또는 외국에서 많이 부르는 gopher라고 검색하면 편하다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;빠른 개발속도&lt;/li&gt;
&lt;li&gt;모듈화를 위한 의존성&lt;/li&gt;
&lt;li&gt;정적타입이지만 동적타입 언어의 속성도 가진 언어&lt;/li&gt;
&lt;li&gt;Garbage Collection with no VM&lt;/li&gt;
&lt;li&gt;쉬운 병렬처리&lt;/li&gt;
&lt;li&gt;빠른 컴파일 속도&lt;/li&gt;
&lt;li&gt;소스코드 UTF-8&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Simplicity&lt;/h3&gt;
&lt;p&gt;프로그래밍 언어에서는 기본적으로 사용되는 &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;switch&lt;/code&gt; 등과 같은 키워드들이 정의되어 있다. Go언어는 25개의 키워드만으로 프로그래밍이 가능하며, 이는 자바의 절반에 해당하는 수준이다. 무조건 키워드가 적다고 간단하고 배우기 쉬운 언어는 아니지만 일단 키워드가 적으면 문법 익히는 것이 빨라지며 복잡도가 떨어질 수 있다.&lt;/p&gt;
&lt;p&gt;또한 가비지 컬렉터가 있어 C와 C++과 달리 메모리 관리를 신경쓰지 않아도 된다. 메모리를 직접 할당하고 해제하는 작업이 없음에도 C와 C++처럼 포인터가 존재한다. 이 부분도 Go언어의 흥미로운 점 중 하나이다.&lt;/p&gt;
&lt;h3&gt;클라우드와 친한 언어&lt;/h3&gt;
&lt;p&gt;단순함과 병렬성 등의 특징으로 인해 클라우드 환경, 그리고 최근 주목받고 있는 마이크로 서비스 아키텍처에 적절한 프로그래밍 언어로 평가받고 있다.&lt;/p&gt;
&lt;h3&gt;컴파일 언어&lt;/h3&gt;
&lt;p&gt;컴파일 언어지만 컴파일러의 컴파일 속도가 매우 빨라서 인터프리터 언어처럼 사용할 수 있다. 예를 들어 특정 코드를 짜놓고 &lt;code&gt;go run&lt;/code&gt;으로 돌리면 마치 파이썬을 사용하는 것처럼 빠르고 간편하게 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;자바나 C#처럼 특정 환경에서만 돌아가는 바이트코드를 생성하는 방식이 아닌 C, C++처럼 완전한 네이티브 바이너리 실행파일을 만들어 낸다. 따라서 가상머신도 필요 없어서 실행환경이 간단하며, 실행파일 내에 라이브러리를 포함하여 배포가 쉽다.&lt;/p&gt;
&lt;p&gt;단, 바이너리 컴파일러이기 때문에 서로 다른 플랫폼을 타겟으로 배포해야 할 경우 환경변수인 GOOS와 GOARCH 등을 재설정한 후 컴파일해서 여러 개의 배포한을 만들어야 한다.&lt;/p&gt;
&lt;h3&gt;Goroutine&lt;/h3&gt;
&lt;p&gt;Go는 Goroutine이라는 언어 차원에서 동시성과 병렬성을 지원한다. Goroutine은 멀티쓰레드 매커니즘의 경량 쓰레드 방식이며 자체적인 스케줄러에 의해 관리되기 때문에 OS에서 관리하는 쓰레드보다 더 가볍고 높은 성능을 보장한다. 자바의 쓰레드의 경우 1MB의 메모리가 필요하지만 go는 2KB의 스택 공간만 필요하다. Context switching 비용 또한 고루틴이 더 적다. 쓰레드는 blocking될 경우 다른 쓰레드가 그 자리를 스케줄링한다. 이렇게 바뀌는 과정에서 모든 레지스터들을 저장 및 복구해야 한다. 쓰레드는 16개의 범용 레지스터, PC, SP, segment 레지스터, 16개의 XMM 레지스터 등 많은 것들을 저장 및 복구해야 하지만 Goroutine은 3개의 레지스터(PC, SP, DX)만 저장 및 복구하면 된다.&lt;/p&gt;
&lt;p&gt;Goroutine은 일급 객체(First Class)로 정수나 실수와 같은 데이터 타입과 동급으로 취급된다.&lt;/p&gt;
&lt;p&gt;비동기 메커니즘을 제공한다. Go의 병행 처리 방식은 Communicating Sequential Processes(CSP) 방식에 근간을 두고 있어서 메모리를 공유하는 것이 아니라 메시지를 전달하는 방식으로 동기화가 된다. 각각의 고루틴은 병렬로 동작하며 메시지 채널을 통해 값을 주고 받는다. 고루틴을 사용하면 이벤트 처리, 병렬 프로그래밍 등이 훨씬 간단해진다. 단, 병렬화된 고루틴의 동기화 문제는 프로그래머가 다뤄야 하며 동기화를 무시할 경우 프로그램이 비정상 종료될 수도 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;goroutine은 OS 쓰레드보다 훨씬 가볍게 비동기 concurrent 처리를 구현하기 위해 만든 것으로, 기본적으로 Go 런타임이 자체 관리한다. Go 런타임 상에서 관리되는 작업단위인 여러 goroutine들은 종종 하나의 OS쓰레드 1개로도 실행되곤 한다. 즉, goroutine들은 OS쓰레드와 1:1 대응되지 않고, multiplexing으로 훨씬 적은 OS쓰레드를 사용한다. 메모리 측면에서도 OS쓰레드가 1메가바이트의 스택을 갖는 반면, goroutine은 이보다 훨씬 작은 몇 킬로바이트의 스택을 갖는다. 필요시 동적으로 증가할 수도 있다.&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;가비지 컬렉터&lt;/h3&gt;
&lt;p&gt;자바와 같이 주로 가상머신 위에서 실행되는 언어들은 별도의 플랫폼 위에서 인스턴스의 할당 및 해제 작업을 해줌으로써 메모리를 관리하는 가비지 컬렉터가 존재한다. Go도 역시 가비지 컬렉터가 있지만 실행파일 내에 내장되어 있어 별도의 가상머신이나 플랫폼이 필요하지 않다.&lt;/p&gt;
&lt;h3&gt;패키지&lt;/h3&gt;
&lt;p&gt;Go는 언어 자체적으로 python의 pip나 java의 maven와 같은 온라인 상의 패키지나 의존성을 관리해주는 기능이 내장되어 있다. 소스코드 내에서 &lt;code&gt;import&lt;/code&gt; 키워드를 통해 github와 같은 인터넷 저장소의 주소를 지정해서 가져올 수 있다.&lt;/p&gt;
&lt;h3&gt;참고자료 및 요약&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Go언어는 병렬 프로그래밍과 네트워크 프로그래밍에 특화되어 있다.&lt;/li&gt;
&lt;li&gt;Go는 C언어가 진화된 것으로 C++과는 다르다.&lt;/li&gt;
&lt;li&gt;고루틴은 stateless에서는 아주 좋지만 statefull에서는 한계가 있다.&lt;/li&gt;
&lt;li&gt;대규모 분산 게임 서버에는 Front Server(클라이언트와 서버 간의 패킷 전달)는 stateless에 가깝고, 컨텐츠 로직이 없으므로 Go언어를 사용하면 아주 좋다.&lt;/li&gt;
&lt;li&gt;메모리 자동 관리&lt;ul&gt;
&lt;li&gt;VM이 아니다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;네트워크 프로그래밍&lt;/li&gt;
&lt;li&gt;병렬 프로그래밍&lt;/li&gt;
&lt;li&gt;goroutine&lt;/li&gt;
&lt;li&gt;크로스 플랫폼 개발이 쉽다&lt;/li&gt;
&lt;li&gt;네트워크에서 IOCP 지원&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Programming</category>
      <category>go</category>
      <category>golang</category>
      <category>gopher</category>
      <category>goroutine</category>
      <category>Go언어</category>
      <category>고루틴</category>
      <author>MAIN</author>
      <guid isPermaLink="true">https://mainfunction.tistory.com/55</guid>
      <comments>https://mainfunction.tistory.com/entry/Go-%EC%96%B8%EC%96%B4golang%EC%9D%98-%ED%8A%B9%EC%A7%95#entry55comment</comments>
      <pubDate>Sat, 9 Jan 2021 17:12:09 +0900</pubDate>
    </item>
    <item>
      <title>kubernetes 관리 툴(lens, etc)</title>
      <link>https://mainfunction.tistory.com/entry/kubernetes-%EA%B4%80%EB%A6%AC-%ED%88%B4lens-etc</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;k8s를 사용하면서 단순히 &lt;i&gt;kubectl&lt;/i&gt; 명령어로만 관리하기엔 귀찮거나 한계가 있을 때가 있습니다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;생산성을 높일 수 있는 툴 하나와 kubectl 관련 플러그인들을 잘 소개한 깃헙 페이지를 소개합니다.&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;Lens&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://k8slens.dev/&quot; target=&quot;_blank&quot;&gt;k8slens.dev/&lt;/a&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/TAFyK/btqR9nwT9aM/9pf3k1JJKnR9VoN9f4ovrk/img.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;896&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TAFyK/btqR9nwT9aM/9pf3k1JJKnR9VoN9f4ovrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TAFyK/btqR9nwT9aM/9pf3k1JJKnR9VoN9f4ovrk/img.png&quot; data-alt=&quot;cluster 등록하고 메인 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TAFyK/btqR9nwT9aM/9pf3k1JJKnR9VoN9f4ovrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTAFyK%2FbtqR9nwT9aM%2F9pf3k1JJKnR9VoN9f4ovrk%2Fimg.png&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/TAFyK/btqR9nwT9aM/9pf3k1JJKnR9VoN9f4ovrk/img.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;896&quot; data-ke-mobilestyle=&quot;widthContent&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;cluster 등록하고 메인 화면&lt;/figcaption&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;왼쪽 버티컬 바에 표시된 아이콘들이 각각 k8s 클러스터입니다.(kubectl config current-context 시 나오는 클러스터) 여러 클러스터를 관리할 때도 편리하고 cli로 다뤄야 하는 여러 기능들이 UI로 제공되서 편리한 편입니다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;최근 k8s 관리 툴들이 많이 나오고 있어서 이와 비슷한 포맷의 툴이 꽤 많지만 가볍고 편하게 사용하기에 좋은 것 같습니다. 각 탭별로 아래와 같은 기능들이 제공됩니다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;Workloads&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;Pod&lt;/li&gt;&lt;li&gt;Deployments&lt;/li&gt;&lt;li&gt;Daemonsets&lt;/li&gt;&lt;li&gt;StatefulSets&lt;/li&gt;&lt;li&gt;Jobs&lt;/li&gt;&lt;li&gt;CronJobs&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Configuration&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;ConfigMaps&lt;/li&gt;&lt;li&gt;Secrets&lt;/li&gt;&lt;li&gt;Resource Quotas&lt;/li&gt;&lt;li&gt;HPA&lt;/li&gt;&lt;li&gt;Pod Disruption Budgets&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Network&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;Services&lt;/li&gt;&lt;li&gt;Endpoints&lt;/li&gt;&lt;li&gt;Ingresses&lt;/li&gt;&lt;li&gt;Network Policies&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Pod 같은 경우 기본적으로 k8s에서 수집하는 메트릭 정보가 시각화되고, 무엇보다 편리한 기능은 pod shell 기능과 log 기능입니다.&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/wwX7G/btqSgLKsa4m/kC21VQUsnVcOopJyVXveRK/img.png&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;556&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wwX7G/btqSgLKsa4m/kC21VQUsnVcOopJyVXveRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wwX7G/btqSgLKsa4m/kC21VQUsnVcOopJyVXveRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wwX7G/btqSgLKsa4m/kC21VQUsnVcOopJyVXveRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwwX7G%2FbtqSgLKsa4m%2FkC21VQUsnVcOopJyVXveRK%2Fimg.png&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/wwX7G/btqSgLKsa4m/kC21VQUsnVcOopJyVXveRK/img.png&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;556&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 51);&quot;&gt;pod shell 기능은 kubectl exec 명령으로 pod에 붙어서 명령어를 치거나 특정 명령어를 실행시키는 기능을 손쉽게 할 수 있습니다. 위의 사진처럼 바로 터미널이 열려서 디버깅하기 편하고 테스트 및 공부하기에도 좋습니다.&lt;/span&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이 기능 외에도 kubectl logs -f 명령어처럼 파드의 로그를 실시간으로 볼 수 있는 기능도 UI 형태로 제공됩니다. 이는 Datadog에서 제공되는 pod 로깅 및 모니터링 기능과 매우 유사합니다. 물론 Datadog 처럼 상세한 쿼리나 검색 등은 제공되지 않지만 로그 자체를 파일로 다운받을 수 있기 때문에 로컬 에디터로 불편하게나마 로그 검색 및 처리 등이 가능합니다.&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;figure class=&quot;imageblock alignCenter&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/OPep4/btqR3RrMheI/Dv3QvkhzR8z8epgukbzFJk/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OPep4/btqR3RrMheI/Dv3QvkhzR8z8epgukbzFJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OPep4/btqR3RrMheI/Dv3QvkhzR8z8epgukbzFJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OPep4/btqR3RrMheI/Dv3QvkhzR8z8epgukbzFJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOPep4%2FbtqR3RrMheI%2FDv3QvkhzR8z8epgukbzFJk%2Fimg.png&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/OPep4/btqR3RrMheI/Dv3QvkhzR8z8epgukbzFJk/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Network-Services 탭에서는 kubectl port-forward 명령어를 클릭 한번으로 대체할 수 있습니다. 서비스로 노출한 포트가 뜨고 그걸 클릭하면 포트 포워딩된 채로 브라우저로 페이지가 뜨게 됩니다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;커스텀 리소스인 CRD가 잘 안뜨는 것 같지만 Datadog 같은 상용 서비스를 제외하곤 아주 편리한 툴이라고 생각합니다. 혹시나 이보다 더 좋은 툴이 있다면 댓글 부탁드립니다 :)&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;kubectl plugins&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;아래 깃헙 페이지는 여러 awesome 시리즈 중에 쿠버네티스 명령어 플러그인 버전입니다. 아직은 써본게 거의 없다보니 추천하기엔 이르고 실무에서 하나씩 도입해보려고 합니다. 쓸만한 플러그인이 있다면 그것 또한 블로그감이니... ㅎㅎ (다음 기회에...)&lt;br&gt;&lt;br&gt;&lt;a href=&quot;https://github.com/ishantanu/awesome-kubectl-plugins&quot;&gt;github.com/ishantanu/awesome-kubectl-plugins&lt;/a&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;ishantanu/awesome-kubectl-plugins&quot; data-og-description=&quot;Curated list of kubectl plugins. Contribute to ishantanu/awesome-kubectl-plugins development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ishantanu/awesome-kubectl-plugins&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UYtVF/hyIMocMOFS/vMXiOjuGCo8bcK3QkmE4gk/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot; data-og-url=&quot;https://github.com/ishantanu/awesome-kubectl-plugins&quot;&gt;&lt;a href=&quot;https://github.com/ishantanu/awesome-kubectl-plugins&quot; target=&quot;_blank&quot; data-source-url=&quot;https://github.com/ishantanu/awesome-kubectl-plugins&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image:url(https://scrap.kakaocdn.net/dn/UYtVF/hyIMocMOFS/vMXiOjuGCo8bcK3QkmE4gk/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300)&quot;&gt;&lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;ishantanu/awesome-kubectl-plugins&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;Curated list of kubectl plugins. Contribute to ishantanu/awesome-kubectl-plugins development by creating an account on GitHub.&lt;/p&gt;&lt;p class=&quot;og-host&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;h2 data-ke-size=&quot;size26&quot;&gt;kui&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl 명령어와 약간의 UI를 합친 툴인데 앞서 소개한 lens가 있어서 잘 사용하지 않게 되더라고요. 뭔가 요구사항에 맞춰서 사용하시면 될 것 같습니다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kui.tools/&quot; target=&quot;_blank&quot;&gt;kui.tools/&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Kui&quot; data-og-description=&quot;Kui is an open-source, graphical terminal designed for developers.&quot; data-og-host=&quot;kui.tools&quot; data-og-source-url=&quot;https://kui.tools/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Pn7M1/hyIOj1YYzS/ZassJA55HeHdu74XFPKOdK/img.png?width=1487&amp;amp;height=933&amp;amp;face=0_0_1487_933&quot; data-og-url=&quot;https://kui.tools/&quot;&gt;&lt;a href=&quot;https://kui.tools/&quot; target=&quot;_blank&quot; data-source-url=&quot;https://kui.tools/&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image:url(https://scrap.kakaocdn.net/dn/Pn7M1/hyIOj1YYzS/ZassJA55HeHdu74XFPKOdK/img.png?width=1487&amp;amp;height=933&amp;amp;face=0_0_1487_933)&quot;&gt;&lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;Kui&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;Kui is an open-source, graphical terminal designed for developers.&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;kui.tools&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>Cloud</category>
      <category>k8s</category>
      <category>kubectl</category>
      <category>kubernetes</category>
      <category>Lens</category>
      <category>쿠버네티스</category>
      <author>MAIN</author>
      <guid isPermaLink="true">https://mainfunction.tistory.com/54</guid>
      <comments>https://mainfunction.tistory.com/entry/kubernetes-%EA%B4%80%EB%A6%AC-%ED%88%B4lens-etc#entry54comment</comments>
      <pubDate>Sun, 3 Jan 2021 00:16:12 +0900</pubDate>
    </item>
    <item>
      <title>Programmable Network</title>
      <link>https://mainfunction.tistory.com/entry/Programmable-Network</link>
      <description>&lt;div style=&quot;font-family: 'Lucida Grande', 'Segoe UI', 'Apple SD Gothic Neo', 'Malgun Gothic', 'Lucida Sans Unicode', Helvetica, Arial, sans-serif; font-size: 0.9em; overflow-x: hidden; overflow-y: auto; margin: 0px !important; padding: 5px 20px 26px !important; background-color: rgb(255, 255, 255);font-family: 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; padding: 20px;padding: 20px; color: rgb(34, 34, 34); font-size: 15px; font-family: 'Roboto Condensed', Tauri, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; line-height: 1.6; -webkit-font-smoothing: antialiased; background: rgb(255, 255, 255);&quot;&gt;&lt;h1 id=&quot;programmable-network&quot; style=&quot;clear: both;font-size: 2.2em; font-weight: bold; margin: 1.5em 0px 1em;margin-top: 0px;&quot;&gt;&lt;a name=&quot;programmable-network&quot; href=&quot;#programmable-network&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;Programmable Network&lt;/h1&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;Programmable network란 네트워크 장치의 행동과 흐름제어를 하드웨어와 상관없이 소프트웨어만으로 다룰 수 있는 네트워크이다. 즉, 말 그대로 프로그래머블, 프로그래밍이 가능한 네트워크인 것이다. 이런 방식을 적용하게 되면 다양한 서비스의 신속한 도입이 가능하게 되어 네트워크의 유연성, 민첩성, 확장성이 증가하게 된다.&lt;/p&gt;&lt;ul&gt;
&lt;li style=&quot;display: list-item; line-height: 1.4em;&quot;&gt;Re-programming infrastructure&lt;/li&gt;&lt;li style=&quot;display: list-item; line-height: 1.4em;&quot;&gt;Hardware independency&lt;/li&gt;&lt;li style=&quot;display: list-item; line-height: 1.4em;&quot;&gt;Advanced orchestration&lt;/li&gt;&lt;li style=&quot;display: list-item; line-height: 1.4em;&quot;&gt;Enhanced transparency&lt;/li&gt;&lt;li style=&quot;display: list-item; line-height: 1.4em;&quot;&gt;Enhanced network control&lt;/li&gt;&lt;li style=&quot;display: list-item; line-height: 1.4em;&quot;&gt;Operational flexibility&lt;/li&gt;&lt;li style=&quot;display: list-item; line-height: 1.4em;&quot;&gt;Allocation of network resource&lt;/li&gt;&lt;li style=&quot;display: list-item; line-height: 1.4em;&quot;&gt;Centralized control&lt;/li&gt;&lt;li style=&quot;display: list-item; line-height: 1.4em;&quot;&gt;Development benefits&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
      <category>Cloud</category>
      <category>programmable network</category>
      <category>SDN</category>
      <category>프로그래머블</category>
      <category>프로그래머블 네트워크</category>
      <author>MAIN</author>
      <guid isPermaLink="true">https://mainfunction.tistory.com/52</guid>
      <comments>https://mainfunction.tistory.com/entry/Programmable-Network#entry52comment</comments>
      <pubDate>Tue, 30 Jun 2015 11:30:09 +0900</pubDate>
    </item>
    <item>
      <title>[논어 경영학]잘못을 깨달았을 때는 고치기를 꺼리지 말라</title>
      <link>https://mainfunction.tistory.com/entry/%EB%85%BC%EC%96%B4-%EA%B2%BD%EC%98%81%ED%95%99%EC%9E%98%EB%AA%BB%EC%9D%84-%EA%B9%A8%EB%8B%AC%EC%95%98%EC%9D%84-%EB%95%8C%EB%8A%94-%EA%B3%A0%EC%B9%98%EA%B8%B0%EB%A5%BC-%EA%BA%BC%EB%A6%AC%EC%A7%80-%EB%A7%90%EB%9D%BC</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;div class=&quot;txc-info hreview&quot; id=&quot;txc_book_detail_KOR9788935207718&quot; point=&quot;7&quot; style=&quot;clear: both; font-size: 9pt; line-height: 1.5; margin: 0px; padding: 0px; width: 530px; border: medium none; background: none 0px 0px repeat scroll transparent;&quot;&gt;&lt;hr style=&quot;margin:0 0 10px;*margin:-7px 0 3px 0; filter:alpha(opacity=10); opacity:0.1; background:none #333333; border:medium none; clear:both; display:block; height:1px; overflow:hidden; padding:0; width:530px;&quot;&gt;&lt;div style=&quot;float:left; margin:0 10px 10px 0; padding:0; position:relative;&quot;&gt;	&lt;a href=&quot;http://book.daum.net/detail/book.do?bookid=KOR9788935207718&quot; target=&quot;_blank&quot;&gt;		&lt;img class=&quot;photo&quot; width=&quot;72&quot; height=&quot;104&quot; src=&quot;http://t1.daumcdn.net/thumb/R72x100/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9788935207718&quot; border=&quot;0&quot; onerror=&quot;this.src='http://icon.daum-img.net/editor/db_img_book.gif?rv=1.0.1'&quot;&gt;	&lt;/a&gt;&lt;/div&gt;&lt;h3 style=&quot;font-size:1em;margin:0;padding:0;&quot;&gt;	&lt;a class=&quot;item fn url&quot; href=&quot;http://book.daum.net/detail/book.do?bookid=KOR9788935207718&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;  border:medium none; position:static;&quot;&gt;논어 경영학&lt;/a&gt;&lt;/h3&gt;&lt;dl class=&quot;book detail&quot; style=&quot;margin:5px 0  0 82px;&quot;&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;저자&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;&lt;a href=&quot;http://book.daum.net//search/bookSearch.do?advancedSearchYN=y&amp;amp;author=%EB%AF%BC%EA%B2%BD%EC%A1%B0&amp;amp;authorID=AU00551419&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none&quot;&gt;민경조&lt;/a&gt; 지음&lt;/dd&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;출판사&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;&lt;a href=&quot;http://book.daum.net/search/bookSearch.do?advancedSearchYN=y&amp;amp;publisher=%EC%B2%AD%EB%A6%BC%EC%B6%9C%ED%8C%90&amp;amp;publisherID=PU00378507&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none&quot;&gt;청림출판&lt;/a&gt; &lt;span style=&quot;font-size:1em; height:1%; zoom:1; filter:alpha(opacity=20); opacity:0.2;&quot;&gt;|&lt;/span&gt; 2009-01-20 출간&lt;/dd&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;카테고리&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;&lt;a href=&quot;http://book.daum.net/category/book.do?categoryID=KOR15&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none&quot;&gt;자기계발&lt;/a&gt;&lt;/dd&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;책소개&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;공자의 철학과 CEO의 경영술이 만나다말단 사원에서 대기업의 C...&lt;/dd&gt;&lt;/dl&gt;&lt;div style=&quot;margin:5px 5px 0 82px; padding:0;&quot;&gt;	&lt;a href=&quot;http://book.daum.net/detail/book.do?bookid=KOR9788935207718#tab_comp&quot; target=&quot;_blank&quot; style=&quot;float:right&quot;&gt;&lt;img width=&quot;62&quot; height=&quot;22&quot; src=&quot;http://deco.daum-img.net/contents/info/bt_info_compare.gif?rv=1.0.1&quot; border=&quot;0&quot; alt=&quot;가격비교&quot;&gt;&lt;/a&gt;	&lt;strong class=&quot;rating&quot; style=&quot;border-bottom-width:0;font-weight:bold;&quot; title=&quot;7&quot;&gt;글쓴이 평점&amp;nbsp;&amp;nbsp;&lt;span style=&quot;position:relative;top:1px;&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_y.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_y.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_y.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_h.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_g.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;hr style=&quot;margin:10px 0 0;*margin:3px 0 -7px 0;opacity:0.1;filter:alpha(opacity=10);line-height:0;font-size:0; background:none #333333; border:medium none; clear:both; display:block; height:1px; overflow:hidden; padding:0; width:530px;&quot;&gt;&lt;/div&gt;
&lt;script src=&quot;http://editor.daum.net/view/info/7.1/book.js&quot; charset=&quot;utf-8&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;script src=&quot;http://cia.daum.net/view/book/book/KOR9788935207718.js?callback=txCiaCallback&quot; charset=&quot;utf-8&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;!--DB_EMBEDDING_START--&gt;
&lt;TXDB name=&quot;책&quot; id=&quot;txd_book_detail_KOR9788935207718&quot;&gt;
	&lt;TXDBITEM title=&quot;논어 경영학&quot;&gt;&lt;/TXDBITEM&gt;
	&lt;TXDBITEM image=&quot;http://t1.daumcdn.net/thumb/R72x100/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9788935207718%3Fmoddttm=20141122085257&quot;&gt;&lt;/TXDBITEM&gt;
&lt;/TXDB&gt;
&lt;!--DB_EMBEDDING_END--&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;div style=&quot;font-family: 'Lucida Grande', 'Segoe UI', 'Apple SD Gothic Neo', 'Malgun Gothic', 'Lucida Sans Unicode', Helvetica, Arial, sans-serif; font-size: 0.9em; overflow-x: hidden; overflow-y: auto; margin: 0px !important; padding: 5px 20px 26px !important; background-color: rgb(255, 255, 255);font-family: 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; padding: 20px;padding: 20px; color: rgb(34, 34, 34); font-size: 15px; font-family: 'Roboto Condensed', Tauri, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; line-height: 1.6; -webkit-font-smoothing: antialiased; background: rgb(255, 255, 255);&quot;&gt;&lt;h1 id=&quot;잘못을-깨달았을-때는-고치기를-꺼리지-말라&quot; style=&quot;clear: both;font-size: 2.2em; font-weight: bold; margin: 1.5em 0px 1em;margin-top: 0px;&quot;&gt;&lt;a name=&quot;잘못을-깨달았을-때는-고치기를-꺼리지-말라&quot; href=&quot;#잘못을-깨달았을-때는-고치기를-꺼리지-말라&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;/h1&gt;&lt;h2 id=&quot;자기-자신에게는-두텁게-추궁하고,-남에게는-엷게-책임을-묻는다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;자기-자신에게는-두텁게-추궁하고,-남에게는-엷게-책임을-묻는다&quot; href=&quot;#자기-자신에게는-두텁게-추궁하고,-남에게는-엷게-책임을-묻는다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;자기 자신에게는 두텁게 추궁하고, 남에게는 엷게 책임을 묻는다&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“자기 자신에게는 두텁게 추궁하고 남에게는 엷게 그 책임을 묻는다면 원한을 멀리할 수 있을 것이다.”&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;대부분의 사람들이 자신의 잘못은 이런 저런 핑계를 대면서 합리화를 하고 쉽게 용서하지만 타인의 잘못에 대해서는 요목조목 따져가면서 지적한다. 이렇게 되면 가장 중요한 자신을 되돌아 볼 기회가 적어진다.&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;요왈편에도 탕왕의 말씀 중에 다음과 같은 언급이 있다.&lt;br style=&quot;clear: both;&quot;&gt;“제 몸에 죄가 있다면 만방의 백성과는 아무 상관이 없는 것이오나, 만방의 백성에게 죄가 있다면 그 죄는 제 자신에게 있사옵니다.”&lt;/p&gt;&lt;h2 id=&quot;남이-나를-알아주지-않음을-걱정하지-말고,-내가-남을-알지-못함을-걱정해야-한다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;남이-나를-알아주지-않음을-걱정하지-말고,-내가-남을-알지-못함을-걱정해야-한다&quot; href=&quot;#남이-나를-알아주지-않음을-걱정하지-말고,-내가-남을-알지-못함을-걱정해야-한다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;남이 나를 알아주지 않음을 걱정하지 말고, 내가 남을 알지 못함을 걱정해야 한다&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“남이 나를 알아주지 않음을 걱정하지 말고 오히려 내가 남을 알지 못함을 걱정해야 한다.”&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;학이편    &lt;code style=&quot;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; padding: 0.2em 0.5em; border: 1px solid rgb(239, 239, 239); background-color: rgba(0, 0, 0, 0.0196078);&quot;&gt;남이 나를 알아주지 않아도 화를 내지 않으면 이 또한 군자가 아니겠는가?&lt;/code&gt;&lt;br style=&quot;clear: both;&quot;&gt;헌문편    &lt;code style=&quot;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; padding: 0.2em 0.5em; border: 1px solid rgb(239, 239, 239); background-color: rgba(0, 0, 0, 0.0196078);&quot;&gt;남이 자기를 알아주지 않는 것을 걱정하지 말고 자기의 무능함을 걱정하라&lt;/code&gt;&lt;br style=&quot;clear: both;&quot;&gt;위령공편 &lt;code style=&quot;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; padding: 0.2em 0.5em; border: 1px solid rgb(239, 239, 239); background-color: rgba(0, 0, 0, 0.0196078);&quot;&gt;군자는 자기의 무능함을 걱정하지, 남이 자기를 알아주지 않는다고 걱정하지 않는다.&lt;/code&gt;&lt;/p&gt;&lt;h2 id=&quot;말은-더디되-행동은-민첩하게-하라&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;말은-더디되-행동은-민첩하게-하라&quot; href=&quot;#말은-더디되-행동은-민첩하게-하라&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;말은 더디되 행동은 민첩하게 하라&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“군자는 말은 더디되 행동은 민첩하게 한다.”&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;위정편 &lt;code style=&quot;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; padding: 0.2em 0.5em; border: 1px solid rgb(239, 239, 239); background-color: rgba(0, 0, 0, 0.0196078);&quot;&gt;말에 앞서 행동을 먼저 하고, 그 다음에 그 일에 대해 이야기해야 한다.&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;모든 일에는 실천이 먼저라는 뜻이며, 말이 앞서고 실천이 곧 뒤따르지 않음을 경계하는 말씀이다.&lt;/p&gt;&lt;h2 id=&quot;날씨가-추워진-뒤에야-소나무와-잣나무의-절개를-알-수-있다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;날씨가-추워진-뒤에야-소나무와-잣나무의-절개를-알-수-있다&quot; href=&quot;#날씨가-추워진-뒤에야-소나무와-잣나무의-절개를-알-수-있다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;날씨가 추워진 뒤에야 소나무와 잣나무의 절개를 알 수 있다&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“한 해의 날씨가 추워진 뒤에야 소나무와 잣나무가 시들지 않고 있음을 알게 된다.”&lt;/p&gt;&lt;h2 id=&quot;다된-일은-논의하지-말고,-끝난-일은-간하지-말고,-지난-일은-탓하지-말라&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;다된-일은-논의하지-말고,-끝난-일은-간하지-말고,-지난-일은-탓하지-말라&quot; href=&quot;#다된-일은-논의하지-말고,-끝난-일은-간하지-말고,-지난-일은-탓하지-말라&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;다된 일은 논의하지 말고, 끝난 일은 간하지 말고, 지난 일은 탓하지 말라&lt;/h2&gt;&lt;pre style=&quot;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 0.5em;&quot;&gt;&lt;code data-origin=&quot;&lt;pre&gt;&lt;code&gt;노 나라의 임금인 애공이 재아에게 토지의 신을 모시는 사당, 즉 사에 대해 묻자 재아가 대답하였다.

&amp;quot;하 나라 임금은 소나무를 심었고, 은 나라는 잣나무를 심었고, 주 나라 사람들은 밤나무를 심었는데, 백성들로 하여금 두려워 떨게 하려는 뜻에서 그리 했다고 합니다.&amp;quot;

이를 듣고 공자께서 말씀하셨다.

&amp;quot;다 된 일은 더 이상 논하지 말며, 이미 끝난 일은 안 된다고 간하지 말고, 지난 일은 그 허물을 탓하지 말아야 한다.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&quot; style=&quot;border: 0px; display: block;font-family: Consolas, Inconsolata, Courier, monospace; font-weight: bold; white-space: pre; margin: 0px;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-size: 1em; letter-spacing: -1px; font-weight: bold;&quot;&gt;노 나라의 임금인 애공이 재아에게 토지의 신을 모시는 사당, 즉 사에 대해 묻자 재아가 대답하였다.

&quot;하 나라 임금은 소나무를 심었고, 은 나라는 잣나무를 심었고, 주 나라 사람들은 밤나무를 심었는데, 백성들로 하여금 두려워 떨게 하려는 뜻에서 그리 했다고 합니다.&quot;

이를 듣고 공자께서 말씀하셨다.

&quot;다 된 일은 더 이상 논하지 말며, 이미 끝난 일은 안 된다고 간하지 말고, 지난 일은 그 허물을 탓하지 말아야 한다.&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;지나가고-있는-것들은-이와-같아서,-밤낮을-쉬지-않는다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;지나가고-있는-것들은-이와-같아서,-밤낮을-쉬지-않는다&quot; href=&quot;#지나가고-있는-것들은-이와-같아서,-밤낮을-쉬지-않는다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;지나가고 있는 것들은 이와 같아서, 밤낮을 쉬지 않는다&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 냇가에 이르러 이렇게 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“지나가고 있는 것들은 이와 같아서, 밤낮을 쉬지 않는다.”&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;시간은 멈추지도 느려지지도 않고 항상 흘러간다. 항상 이것을 염두해두고 살아야 한다.&lt;/p&gt;&lt;pre style=&quot;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 0.5em;&quot;&gt;&lt;code data-origin=&quot;&lt;pre&gt;&lt;code&gt;젊은 시절은 거듭 오지 않으며
하루에 아침은 두 번 맞지는 못한다
때를 놓치지 말고 부지런히 일해라
세월은 사람을 기다려 주지 않는다

- 도연명의 잡시
&lt;/code&gt;&lt;/pre&gt;&quot; style=&quot;border: 0px; display: block;font-family: Consolas, Inconsolata, Courier, monospace; font-weight: bold; white-space: pre; margin: 0px;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-size: 1em; letter-spacing: -1px; font-weight: bold;&quot;&gt;젊은 시절은 거듭 오지 않으며
하루에 아침은 두 번 맞지는 못한다
때를 놓치지 말고 부지런히 일해라
세월은 사람을 기다려 주지 않는다

- 도연명의 잡시
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;먼-앞날을-걱정하지-않으면-반드시-가까운-시일에-근심이-생긴다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;먼-앞날을-걱정하지-않으면-반드시-가까운-시일에-근심이-생긴다&quot; href=&quot;#먼-앞날을-걱정하지-않으면-반드시-가까운-시일에-근심이-생긴다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;먼 앞날을 걱정하지 않으면 반드시 가까운 시일에 근심이 생긴다&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“사람이 먼 앞날을 대비하지 않으면 반드시 가까운 시일 내에 걱정거리가 생긴다.”&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;유비무환&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Book/인문학</category>
      <category>공자</category>
      <category>논어</category>
      <category>논어 경영학</category>
      <author>MAIN</author>
      <guid isPermaLink="true">https://mainfunction.tistory.com/50</guid>
      <comments>https://mainfunction.tistory.com/entry/%EB%85%BC%EC%96%B4-%EA%B2%BD%EC%98%81%ED%95%99%EC%9E%98%EB%AA%BB%EC%9D%84-%EA%B9%A8%EB%8B%AC%EC%95%98%EC%9D%84-%EB%95%8C%EB%8A%94-%EA%B3%A0%EC%B9%98%EA%B8%B0%EB%A5%BC-%EA%BA%BC%EB%A6%AC%EC%A7%80-%EB%A7%90%EB%9D%BC#entry50comment</comments>
      <pubDate>Tue, 23 Jun 2015 13:43:41 +0900</pubDate>
    </item>
    <item>
      <title>[논어 경영학]배우고 또 때때로 익히면 어찌 기쁘지 아니한가</title>
      <link>https://mainfunction.tistory.com/entry/%EB%85%BC%EC%96%B4-%EA%B2%BD%EC%98%81%ED%95%99</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;txc-info hreview&quot; id=&quot;txc_book_detail_KOR9788935207718&quot; point=&quot;7&quot; style=&quot;clear: both; font-size: 9pt; line-height: 1.5; margin: 0px; padding: 0px; width: 530px; border: medium none; background: none 0px 0px repeat scroll transparent;&quot;&gt;&lt;hr style=&quot;margin:0 0 10px;*margin:-7px 0 3px 0; filter:alpha(opacity=10); opacity:0.1; background:none #333333; border:medium none; clear:both; display:block; height:1px; overflow:hidden; padding:0; width:530px;&quot;&gt;&lt;div style=&quot;float:left; margin:0 10px 10px 0; padding:0; position:relative;&quot;&gt;	&lt;a href=&quot;http://book.daum.net/detail/book.do?bookid=KOR9788935207718&quot; target=&quot;_blank&quot;&gt;		&lt;img class=&quot;photo&quot; width=&quot;72&quot; height=&quot;104&quot; src=&quot;http://t1.daumcdn.net/thumb/R72x100/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9788935207718&quot; border=&quot;0&quot; onerror=&quot;this.src='http://icon.daum-img.net/editor/db_img_book.gif?rv=1.0.1'&quot;&gt;	&lt;/a&gt;&lt;/div&gt;&lt;h3 style=&quot;font-size:1em;margin:0;padding:0;&quot;&gt;	&lt;a class=&quot;item fn url&quot; href=&quot;http://book.daum.net/detail/book.do?bookid=KOR9788935207718&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;  border:medium none; position:static;&quot;&gt;논어 경영학&lt;/a&gt;&lt;/h3&gt;&lt;dl class=&quot;book detail&quot; style=&quot;margin:5px 0  0 82px;&quot;&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;저자&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;&lt;a href=&quot;http://book.daum.net//search/bookSearch.do?advancedSearchYN=y&amp;amp;author=%EB%AF%BC%EA%B2%BD%EC%A1%B0&amp;amp;authorID=AU00551419&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none&quot;&gt;민경조&lt;/a&gt; 지음&lt;/dd&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;출판사&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;&lt;a href=&quot;http://book.daum.net/search/bookSearch.do?advancedSearchYN=y&amp;amp;publisher=%EC%B2%AD%EB%A6%BC%EC%B6%9C%ED%8C%90&amp;amp;publisherID=PU00378507&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none&quot;&gt;청림출판&lt;/a&gt; &lt;span style=&quot;font-size:1em; height:1%; zoom:1; filter:alpha(opacity=20); opacity:0.2;&quot;&gt;|&lt;/span&gt; 2009-01-20 출간&lt;/dd&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;카테고리&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;&lt;a href=&quot;http://book.daum.net/category/book.do?categoryID=KOR15&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none&quot;&gt;자기계발&lt;/a&gt;&lt;/dd&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;책소개&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;공자의 철학과 CEO의 경영술이 만나다말단 사원에서 대기업의 C...&lt;/dd&gt;&lt;/dl&gt;&lt;div style=&quot;margin:5px 5px 0 82px; padding:0;&quot;&gt;	&lt;a href=&quot;http://book.daum.net/detail/book.do?bookid=KOR9788935207718#tab_comp&quot; target=&quot;_blank&quot; style=&quot;float:right&quot;&gt;&lt;img width=&quot;62&quot; height=&quot;22&quot; src=&quot;http://deco.daum-img.net/contents/info/bt_info_compare.gif?rv=1.0.1&quot; border=&quot;0&quot; alt=&quot;가격비교&quot;&gt;&lt;/a&gt;	&lt;strong class=&quot;rating&quot; style=&quot;border-bottom-width:0;font-weight:bold;&quot; title=&quot;7&quot;&gt;글쓴이 평점&amp;nbsp;&amp;nbsp;&lt;span style=&quot;position:relative;top:1px;&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_y.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_y.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_y.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_h.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_g.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;hr style=&quot;margin:10px 0 0;*margin:3px 0 -7px 0;opacity:0.1;filter:alpha(opacity=10);line-height:0;font-size:0; background:none #333333; border:medium none; clear:both; display:block; height:1px; overflow:hidden; padding:0; width:530px;&quot;&gt;&lt;/div&gt;
&lt;script src=&quot;http://editor.daum.net/view/info/7.1/book.js&quot; charset=&quot;utf-8&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;script src=&quot;http://cia.daum.net/view/book/book/KOR9788935207718.js?callback=txCiaCallback&quot; charset=&quot;utf-8&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;!--DB_EMBEDDING_START--&gt;
&lt;TXDB name=&quot;책&quot; id=&quot;txd_book_detail_KOR9788935207718&quot;&gt;
	&lt;TXDBITEM title=&quot;논어 경영학&quot;&gt;&lt;/TXDBITEM&gt;
	&lt;TXDBITEM image=&quot;http://t1.daumcdn.net/thumb/R72x100/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbook%2FKOR9788935207718%3Fmoddttm=20141122085257&quot;&gt;&lt;/TXDBITEM&gt;
&lt;/TXDB&gt;
&lt;!--DB_EMBEDDING_END--&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;div style=&quot;font-family: 'Lucida Grande', 'Segoe UI', 'Apple SD Gothic Neo', 'Malgun Gothic', 'Lucida Sans Unicode', Helvetica, Arial, sans-serif; font-size: 0.9em; overflow-x: hidden; overflow-y: auto; margin: 0px !important; padding: 5px 20px 26px !important; background-color: rgb(255, 255, 255);font-family: 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; padding: 20px;padding: 20px; color: rgb(34, 34, 34); font-size: 15px; font-family: 'Roboto Condensed', Tauri, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; line-height: 1.6; -webkit-font-smoothing: antialiased; background: rgb(255, 255, 255);&quot;&gt;&lt;h1 id=&quot;배우고-또-때때로-익히면-어찌-기쁘지-아니한가&quot; style=&quot;clear: both; font-size: 2.1em; font-weight: bold; margin-right: 0px; margin-bottom: 1em; margin-top: 0px;&quot;&gt;&lt;a name=&quot;배우고-또-때때로-익히면-어찌-기쁘지-아니한가&quot; href=&quot;#배우고-또-때때로-익히면-어찌-기쁘지-아니한가&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;/h1&gt;&lt;h2 id=&quot;유능하면서-무능한-사람에게-묻고,-많이-알면서도-적게-들어-아는-사람에게-묻는다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;유능하면서-무능한-사람에게-묻고,-많이-알면서도-적게-들어-아는-사람에게-묻는다&quot; href=&quot;#유능하면서-무능한-사람에게-묻고,-많이-알면서도-적게-들어-아는-사람에게-묻는다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;유능하면서 무능한 사람에게 묻고, 많이 알면서도 적게 들어 아는 사람에게 묻는다&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;증자가 말했다.&lt;br style=&quot;clear: both;&quot;&gt;“유능하면서도 무능한 사람에게 묻고, 많이 들어 알면서도 적게 들어 아는 사람에게 묻고, 있으면서도 없는 듯하고, 차 있으면서도 텅 빈 듯하고, 남이 자기에게 잘못해도 따지고 다투지 않는다. 전에 내 친구가 이런 일을 몸소 행하고 있었다.”&lt;/p&gt;&lt;pre style=&quot;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 0.5em;&quot;&gt;&lt;code data-origin=&quot;&lt;pre&gt;&lt;code&gt;옛날 괵 나라 임금이 나라가 망하여 도망을 가던 중이었다. 임금이 마부에게 목이 마르다고 하자 마부는 곧 맛있는 술을 바쳤다. 또 배가 고프다고 하자 고기반찬을 곁들인 식사를 대령했다.

&amp;quot;어떻게 해서 대령하였느냐?&amp;quot;

&amp;quot;미리 준비하였습니다.&amp;quot;

&amp;quot;왜 미리 준비해두었더냐?&amp;quot;

&amp;quot;임금님께서 도망가실 때 굶주리고 목이 마르실까봐 준비했습니다.&amp;quot;

&amp;quot;그럼 너는 내가 망하게 되리라는 걸 알았던 모양인데, 왜 진작 간하지 않았느냐?&amp;quot;

&amp;quot;임금께서는 아첨하는 말을 좋아하시고 올바른 말을 싫어하셨습니다. 저도 간언을 드릴까 생각해보았으나 나라가 망하기 전에 제가 먼저 죽게 될 것 같아 그만두었습니다.&amp;quot;

&amp;quot;그래? 그럼 내가 망하게 된 것은 무엇 때문이라고 생각하느냐?&amp;quot;

&amp;quot;임금께서 망하신 것은 지나치게 현명하셨기 때문입니다.&amp;quot;

&amp;quot;현명한 사람이 번성하지 않고 망한 것은 무엇 때문이라고 생각하느냐?&amp;quot;

&amp;quot;임금님 주위에 임금님보다 현명한 사람이 없고 임금님 혼자 현명하셨기 때문입니다.&amp;quot;

임금은 마부의 말을 듣고 기뻐서 수레에 몸을 기댄 채 웃으며 말했다.

&amp;quot;허허, 똑똑한 내가 이런 어려움을 겪게 되다니...&amp;quot;

말을 마치자 임금은 온몸에 힘이 빠지고 피곤함을 느껴 마부의 무릎을 베고 잠이 들었다. 마부는 살며시 자기 무릎을 빼고 대신 돌을 베게로 받쳐주고는 떠나버렸다. 그 후 임금은 들판을 헤매다가 호랑이에게 잡아먹히고 말았다.
&lt;/code&gt;&lt;/pre&gt;&quot; style=&quot;border: 0px; display: block;font-family: Consolas, Inconsolata, Courier, monospace; font-weight: bold; white-space: pre; margin: 0px;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-size: 1em; letter-spacing: -1px; font-weight: bold;&quot;&gt;옛날 괵 나라 임금이 나라가 망하여 도망을 가던 중이었다. 임금이 마부에게 목이 마르다고 하자 마부는 곧 맛있는 술을 바쳤다. 또 배가 고프다고 하자 고기반찬을 곁들인 식사를 대령했다.

&quot;어떻게 해서 대령하였느냐?&quot;

&quot;미리 준비하였습니다.&quot;

&quot;왜 미리 준비해두었더냐?&quot;

&quot;임금님께서 도망가실 때 굶주리고 목이 마르실까봐 준비했습니다.&quot;

&quot;그럼 너는 내가 망하게 되리라는 걸 알았던 모양인데, 왜 진작 간하지 않았느냐?&quot;

&quot;임금께서는 아첨하는 말을 좋아하시고 올바른 말을 싫어하셨습니다. 저도 간언을 드릴까 생각해보았으나 나라가 망하기 전에 제가 먼저 죽게 될 것 같아 그만두었습니다.&quot;

&quot;그래? 그럼 내가 망하게 된 것은 무엇 때문이라고 생각하느냐?&quot;

&quot;임금께서 망하신 것은 지나치게 현명하셨기 때문입니다.&quot;

&quot;현명한 사람이 번성하지 않고 망한 것은 무엇 때문이라고 생각하느냐?&quot;

&quot;임금님 주위에 임금님보다 현명한 사람이 없고 임금님 혼자 현명하셨기 때문입니다.&quot;

임금은 마부의 말을 듣고 기뻐서 수레에 몸을 기댄 채 웃으며 말했다.

&quot;허허, 똑똑한 내가 이런 어려움을 겪게 되다니...&quot;

말을 마치자 임금은 온몸에 힘이 빠지고 피곤함을 느껴 마부의 무릎을 베고 잠이 들었다. 마부는 살며시 자기 무릎을 빼고 대신 돌을 베게로 받쳐주고는 떠나버렸다. 그 후 임금은 들판을 헤매다가 호랑이에게 잡아먹히고 말았다.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;막힘이-있으면서도-배우지-않으면-발전할-수-없다.&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;막힘이-있으면서도-배우지-않으면-발전할-수-없다.&quot; href=&quot;#막힘이-있으면서도-배우지-않으면-발전할-수-없다.&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;막힘이 있으면서도 배우지 않으면 발전할 수 없다.&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“나면서 저절로 아는 사람은 최상이요, 배워서 아는 사람은 그 다음이요, 막힘이 있으면서 애써 배우는 자는 또 그 다음이니라. 그러나 막힘이 있으면서도 배우지 않는 사람은 하등이다.”&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;많은 사람들은 학교나 사회에서 꾸준히 배우고 익혀 사물의 이치를 깨닫게 된다. 모르는 게 있으면 미리 배워서 사물의 이치를 터득해야 하는데, 간혹 곤경에 처해서야 비로소 배우려고 하는 사람들이 있다. 그래도 이런 사람들은 좀 나은 편이다. 문제는 곤경에 처해서도 배우려 하지 않는 사람들이다.&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;배움을 게을리하면 그 결과는 다른 이에게 가는 것이 아니라 고스란히 나에게 온다. 배워야 변하고, 변해야 이 치열한 경쟁시대에 살아남을 수 있지 않겠는가? 시시각각 변화하는 이 시대에 나 혼자 가만히 있으면 곧 시대에 뒤처져 복잡하게 돌아가는 세상과 점점 멀어지게 된다.&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;경제상황이 나빠지고 환경이 악화되면, 기업이나 개인 모두 발전과 개혁을 위한 노력에 소홀해지기 쉽다. 그러나 어려운 때일수록 기업은 연구개발에 힘쓰고, 개인은 자기계발에 총력을 기울여야 한다. 힘든 시기에는 당장의 이익과 비용이 더욱 크게 느껴지는 것이 인지상정이지만, 이럴 때 미래를 준비하고 변화에 대비하느냐 마느냐가 장차 성공을 가르는 가장 중요한 기준이 되기 때문이다. 좀 더 장기적인 관점이 필요하다.&lt;/p&gt;&lt;h2 id=&quot;세-사람이-길을-가면-그중에-반드시-나의-스승이-있다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;세-사람이-길을-가면-그중에-반드시-나의-스승이-있다&quot; href=&quot;#세-사람이-길을-가면-그중에-반드시-나의-스승이-있다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;세 사람이 길을 가면 그중에 반드시 나의 스승이 있다&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“세 사람이 길을 가면 그중에 반드시 나의 스승이 될 만한 사람이 있다. 그들에게서 좋은 점은 가려 따르고, 그들의 좋지 않은 점으로는 자신을 바로잡을 수 있기 때문이다.”&lt;/p&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;타인의 장점은 나의 것으로 만들고자 노력하고 타인의 단점은 타산지석 삼아 나의 행동을 되돌아 보고 고칠 수 있어야 한다.&lt;/p&gt;&lt;h2 id=&quot;아랫사람에게-묻기를-부끄러워하지-않는다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;아랫사람에게-묻기를-부끄러워하지-않는다&quot; href=&quot;#아랫사람에게-묻기를-부끄러워하지-않는다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;아랫사람에게 묻기를 부끄러워하지 않는다&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;자공이 물었다.&lt;br style=&quot;clear: both;&quot;&gt;“공문자는 어째서 문이라 시호를 불렀습니까?”&lt;br style=&quot;clear: both;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“민첩하면서도 배우기를 좋아했고, 아랫살마에게 묻기를 부끄러워하지 않았기 때문이다.”&lt;/p&gt;&lt;pre style=&quot;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 0.5em;&quot;&gt;&lt;code data-origin=&quot;&lt;pre&gt;&lt;code&gt;공자께서 말씀하셨다.
&amp;quot;자로야! 내가 너에게 안다는 것이 무엇인지 가르쳐주랴? 아는 것을 안다고 하고 모르는 것은 모른다고 하는 것, 이것이 곧 아는 것이다.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&quot; style=&quot;border: 0px; display: block;font-family: Consolas, Inconsolata, Courier, monospace; font-weight: bold; white-space: pre; margin: 0px;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-size: 1em; letter-spacing: -1px; font-weight: bold;&quot;&gt;공자께서 말씀하셨다.
&quot;자로야! 내가 너에게 안다는 것이 무엇인지 가르쳐주랴? 아는 것을 안다고 하고 모르는 것은 모른다고 하는 것, 이것이 곧 아는 것이다.&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;요즘은 모르는 것에 대해 괜히 아는 척했다가 몇 초만에 구글 검색에 의해 바닥을 드러내게 된다. 모르면 묻고, 이해하지 못 했다면 다시 물어야 한다.&lt;/p&gt;&lt;h2 id=&quot;끊임없이-배우고,-늘-복습한다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;끊임없이-배우고,-늘-복습한다&quot; href=&quot;#끊임없이-배우고,-늘-복습한다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;끊임없이 배우고, 늘 복습한다&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“배움이란 도달할 수 없는 것 같이 하고, 배운 것은 잃어버릴까 두려운 듯이 해야 한다.”&lt;/p&gt;&lt;pre style=&quot;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 0.5em;&quot;&gt;&lt;code data-origin=&quot;&lt;pre&gt;&lt;code&gt;노 나라 임금인 애공이 공자의 제자인 염유에게 물었다.

&amp;quot;보통 사람은 타고난 바탕만 있으면 되었지, 반드시 배워서 군자가 되어야 하는 것은 아니지 않습니까?&amp;quot;

이에 염유는 이렇게 대답했다.

&amp;quot;신이 듣기로 아무리 훌륭한 옥이 있어도 다듬지 않으면 그릇이 될 수 없고, 사람이 아름다운 바탕을 타고났어도 배우지 않으면 군자가 될 수 없다고 하였습니다.&amp;quot;

애공이 다시 물었다.

&amp;quot;무엇으로 그러한 것을 알 수 있소?&amp;quot;

이에 염유는 다음과 같이 설명하였다.

&amp;quot;저 자로는 촌 사람이었고 자공은 위나라의 장사치였지만, 모두가 공자에게 배워 천하의 이름난 선비가 되었습니다. 그리하여 제후들이 그 이름을 듣고서 존경하지 않는 이가 없고 경대부들이 그 이름을 듣고서 친애하지 않는 이가 없으니, 이는 바로 그들이 배웠기 때문입니다. 이외에도 진나라의 백리해, 주 왕조의 태공망, 제나라의 관중 등은 자기 나라에 큰 업적을 이룬 사람들인데, 모두 미천한 출신이었지만 배워서 큰일을 이룬 사람들이었습니다. 그야말로 일취월장한 사람들이지요!&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&quot; style=&quot;border: 0px; display: block;font-family: Consolas, Inconsolata, Courier, monospace; font-weight: bold; white-space: pre; margin: 0px;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-size: 1em; letter-spacing: -1px; font-weight: bold;&quot;&gt;노 나라 임금인 애공이 공자의 제자인 염유에게 물었다.

&quot;보통 사람은 타고난 바탕만 있으면 되었지, 반드시 배워서 군자가 되어야 하는 것은 아니지 않습니까?&quot;

이에 염유는 이렇게 대답했다.

&quot;신이 듣기로 아무리 훌륭한 옥이 있어도 다듬지 않으면 그릇이 될 수 없고, 사람이 아름다운 바탕을 타고났어도 배우지 않으면 군자가 될 수 없다고 하였습니다.&quot;

애공이 다시 물었다.

&quot;무엇으로 그러한 것을 알 수 있소?&quot;

이에 염유는 다음과 같이 설명하였다.

&quot;저 자로는 촌 사람이었고 자공은 위나라의 장사치였지만, 모두가 공자에게 배워 천하의 이름난 선비가 되었습니다. 그리하여 제후들이 그 이름을 듣고서 존경하지 않는 이가 없고 경대부들이 그 이름을 듣고서 친애하지 않는 이가 없으니, 이는 바로 그들이 배웠기 때문입니다. 이외에도 진나라의 백리해, 주 왕조의 태공망, 제나라의 관중 등은 자기 나라에 큰 업적을 이룬 사람들인데, 모두 미천한 출신이었지만 배워서 큰일을 이룬 사람들이었습니다. 그야말로 일취월장한 사람들이지요!&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“싹은 났으나 꽃이 피지 아니하는 경우도 있고, 꽃은 피었으나 열매가 맺지 아니하는 경우도 있다.”&lt;/p&gt;&lt;h2 id=&quot;군자에게는-경계할-것이-세-가지가-있다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;군자에게는-경계할-것이-세-가지가-있다&quot; href=&quot;#군자에게는-경계할-것이-세-가지가-있다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;군자에게는 경계할 것이 세 가지가 있다&lt;/h2&gt;&lt;p style=&quot;margin-top: 0px;margin: 1em 0px; word-wrap: break-word;&quot;&gt;공자께서 말씀하셨다.&lt;br style=&quot;clear: both;&quot;&gt;“군자에게는 경계해야 할 것이 세 가지가 있다.&lt;br style=&quot;clear: both;&quot;&gt;젊었을 때에는 혈기가 안정되어 있지 않은 상태이니, 경계해야 할 것은 여색이다.&lt;br style=&quot;clear: both;&quot;&gt;장년이 되면 혈기가 한창 강성하므로, 경계할 것은 싸움이다.&lt;br style=&quot;clear: both;&quot;&gt;노년이 되면 혈기가 쇠진해지므로, 경계해야 할 것은 물욕이다.”&lt;/p&gt;&lt;h2 id=&quot;깎은-듯하고,-줄로-썬-듯하고,-징으로-쪼는-듯하고,-갈아서-다듬은-듯하다&quot; style=&quot;clear: both;font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em;border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(230, 230, 230);&quot;&gt;&lt;a name=&quot;깎은-듯하고,-줄로-썬-듯하고,-징으로-쪼는-듯하고,-갈아서-다듬은-듯하다&quot; href=&quot;#깎은-듯하고,-줄로-썬-듯하고,-징으로-쪼는-듯하고,-갈아서-다듬은-듯하다&quot; style=&quot;text-decoration: none; vertical-align: baseline;color: rgb(50, 105, 160);&quot;&gt;&lt;/a&gt;깎은 듯하고, 줄로 썬 듯하고, 징으로 쪼는 듯하고, 갈아서 다듬은 듯하다&lt;/h2&gt;&lt;pre style=&quot;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 0.5em;&quot;&gt;&lt;code data-origin=&quot;&lt;pre&gt;&lt;code&gt;자공이 여쭈었다.

&amp;quot;가난해도 아첨하지 않고, 부유해도 교만하지 않다면 어떻겠습니까?&amp;quot;

공자께서 말씀하셨다.

&amp;quot;괜찮기는 하지만 가난하면서도 낙도하고, 부유하면서도 예를 좋아하는 것만은 못하다.&amp;quot;

자공이 아뢰었다.

&amp;quot;[시경]에 이르기를, '깎고 다듬는 듯하고 쪼고 간 듯하다'고 한 것이 바로 이것을 뜻하는 것이로군요!&amp;quot;

공자께서 말씀하셨다.

&amp;quot;사야! 비로소 너와 함께 [시경]을 논할 수 있게 되었구나! 이미 얘기한 것을 설명해주니 아직 얘기하지 않은 것도 아는구나!&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&quot; style=&quot;border: 0px; display: block;font-family: Consolas, Inconsolata, Courier, monospace; font-weight: bold; white-space: pre; margin: 0px;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-size: 1em; letter-spacing: -1px; font-weight: bold;&quot;&gt;자공이 여쭈었다.

&quot;가난해도 아첨하지 않고, 부유해도 교만하지 않다면 어떻겠습니까?&quot;

공자께서 말씀하셨다.

&quot;괜찮기는 하지만 가난하면서도 낙도하고, 부유하면서도 예를 좋아하는 것만은 못하다.&quot;

자공이 아뢰었다.

&quot;[시경]에 이르기를, '깎고 다듬는 듯하고 쪼고 간 듯하다'고 한 것이 바로 이것을 뜻하는 것이로군요!&quot;

공자께서 말씀하셨다.

&quot;사야! 비로소 너와 함께 [시경]을 논할 수 있게 되었구나! 이미 얘기한 것을 설명해주니 아직 얘기하지 않은 것도 아는구나!&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Book/인문학</category>
      <category>공자</category>
      <category>논어</category>
      <category>논어 경영학</category>
      <author>MAIN</author>
      <guid isPermaLink="true">https://mainfunction.tistory.com/49</guid>
      <comments>https://mainfunction.tistory.com/entry/%EB%85%BC%EC%96%B4-%EA%B2%BD%EC%98%81%ED%95%99#entry49comment</comments>
      <pubDate>Tue, 23 Jun 2015 12:00:53 +0900</pubDate>
    </item>
    <item>
      <title>열혈강의 파이썬 Ver.2 개정판</title>
      <link>https://mainfunction.tistory.com/entry/%EC%97%B4%ED%98%88%EA%B0%95%EC%9D%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC-Ver2-%EA%B0%9C%EC%A0%95%ED%8C%90</link>
      <description>&lt;p style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: 돋움, Dotum, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: 돋움, Dotum, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: 돋움, Dotum, Helvetica, sans-serif;&quot;&gt;&lt;div class=&quot;txc-info hreview&quot; id=&quot;txc_book_detail_KOR9788989345770&quot; point=&quot;7&quot; style=&quot;clear: both; font-size: 9pt; line-height: 1.5; margin: 0px; padding: 0px; width: 530px; border: medium none; background-image: none; background-attachment: scroll; background-color: transparent; background-position: 0px 0px; background-repeat: repeat repeat;&quot;&gt;&lt;hr style=&quot;margin:0 0 10px;*margin:-7px 0 3px 0; filter:alpha(opacity=10); opacity:0.1; background:none #333333; border:medium none; clear:both; display:block; height:1px; overflow:hidden; padding:0; width:530px;&quot;&gt;&lt;div style=&quot;float:left; margin:0 10px 10px 0; padding:0; position:relative;&quot;&gt;	&lt;a href=&quot;http://book.daum.net/detail/book.do?bookid=KOR9788989345770&quot; target=&quot;_blank&quot;&gt;		&lt;img class=&quot;photo&quot; width=&quot;72&quot; height=&quot;104&quot; src=&quot;http://book.daum-img.net/R72x100/KOR9788989345770&quot; border=&quot;0&quot; onerror=&quot;this.src='http://icon.daum-img.net/editor/db_img_book.gif?rv=1.0.1'&quot;&gt;	&lt;/a&gt;&lt;/div&gt;&lt;h3 style=&quot;font-size:1em;margin:0;padding:0;&quot;&gt;	&lt;a class=&quot;item fn url&quot; href=&quot;http://book.daum.net/detail/book.do?bookid=KOR9788989345770&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;  border:medium none; position:static;&quot;&gt;열혈강의 파이썬&lt;/a&gt;&lt;/h3&gt;&lt;dl class=&quot;book detail&quot; style=&quot;margin:5px 0  0 82px;&quot;&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;저자&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;&lt;a href=&quot;http://book.daum.net//search/bookSearch.do?advancedSearchYN=y&amp;amp;author=%EC%9D%B4%EA%B0%95%EC%84%B1&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none&quot;&gt;이강성&lt;/a&gt; 지음&lt;/dd&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;출판사&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;&lt;a href=&quot;http://book.daum.net/search/bookSearch.do?advancedSearchYN=y&amp;amp;publisher=%ED%94%84%EB%A6%AC%EB%A0%89(%EC%A3%BC)&amp;amp;publisherID=PU00370506&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none&quot;&gt;프리렉(주)&lt;/a&gt; &lt;span style=&quot;font-size:1em; height:1%; zoom:1; filter:alpha(opacity=20); opacity:0.2;&quot;&gt;|&lt;/span&gt; 2005-08-29 출간&lt;/dd&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;카테고리&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;&lt;a href=&quot;http://book.daum.net/category/book.do?categoryID=KOR33&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none&quot;&gt;컴퓨터/IT&lt;/a&gt;&lt;/dd&gt;	&lt;dt style=&quot;float:left; margin:0; filter:alpha(opacity=50); opacity:0.5; padding:0&quot;&gt;책소개&lt;/dt&gt;	&lt;dd style=&quot;margin-left:60px; padding:0;&quot;&gt;파이썬(Python)을 쉽고 체계적으로 배울 수 있도록 구성한 ...&lt;/dd&gt;&lt;/dl&gt;&lt;div style=&quot;margin:5px 5px 0 82px; padding:0;&quot;&gt;	&lt;a href=&quot;http://book.daum.net/detail/book.do?bookid=KOR9788989345770#tab_comp&quot; target=&quot;_blank&quot; style=&quot;float:right&quot;&gt;&lt;img width=&quot;62&quot; height=&quot;22&quot; src=&quot;http://deco.daum-img.net/contents/info/bt_info_compare.gif?rv=1.0.1&quot; border=&quot;0&quot; alt=&quot;가격비교&quot;&gt;&lt;/a&gt;	&lt;strong class=&quot;rating&quot; style=&quot;border-bottom-width:0;font-weight:bold;&quot; title=&quot;7&quot;&gt;글쓴이 평점&amp;nbsp;&amp;nbsp;&lt;span style=&quot;position:relative;top:1px;&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_y.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_y.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_y.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_h.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;img src=&quot;http://deco.daum-img.net/contents/info/ystar_g.gif?rv=1.0.2&quot; width=&quot;14&quot; height=&quot;14&quot; hspace=&quot;1&quot; valign=&quot;absmiddle&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;hr style=&quot;margin:10px 0 0;*margin:3px 0 -7px 0;opacity:0.1;filter:alpha(opacity=10);line-height:0;font-size:0; background:none #333333; border:medium none; clear:both; display:block; height:1px; overflow:hidden; padding:0; width:530px;&quot;&gt;&lt;/div&gt;
&lt;script src=&quot;http://editor.daum.net/view/info/7.1/book.js&quot; charset=&quot;utf-8&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;script src=&quot;http://cia.daum.net/view/book/book/KOR9788989345770.js?callback=txCiaCallback&quot; charset=&quot;utf-8&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;!--DB_EMBEDDING_START--&gt;
&lt;TXDB name=&quot;책&quot; id=&quot;txd_book_detail_KOR9788989345770&quot;&gt;
	&lt;TXDBITEM title=&quot;열혈강의 파이썬&quot;&gt;&lt;/TXDBITEM&gt;
	&lt;TXDBITEM image=&quot;http://book.daum-img.net/R72x100/KOR9788989345770?moddttm=20140521064930&quot;&gt;&lt;/TXDBITEM&gt;
&lt;/TXDB&gt;
&lt;!--DB_EMBEDDING_END--&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: 돋움, Dotum, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 16px; line-height: 24px;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px; line-height: 24px;&quot;&gt;&lt;a href=&quot;http://mainfunction.tistory.com/entry/%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%99%9C%EC%9A%A9%ED%95%98%EB%8A%94-%ED%8C%8C%EC%9D%B4%EC%8D%AC3-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;빠르게 활용하는 파이썬 3 프로그래밍&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; background-color: transparent; line-height: 1.5;&quot;&gt;&amp;gt; 이란 책 보다 자세한&amp;nbsp;개념 설명이 필요하시다면 이 책을 추천드립니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: 돋움, Dotum, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;인터넷 강의가 포함되어 있어서 초급 개발자&amp;nbsp;분들이나 다른&amp;nbsp;프로그래밍 언어에 대한 경험이 부족하신 분들께 추천드립니다. 인터넷 강의도 설명이 자세하여 개인적으로 만족했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: 돋움, Dotum, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: 돋움, Dotum, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;하지만....&amp;nbsp;이런 두꺼운 책이 싫으시다면....&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;a class=&quot;tx-link&quot; href=&quot;http://mainfunction.tistory.com/entry/%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%99%9C%EC%9A%A9%ED%95%98%EB%8A%94-%ED%8C%8C%EC%9D%B4%EC%8D%AC3-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D&quot; target=&quot;_blank&quot;&gt;빠르게 활용하는 파이썬 3 프로그래밍&lt;/a&gt;&amp;gt; 책을 통해 빠르게 학습하신 후 필요한 부분만 인터넷 검색을 통해 배워도 문제가 없다고 생각합니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: 돋움, Dotum, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: 돋움, Dotum, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;파이썬 자체가 워낙 간편하고 생산성이 좋기 때문에 크게 부담을 느끼지 않아도 될 것 같습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Book/IT</category>
      <category>문학&amp;middot;책</category>
      <category>파이썬</category>
      <category>파이썬교재추천</category>
      <category>파이썬책추천</category>
      <author>MAIN</author>
      <guid isPermaLink="true">https://mainfunction.tistory.com/27</guid>
      <comments>https://mainfunction.tistory.com/entry/%EC%97%B4%ED%98%88%EA%B0%95%EC%9D%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC-Ver2-%EA%B0%9C%EC%A0%95%ED%8C%90#entry27comment</comments>
      <pubDate>Wed, 21 May 2014 20:47:11 +0900</pubDate>
    </item>
  </channel>
</rss>