<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.2">Jekyll</generator><link href="https://joyyir.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://joyyir.github.io/" rel="alternate" type="text/html" /><updated>2023-01-10T10:44:45+09:00</updated><id>https://joyyir.github.io/feed.xml</id><title type="html">장준영의 블로그</title><subtitle>느리더라도 꾸준히!</subtitle><author><name>Jang Junyeong</name></author><entry><title type="html">[DDD START!] CHAPTER 4. 리포지터리와 모델 구현(JPA 중심)</title><link href="https://joyyir.github.io/ddd/ddd-start-04/" rel="alternate" type="text/html" title="[DDD START!] CHAPTER 4. 리포지터리와 모델 구현(JPA 중심)" /><published>2023-01-10T00:00:00+09:00</published><updated>2023-01-10T00:00:00+09:00</updated><id>https://joyyir.github.io/ddd/ddd-start-04</id><content type="html" xml:base="https://joyyir.github.io/ddd/ddd-start-04/">&lt;h2 id=&quot;내용-요약&quot;&gt;내용 요약&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;가능하면 리포지터리 구현 클래스를 인프라스트럭처 영역에 위치시켜서 인프라스트럭처에 대한 의존을 낮춰야함&lt;/li&gt;
  &lt;li&gt;리포지터리의 기본 기능
    &lt;ul&gt;
      &lt;li&gt;아이디로 애그리거트 조회하기
        &lt;ul&gt;
          &lt;li&gt;findBy~ 메소드&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;애그리거트 저장하기
        &lt;ul&gt;
          &lt;li&gt;save 메소드&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;리포지터리 인터페이스는 애그리거트 루트를 기준으로 작성함&lt;/li&gt;
  &lt;li&gt;매핑 구현
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Entity&lt;/code&gt;: 애그리거트 루트 클래스&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Embeddable&lt;/code&gt;: 밸류 클래스&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Embedded&lt;/code&gt;: 밸류 타입 프로퍼티&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;코드 예시는 책 참조&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@AttributeOverrides&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Embeddable&lt;/code&gt;에 설정한 컬럼 이름과 실제 컬럼 이름이 다른 경우 매핑할 컬럼 이름을 변경할 때 사용&lt;/li&gt;
  &lt;li&gt;JPA 2부터 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Embeddable&lt;/code&gt;은 중첩을 허용: 밸류 클래스가 또 다른 밸류 클래스를 포함할 수 있음&lt;/li&gt;
  &lt;li&gt;기본 생성자: JPA로 클래스를 매핑하려면 기본 생성자를 제공해야 함
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;protected&lt;/code&gt;로 선언하자. 프록시 클래스에서 상위 클래스의 기본 생성자를 호출할 수 있어야하기 때문&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;매핑 방법: 필드 방식 vs 프로퍼티 방식 (메소드 방식)
    &lt;ul&gt;
      &lt;li&gt;프로퍼티 방식은 불필요한 public set, get 메소드를 추가하게되므로 바람직하지 않음&lt;/li&gt;
      &lt;li&gt;필드 방식을 사용하는 것이 바람직함 (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Access(AccessType.FIELD)&lt;/code&gt;)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>Jang Junyeong</name></author><category term="DDD" /><category term="DDD" /><summary type="html">JPA를 사용해서 리포지터리를 구현해보자</summary></entry><entry><title type="html">[Docker Mastery] Section 1. Quick Start!</title><link href="https://joyyir.github.io/cloud/docker-mastery-sec-01/" rel="alternate" type="text/html" title="[Docker Mastery] Section 1. Quick Start!" /><published>2023-01-09T13:00:00+09:00</published><updated>2023-01-09T13:00:00+09:00</updated><id>https://joyyir.github.io/cloud/docker-mastery-sec-01</id><content type="html" xml:base="https://joyyir.github.io/cloud/docker-mastery-sec-01/">&lt;p&gt;Udemy &lt;a href=&quot;https://www.udemy.com/course/docker-mastery&quot;&gt;Docker Mastery: with Kubernetes +Swarm from a Docker Captain&lt;/a&gt; 강의를 기반으로 정리합니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;핵심 아이디어: Build -&amp;gt; Ship -&amp;gt; Run&lt;/li&gt;
  &lt;li&gt;Docker의 세 가지 혁신
    &lt;ol&gt;
      &lt;li&gt;Docker image&lt;/li&gt;
      &lt;li&gt;Docker registry&lt;/li&gt;
      &lt;li&gt;Docker container&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Docker image
    &lt;ul&gt;
      &lt;li&gt;Dockerfile &amp;amp; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker build&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Docker registry
    &lt;ul&gt;
      &lt;li&gt;Docker Hub (default), GitHub, Bitbucket, …&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Docker container
    &lt;ul&gt;
      &lt;li&gt;관련 Linux 기술: namespace, cgroups, veth, iptables, union mount&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://labs.play-with-docker.com&quot;&gt;Play With Docker&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Docker client, Docker server&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker run -d -p 8800:80 httpd&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;왜 Docker를 써야하는가?
    &lt;ol&gt;
      &lt;li&gt;Isolation
        &lt;ul&gt;
          &lt;li&gt;better isolation in a single OS&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Environments
        &lt;ul&gt;
          &lt;li&gt;reduced environment variances&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Speed (of business)
        &lt;ul&gt;
          &lt;li&gt;increase speed of change&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;생각&quot;&gt;생각&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;왜 Docker를 써야하는가?&lt;/strong&gt; 이 부분이 이번 강의의 핵심인 것 같다. 컴퓨팅 자원을 격리시켜서 사용할 수 있다는 점, 다양한 환경에서 일관된 방식으로 사용할 수 있다는 점, 비즈니스 요구에 빠르게 대응할 수 있다는 점이 Docker를 사용하는 이유인 것 같다.&lt;/p&gt;</content><author><name>Jang Junyeong</name></author><category term="Cloud" /><summary type="html">Section 1. Quick Start!</summary></entry><entry><title type="html">[데이터 중심 애플리케이션 설계] 3장 - 저장소와 검색</title><link href="https://joyyir.github.io/data-intensive-apps-03/" rel="alternate" type="text/html" title="[데이터 중심 애플리케이션 설계] 3장 - 저장소와 검색" /><published>2021-06-11T13:00:00+09:00</published><updated>2021-06-11T13:00:00+09:00</updated><id>https://joyyir.github.io/data-intensive-apps-03</id><content type="html" xml:base="https://joyyir.github.io/data-intensive-apps-03/">&lt;ul&gt;
  &lt;li&gt;데이터베이스가 데이터를 저장하는 방법과 데이터를 요청했을 때 다시 찾는 방법을 알아보자.&lt;/li&gt;
  &lt;li&gt;애플리케이션에 적합한 엔진을 선택하려면 저장소 엔진 내부에서 일어나는 일을 대략적으로라도 알아야한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;데이터베이스를-강력하게-만드는-데이터-구조&quot;&gt;데이터베이스를 강력하게 만드는 데이터 구조&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;로그(log) : append-only 데이터 파일. 일반적으로 파일 추가 작업은 매우 효율적이다.&lt;/li&gt;
  &lt;li&gt;로그에서 데이터를 찾으려면 모든 데이터를 뒤져야하므로 검색 비용은 O(n)이다. 데이터가 많아질수록 검색도 오래 걸리므로 바람직 하지 않다. 그래서 필요한 것이 색인이다.&lt;/li&gt;
  &lt;li&gt;색인(index) : 특정 키의 값을 효율적으로 찾기 위한 데이터 구조&lt;/li&gt;
  &lt;li&gt;색인은 읽기 질의 속도를 향상시키지만 쓰기 속도를 떨어뜨린다. (trade-off) 그래서 데이터베이스가 모든 데이터를 자동으로 색인하지 않고 사람이 질의 패턴을 파악해서 수동으로 가장 효율적인 색인을 지정한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;해시-색인&quot;&gt;해시 색인&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;키-값 데이터를 색인하기 위함&lt;/li&gt;
  &lt;li&gt;인메모리에 디스크 상의 데이터를 색인한 데이터 구조를 저장
    &lt;ul&gt;
      &lt;li&gt;가장 간단한 전략 : 키를 데이터 파일의 바이트 오프셋에 매핑해 인메모리에 해시 맵을 유지하는 방법
        &lt;ul&gt;
          &lt;li&gt;매우 단순해 보이지만 실제로 많이 사용. (Bitcask)&lt;/li&gt;
          &lt;li&gt;Bitcask는 RAM에 모든 키가 저장된다는 조건을 전제로 고성능으로 읽기, 쓰기를 보장함&lt;/li&gt;
          &lt;li&gt;각 키의 값이 자주 갱신되는 상황에 매우 적합 (ex. key가 동영상URL, value가 동영상 재생된 횟수인 경우)&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;log에 append만 하면 결국 디스크 공간이 부족해지지 않나?
    &lt;ul&gt;
      &lt;li&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;컴팩션과 병합은 백그라운드 스레드에서 수행할 수 있음&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;이제 각 세그먼트는 키와 바이트 오프셋이 매핑된 자체 인메모리 해시 테이블을 갖는다.
    &lt;ul&gt;
      &lt;li&gt;키에 값을 찾을 때 가장 최신 세그먼트 해시 맵을 뒤지고 없으면 그 다음 최신 세그먼트의 해시 맵을 뒤진다. 이것을 키가 발견될 때까지 반복한다.&lt;/li&gt;
      &lt;li&gt;컴팩션와 병합에 의해 세그먼트 수는 적게 유지되므로 뒤져야할 해시 맵도 많지 않다.&lt;/li&gt;
      &lt;li&gt;이를 실제 구현할 때 고려해야될 사항 중에 일부 중요한 점들
        &lt;ul&gt;
          &lt;li&gt;파일 형식 : 텍스트 형식보다 바이너리 형식이 낫다&lt;/li&gt;
          &lt;li&gt;레코드 삭제 : tombstone이 필요함&lt;/li&gt;
          &lt;li&gt;고장(crash) 복구 : 데이터베이스가 재시작되면 인메모리 해시 맵은 날라가는데 이를 어떻게 복구할 것인가? 다시 해시 맵을 만들려면 오랜 시간이 걸릴 수도 있다. Bitcask는 해시 맵의 스냅숏을 디스크에 저장해 복구 속도를 높인다.&lt;/li&gt;
          &lt;li&gt;부분적으로 레코드 쓰기 : ?&lt;/li&gt;
          &lt;li&gt;동시성 제어 : 쓰기는 하나의 스레드만 사용 (순차적으로 로그를 추가해야하므로). 읽기는 다중 스레드 사용 가능 (세그먼트는 추가 전용이거나 불변이므로).&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;‘추가 전용 로그’의 이점
    &lt;ul&gt;
      &lt;li&gt;순차 쓰기 작업이 무작위 쓰기 작업보다 훨씬 빠름&lt;/li&gt;
      &lt;li&gt;동시성과 고장 복구 간단함 : 세그먼트가 추가 전용이거나 불변이고, 이전 값과 새로운 값을 둘다 가지고 있기 때문&lt;/li&gt;
      &lt;li&gt;세그먼트 병합을 통해 데이터 파일의 조각화 문제를 피할 수 있음&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;‘해시 색인’의 제한 사항
    &lt;ul&gt;
      &lt;li&gt;메모리 크기 이상으로 키가 너무 많으면 문제
        &lt;ul&gt;
          &lt;li&gt;메모리가 부족해서 디스크에 해시 맵을 저장하게되면 성능이 매우 떨어지게 된다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;해시 테이블은 range query에 효율적이지 않음 : range 내의 모든 키를 조회해야함&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;ss테이블과-lsm-트리&quot;&gt;SS테이블과 LSM 트리&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;위에서 얘기한 해시 색인의 제한 사항을 극복해보자.&lt;/li&gt;
  &lt;li&gt;세그먼트 파일에 기록된 키-값 쌍을 키로 정렬하자. 키로 정렬된 형식을 SS테이블 (Sorted String Table) 이라고 한다.&lt;/li&gt;
  &lt;li&gt;SS테이블은 순차 쓰기를 사용할 수 없게 만드는 것 같지만 아니다! 여전히 순차 쓰기를 유지할 수 있다. (뒤에서 살펴보자)&lt;/li&gt;
  &lt;li&gt;해시 색인을 가진 로그 세그먼트보다 SS테이블이 나은 점
    &lt;ul&gt;
      &lt;li&gt;세그먼트 병합이 효율적 : 머지 소트 알고리즘과 유사&lt;/li&gt;
      &lt;li&gt;해시 테이블에 모든 키를 유지하지 않아도 됨 : 세그먼트 파일 내부는 정렬되어 있으므로 몇몇 키의 오프셋만 알면 약간의 탐색만으로 키-값을 찾을 수 있다.&lt;/li&gt;
      &lt;li&gt;세그먼트 내의 레코드들을 블록으로 그룹화하고 디스크에 쓰기 전에 압축할 수 있음. 해시 색인에서는 이 블록의 시작 오프셋을 가리키게 됨. 압축을 통해 디스크 공간 절약이 절약되고 I/O 대역폭 사용도 줄임&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure style=&quot;width: 600px&quot;&gt;
  &lt;img src=&quot;https://joyyir.github.io/assets/images/merge-sstable-segments.png&quot; alt=&quot;&quot; /&gt;
  &lt;figcaption style=&quot;text-align: center&quot;&gt;여러 SS테이블 세그먼트를 병합해서 각 키의 최신 값만을 유지&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure style=&quot;width: 600px&quot;&gt;
  &lt;img src=&quot;https://joyyir.github.io/assets/images/sstable-with-inmemory-index.png&quot; alt=&quot;&quot; /&gt;
  &lt;figcaption style=&quot;text-align: center&quot;&gt;인메모리 색인을 가진 SS테이블&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;순차 쓰기를 사용하면서 SS테이블을 유지하려면 어떻게 해야할까?
    &lt;ul&gt;
      &lt;li&gt;쓰기가 들어오면 세그먼트 파일에 기록하는 것이 아니라 인메모리 균형트리 데이터 구조에 추가. 이 인메모리 트리는 멤테이블(memtable)이라고도 함&lt;/li&gt;
      &lt;li&gt;멤테이블의 크기가 임계값보다 커지면 SS테이블 파일로 디스크에 기록&lt;/li&gt;
      &lt;li&gt;읽기 요청이 들어오면 먼저 멤테이블에서 키를 찾고 없으면 디스크 상의 가장 최근 세그먼트부터 찾는다.&lt;/li&gt;
      &lt;li&gt;백그라운드에서는 세그먼트 파일의 컴팩션과 병합이 수행된다.&lt;/li&gt;
      &lt;li&gt;갑자기 데이터베이스가 고장났을 때 멤테이블이 날아갈 수도 있지 않나? -&amp;gt; 쓰기 요청을 별도의 로그로 디스크에 저장해야함&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;위의 알고리즘은 LevelDB, RocksDB, 카산드라, HBase 등에서 사용된다.&lt;/li&gt;
  &lt;li&gt;LSM 트리 (Log-structured Merge-tree) : “로그 구조화 병합 트리”. 정렬된 파일 형합과 컴팩션 원리를 기반으로 하는 저장소 엔진을 LSM 저장소 엔진이라고 부름&lt;/li&gt;
  &lt;li&gt;Lucene에서 term dictionary를 저장하기 위해 유사한 방법을 사용함. key=term, value=term을 포함한 모든 문서의 ID 목록&lt;/li&gt;
  &lt;li&gt;LSM 저장소 엔진의 성능 최적화
    &lt;ul&gt;
      &lt;li&gt;존재하지 않는 키를 찾기 위해 가장 오래된 세그먼트까지 조회해야하는 문제 : 블룸 필터 적용하여 최적화&lt;/li&gt;
      &lt;li&gt;SS테이블을 컴팩션하고 병합하는 전략 : 1) 크기 계층, 2) 레벨 컴팩션&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;LSM 트리의 장점
    &lt;ul&gt;
      &lt;li&gt;범위 질의를 효율적으로 할 수 있음&lt;/li&gt;
      &lt;li&gt;여전히 디스크 순차 쓰기 가능하여 높은 쓰기 성능&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;여기까지-내-나름대로-정리를-다시-해보자&quot;&gt;여기까지 내 나름대로 정리를 다시 해보자.&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;버전1) 세그먼트 단위의 로그 파일 (키 기준으로 정렬되어있지 않음) + 각 세그먼트 별로 인메모리 해시 색인 (세그먼트의 모든 키를 저장) + 백그라운드 컴팩션 및 병합
    &lt;ul&gt;
      &lt;li&gt;버전1의 문제점은 메모리에 모든 키에 대한 해시 색인을 올려야한다는 점. 또한 범위 질의에 비효율적이라는 점이 있다. 이를 극복하기 위해 버전2인 LSM 트리가 나왔다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;버전2 = LSM 트리) 멤테이블 (세그먼트를 디스크에 쓰기 전에 정렬된 순서로 담아두는 자료구조) + 세그먼트 단위의 로그 파일 (= SS테이블, 키 기준으로 정렬되어 있음)  + 각 세그먼트 별로 인메모리 해시 색인 (세그먼트의 모든 키를 저장하지 않고 블록 단위의 시작점이 저장된다)
    &lt;ul&gt;
      &lt;li&gt;읽기는 멤테이블 -&amp;gt; 세그먼트 인메모리 해시 색인 -&amp;gt; 세그먼트 파일 읽기 순으로 이루어짐&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;SS테이블은 디스크에 저장되는 파일일 뿐이다.
    &lt;ul&gt;
      &lt;li&gt;key-value 데이터가 key 기준으로 정렬되어 저장됨&lt;/li&gt;
      &lt;li&gt;index도 포함하고 있음 (key:offset)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;LSM 트리에서 디스크 컴포넌트 구현체 중에 하나가 SS테이블인 것이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;b-트리&quot;&gt;B 트리&lt;/h2&gt;

&lt;figure style=&quot;width: 600px&quot;&gt;
  &lt;img src=&quot;https://joyyir.github.io/assets/images/b-tree-index-look-up-key.png&quot; alt=&quot;&quot; /&gt;
  &lt;figcaption style=&quot;text-align: center&quot;&gt;B 트리 색인을 이용한 키 검색&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;가장 널리 쓰이는 보편적인 색인 구조임&lt;/li&gt;
  &lt;li&gt;LSM 트리와 설계 철학이 매우 다름&lt;/li&gt;
  &lt;li&gt;LSM과 달리 고정 크기의 블록이나 페이지 단위로 읽고 쓴다. 디스크도 고정 크기 블록으로 배열되어 있기 때문에 하드웨어와 좀더 밀접하다고 할 수 있음&lt;/li&gt;
  &lt;li&gt;개념들 : root, leaf page, branching factor&lt;/li&gt;
  &lt;li&gt;신뢰할 수 있는 B 트리 만들기
    &lt;ul&gt;
      &lt;li&gt;LSM 트리와 다르게 새로운 데이터를 디스크 상의 페이지에 덮어 쓴다. (덮어 쓰기를 하면 이 페이지를 참조하는 위치 값을 바꿀 필요 없음)&lt;/li&gt;
      &lt;li&gt;덮어쓰기하다가 데이터베이스가 고장나면? 고아 페이지가 생길 수도 있다. (부모가 없는 페이지)
        &lt;ul&gt;
          &lt;li&gt;쓰기 전 로그(write-ahead log, WAL) 혹은 재실행 로그(redo log)를 유지하여 해결한다. 이를 이용해 고장 이후 복구한다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;동시성 제어 : LSM 트리보다 까다롭다. 같은 자리의 페이지를 갱신하는 작업이 다중 스레드로 동시에 이루어질 수 있는 위험이 있다. 보통 latch로 트리의 데이터 구조를 보호한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;B 트리 최적화 하기
    &lt;ul&gt;
      &lt;li&gt;WAL 대신에 copy-on-write 사용&lt;/li&gt;
      &lt;li&gt;페이지에 키 전체를 저장하는 대신 키를 추적해서 저장 (B+ 트리)&lt;/li&gt;
      &lt;li&gt;리프 페이지를 디스크 상에 연속된 순서로 나타나게끔 트리를 배치 -&amp;gt; 하지만 트리가 커지면 순서를 유지하기 어려움&lt;/li&gt;
      &lt;li&gt;리프 페이지가 양쪽 형제 페이지의 참조를 가지게 하기 (상위 페이지로 다시 이동하지 않아도 순서대로 키를 스캔할 수 있음)&lt;/li&gt;
      &lt;li&gt;프랙탈 트리 같은 B 트리 변형 사용&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;b-트리와-lsm-트리-비교&quot;&gt;B 트리와 LSM 트리 비교&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;경험적으로 LSM 트리는 보통 쓰기에서 더 빠르고, B 트리는 읽기에서 더 빠르다고 여김&lt;/li&gt;
  &lt;li&gt;경험적으로 그렇다는 것이고 실제 작업 부하를 가지고 테스트하는게 제일 정확하다.&lt;/li&gt;
  &lt;li&gt;LSM 트리 장점 (B 트리 단점)
    &lt;ul&gt;
      &lt;li&gt;“쓰기 증폭” 개념 : 데이터베이스에 쓰기 한 번에 데이터베이스 수명 동안 여러 번의 쓰기를 야기하는 효과&lt;/li&gt;
      &lt;li&gt;B 트리는 한 번 쓰기 작업에 최소한 두 번 기록해야함 (WAL에 한번, 트리 페이지에 한번). 또한 페이지 내에 몇 바이트만 바뀌어도 페이지 전체를 덮어써야함&lt;/li&gt;
      &lt;li&gt;LSM 트리가 상대적으로 쓰기 증폭이 더 낮고 디스크에 순차적으로 쓰기 때문에 보통 B 트리보다 쓰기 처리량이 높음&lt;/li&gt;
      &lt;li&gt;LSM 트리는 압축률도 더 좋음. 파편화도 덜 발생함&lt;/li&gt;
      &lt;li&gt;낮은 쓰기 증폭과 파편화 감소는 SSD의 경우 훨씬 유리함&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;LSM 트리 단점 (B 트리 장점)
    &lt;ul&gt;
      &lt;li&gt;컴팩션 과정이 때로 읽기와 쓰기 성능에 영향을 줌
        &lt;ul&gt;
          &lt;li&gt;컴팩션이 끝날 때까지 요청을 대기해야 하는 상황이 발생하기 쉬움&lt;/li&gt;
          &lt;li&gt;반면 B 트리의 성능은 예측하기 쉽다&lt;/li&gt;
          &lt;li&gt;컴팩션의 높은 쓰기 처리량 때문에 로깅이나 멤테이블을 디스크로 쓰는 작업에 영향을 준다.&lt;/li&gt;
          &lt;li&gt;컴팩션이 유입 쓰기 속도를 따라가지 못하는 상황이 발생할 수 있음
            &lt;ul&gt;
              &lt;li&gt;이런 상황을 감지하기 위한 명시적 모니터링이 필요함&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;B 트리의 장점
        &lt;ul&gt;
          &lt;li&gt;키가 색인의 한 곳에만 정확하게 존재함
            &lt;ul&gt;
              &lt;li&gt;덕분에 강력한 트랜잭션 시멘틱을 제공할 수 있게 됨 (트리에 직접 잠금)&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;역사가 이미 깊고 많은 작업 부하에 대해 지속적으로 좋은 성능을 제공해왔으므로 곧 사라질 가능성은 거의 없음&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;느낀-점&quot;&gt;느낀 점&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;데이터베이스 엔진의 내부 구조를 이렇게 깊게 공부해본 것이 처음이어서 흥미로웠다. 그리고 이러한 내부 구조도 모르고 여태까지 데이터베이스를 써온 것이 민망해졌다.&lt;/li&gt;
  &lt;li&gt;내부 데이터 구조의 발상 자체는 심플하지만 신경 써야할 세부 구현이 엄청 많은 것을 알게 되었다. (동시성, 장애 복구, 디스크 I/O 성능 등)&lt;/li&gt;
  &lt;li&gt;로그 하면 애플리케이션 로그만 떠올렸는데 로그가 데이터베이스의 핵심이라는 것을 알게 되었고, 로그의 강력함을 알게 되었다.&lt;/li&gt;
  &lt;li&gt;RDB를 쓰든 NoSQL을 쓰든 내부 동작 방식을 이해하는 것이 매우 중요함을 알게 되었다. 내부 동작 방식을 이해해야만 작업 부하에 적합한 데이터베이스를 선택할 수 있기 때문이다. 역시 기초가 제일 중요하다!&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Jang Junyeong</name></author><summary type="html">데이터베이스가 데이터를 저장하는 방법과 데이터를 요청했을 때 다시 찾는 방법을 알아보자</summary></entry><entry><title type="html">SOLID 원칙 정리</title><link href="https://joyyir.github.io/design%20pattern/solid/" rel="alternate" type="text/html" title="SOLID 원칙 정리" /><published>2021-05-16T13:00:00+09:00</published><updated>2021-05-16T13:00:00+09:00</updated><id>https://joyyir.github.io/design%20pattern/solid</id><content type="html" xml:base="https://joyyir.github.io/design%20pattern/solid/">&lt;h3 id=&quot;solid&quot;&gt;SOLID&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Robert C. Martin (Uncle Bob)이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20150906155800/http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf&quot;&gt;Design Principles and Design Patterns, Robert C. Martin, 2000 (pdf)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;단일-책임-원칙-single-responsibility-principle-srp&quot;&gt;단일 책임 원칙, Single Responsibility Principle, SRP&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;정의 : &lt;em&gt;“클래스를 변경할 이유는 오직 한 가지 뿐이어야만 한다.”&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;책임&lt;/code&gt;이란? : &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;변경의 이유&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;예시 : Modem이란 인터페이스가 1) 전화걸기, 2) 전화끊기, 3) 보내기, 4) 받기 총 4개의 메소드를 가진다고 가정하자. 이 인터페이스는 대충 생각해보기에는 어색할게 없어보인다. 하지만 책임을 뜯어서 보면, 연결 관리(1, 2)와 데이터 통신(3, 4)이라는 두 가지 책임으로 나뉠 수 있다. 이에 따라 Connection, Data Channel이라는 두 개의 인터페이스로 분리하면 더 좋은 설계가 된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;개방-폐쇄-원칙-open-closed-principle-ocp&quot;&gt;개방-폐쇄 원칙, Open-Closed Principle, OCP&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;정의 : &lt;em&gt;“모듈은 확장에는 열려있고 수정에는 닫혀있어야 한다.”&lt;/em&gt;
    &lt;ul&gt;
      &lt;li&gt;즉, 모듈의 수정 없이도(closed) 모듈이 하는 일을 바꿀(open) 수 있어야 한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;“추상화”가 핵심이다.&lt;/li&gt;
  &lt;li&gt;나의 이해 : 인터페이스를 사용해서 코드를 작성하라는 뜻이다. 인터페이스를 사용해서 코드를 작성하면 구현체를 갈아끼우는 방식으로 기존 코드 변경 없이도 기능을 바꿀 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;리스코프-치환-원칙-liskov-substitution-principle-lsp&quot;&gt;리스코프 치환 원칙, Liskov Substitution Principle, LSP&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;리스코프는 MIT의 컴퓨터 과학자 이름&lt;/li&gt;
  &lt;li&gt;정의 : &lt;em&gt;“부모 클래스의 포인터/레퍼런스를 사용하는 함수/메소드는 어떤 자식 클래스인지 모르더라도 그 자식 클래스의 객체를 사용할 수 있어야한다”&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;나의 이해 : 상속과 관련된 내용이다. 자식 클래스는 부모 클래스에서 가능한 모든 행위를 하도록 구현되어야 한다. 메소드 파라미터로 부모 클래스 객체를 받아놓고 instanceof 연산으로 어떤 자식 클래스인지 확인하고 다운캐스팅해서 사용한다면 LSP 위반이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;인터페이스-분리-원칙-interface-segregation-principle-isp&quot;&gt;인터페이스 분리 원칙, Interface Segregation Principle, ISP&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;정의 : &lt;em&gt;“클라이언트는 자신이 사용하지 않는 메소드에 의존하지 않아야 한다.”&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;범용 인터페이스를 사용하지 말고 클라이언트에 특화된 인터페이스를 사용해라. 클래스가 A, B, C 기능을 한다고 했을 때, A 기능의 변경으로 인해 B, C 기능이 영향을 받으면 안된다. A, B, C를 인터페이스로 분리해야한다.&lt;/li&gt;
  &lt;li&gt;복합기 예시 : 복합기는 클라이언트 필요에 따라 프린터, 팩스, 복사기 중 하나의 기능만 이용할 수 있다. 프린터 기능을 이용하는 클라이언트가 팩스 기능의 변경으로 인해 발생하는 문제의 영향을 받지 않도록 해야한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;의존-역전-원칙-dependency-inversion-principle-dip&quot;&gt;의존 역전 원칙, Dependency Inversion Principle, DIP&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;정의 : &lt;em&gt;“상위 계층이 하위 계층에 의존하는 전통적인 의존 관계를 역전시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다”&lt;/em&gt;
    &lt;ol&gt;
      &lt;li&gt;상위 모듈과 하위 모듈 모두 추상화에 의존해야한다. 상위 모듈은 하위 모듈에 의존해서는 안된다.&lt;/li&gt;
      &lt;li&gt;추상화는 세부사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야한다.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;다른 표현 : &lt;em&gt;“자신보다 변하기 쉬운 것에 의존하지 마라”&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;기대 효과 : 변화에 유연해진다. (하위 계층이 바뀌어도 상위 계층은 바뀔 필요가 없다)&lt;/li&gt;
  &lt;li&gt;나의 이해 : 인터페이스를 통해 의존 방향을 바꾸는 것. A -&amp;gt; B 였던 의존성 방향을 A -&amp;gt; «abstract»C &amp;lt;- B 이렇게 의존 방향을 역전 시키는 것. 이렇게 하는 이유는? B는 바뀌기 쉬운 애임. 전자의 경우는 B가 바뀔 때마다 A가 바뀌어야함. 이러면 유지보수 비용이 많이 들고, 버그 가능성도 높다. 한마디로 깔끔한 설계가 아닌 것. 후자의 경우는 C가 B보다 훨씬 적게 변경되기 때문에 B가 변경되어도 A와 C는 변경할 것이 없다. 그리고 언제든 B 대신 C를 구현하는 다른 클래스의 객체로 갈아끼울 수 있다. 즉, 코드 재사용성이 높아진다. 이는 OCP 원칙에 부합된다.&lt;/li&gt;
  &lt;li&gt;DIP vs DI (Dependency Injection) : DI는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;의존성 주입&lt;/code&gt;이라고 하며, 필요로 하는 객체를 직접 생성하지 말고 외부로 부터 주입 받는 기법을 의미한다. DI가 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;의존성을 어떻게 가질 것인가 (직접 생성하지 않고 외부로 부터 주입받기)&lt;/code&gt;에 대한 문제라면, DIP는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;의존성이 실체에 의존할 것인가 추상화에 의존할 것인가&lt;/code&gt;의 문제이다. DIP와 DI가 결합되었을 때 시너지가 발휘된다.&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Jang Junyeong</name></author><category term="Design Pattern" /><category term="SOLID" /><summary type="html">객체 지향 프로그래밍 및 설계의 기본 원칙을 알아보자</summary></entry><entry><title type="html">[Front-end] 인프런 강의 ‘실습 UI 개발로 배워보는 순수 javascript 와 VueJS 개발’ 정리</title><link href="https://joyyir.github.io/front-end/vue-js-inflearn/" rel="alternate" type="text/html" title="[Front-end] 인프런 강의 ‘실습 UI 개발로 배워보는 순수 javascript 와 VueJS 개발’ 정리" /><published>2020-03-03T13:00:00+09:00</published><updated>2020-03-03T13:00:00+09:00</updated><id>https://joyyir.github.io/front-end/vue-js-inflearn</id><content type="html" xml:base="https://joyyir.github.io/front-end/vue-js-inflearn/">&lt;h2 id=&quot;강의-내용-간단-정리&quot;&gt;강의 내용 간단 정리&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;실습 예제 : 쇼핑몰 사이트 검색 페이지&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/vue-js-inflearn.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;pure javascript로 MVC 패턴을 이용하여 구현
    &lt;ul&gt;
      &lt;li&gt;개발 : &lt;a href=&quot;https://github.com/joyyir/lecture-vue/compare/1-vanilla/scafolding...joyyir:1-vanilla/jyjang&quot;&gt;github compare&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;특징
        &lt;ul&gt;
          &lt;li&gt;dom을 직접 조작하는 로직이 주를 이룸&lt;/li&gt;
          &lt;li&gt;Model(데이터 조작), View(말그대로 화면), Controller(Model과 View 사이를 중재)&lt;/li&gt;
          &lt;li&gt;대략적인 flow : View를 통해 사용자 입력이 들어옴 -&amp;gt; View는 이벤트를 발생시킴(.emit) -&amp;gt; Controller는 이 이벤트를 받아서(.on) Model을 통해 데이터를 조작하거나 다른 View에 일을 시킴&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;View에서 이벤트를 발생시키고, 이벤트 핸들러를 등록하는 메소드&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;c1&quot;&gt;// View.js의 일부&lt;/span&gt;
 &lt;span class=&quot;nx&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

 &lt;span class=&quot;nx&quot;&gt;emit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CustomEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;detail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dispatchEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Vue.js로 MVVM 패턴을 이용하여 구현
    &lt;ul&gt;
      &lt;li&gt;개발 : &lt;a href=&quot;https://github.com/joyyir/lecture-vue/compare/2-vue/scafolding...joyyir:2-vue/jyjang&quot;&gt;github compare&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;특징
        &lt;ul&gt;
          &lt;li&gt;1번 구현에 비해 소스 양이 현저하게 줄어듦 (dom을 직접 조작하는 소스가 사라지고 데이터만 조작함)&lt;/li&gt;
          &lt;li&gt;그러나 아직 탬플릿이 컴포넌트 단위로 쪼개져있지 않고 통으로 합쳐져있음 (index.html)&lt;/li&gt;
          &lt;li&gt;마찬가지로 데이터와 메소드도 컴포넌트 단위로 쪼개져있지 않고 통으로 합쳐져있음 (app.js)&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Vue.js 컴포넌트로 구현
    &lt;ul&gt;
      &lt;li&gt;개발 : &lt;a href=&quot;https://github.com/joyyir/lecture-vue/compare/3-component/scafolding...joyyir:3-component/jyjang&quot;&gt;github compare&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;특징
        &lt;ul&gt;
          &lt;li&gt;탬플릿을 컴포넌트 단위로 쪼개긴 했으나 하나의 파일에 모아져있음 (index.html)&lt;/li&gt;
          &lt;li&gt;데이터와 메소드는 컴포넌트 단위로 쪼개짐 (XXXComponent.js)&lt;/li&gt;
          &lt;li&gt;app.js가 각 컴포넌트를 통합하는 역할을 함 (1번 구현의 MainController.js와 역할이 비슷)&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Vue.js 단일 파일 컴포넌트로 구현 (.vue 파일)
    &lt;ul&gt;
      &lt;li&gt;개발 : &lt;a href=&quot;https://github.com/joyyir/lecture-vue/compare/4-singleFileComponent/scafolding...joyyir:4-singleFileComponent/jyjang&quot;&gt;github compare&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;특징
        &lt;ul&gt;
          &lt;li&gt;탬플릿까지 컴포넌트 단위의 .vue 파일로 관리됨&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;pure-javascript로-mvvm을-구현한-예시&quot;&gt;pure javascript로 MVVM을 구현한 예시&lt;/h2&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;viewModel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;''&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;defineProperty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;viewModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;innerHTML&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;viewModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;hello world&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// viewModel.model 값을 바꿀 때마다 h1의 텍스트가 변경된다.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;유용한-툴&quot;&gt;유용한 툴&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;lite-server &lt;a href=&quot;https://www.npmjs.com/package/lite-server&quot;&gt;https://www.npmjs.com/package/lite-server&lt;/a&gt; : 경량의 노드 웹 서버를 띄운다. 로컬 파일의 변경사항을 자동으로 싱크해준다. 파일을 수정할 때마다 일일이 브라우저를 새로고침할 필요 없다. 매우 편리함!!!&lt;/li&gt;
  &lt;li&gt;vue cli &lt;a href=&quot;https://cli.vuejs.org/guide/installation.html&quot;&gt;https://cli.vuejs.org/guide/installation.html&lt;/a&gt; : Vue 프로젝트 뼈대를 손쉽게 만들어준다. Spring Boot Cli와 비슷한 느낌&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;생각&quot;&gt;생각&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;pure javascript로 MVC 패턴만 잘 지켜도 꽤 유지보수하기 좋은 코드가 되겠다. 난 여태까지 엄청 근본도 없이 프론트엔드를 짰구나싶다&lt;/li&gt;
  &lt;li&gt;vue로 짜면 학습비용이 있긴 하지만 훨씬 코드가 간결해지고 유지보수하기 쉬워지고 생산성도 높아지겠다는 생각이 들었다.&lt;/li&gt;
  &lt;li&gt;view model 덕분에 자질구래한 dom 조작을 할 필요가 없어서 너무 편하다. dom을 조작하면서 생기는 버그도 현저하게 줄어들 것 같다.&lt;/li&gt;
  &lt;li&gt;vue에서는 template, data, methods까지 하나의 파일로 묶어서 관리하니까 모듈화의 이점을 잘 살릴 수 있을 것 같다. 재사용성도 늘어나고, 해보진 않았지만 테스트도 가능해지지 않을까 싶다. 객체지향에서의 객체 개념에 template이 추가된 느낌이다.&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Jang Junyeong</name></author><category term="Front-end" /><category term="VueJS" /><summary type="html">VueJS 첫 걸음!</summary></entry><entry><title type="html">[Java] ThreadPoolExecutor 알아보기</title><link href="https://joyyir.github.io/java/thread-pool-executor/" rel="alternate" type="text/html" title="[Java] ThreadPoolExecutor 알아보기" /><published>2020-03-02T13:00:00+09:00</published><updated>2020-03-02T13:00:00+09:00</updated><id>https://joyyir.github.io/java/thread-pool-executor</id><content type="html" xml:base="https://joyyir.github.io/java/thread-pool-executor/">&lt;h2 id=&quot;threadpoolexecutor&quot;&gt;ThreadPoolExecutor&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;출처 Java Documentation : &lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html&quot;&gt;링크&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;ul&gt;
  &lt;li&gt;제출된 task들을 스레드 풀의 여러 스레드를 이용해 실행하는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutorService&lt;/code&gt; 구현체&lt;/li&gt;
  &lt;li&gt;예시 코드
    &lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@Test&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corePoolSize&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;maximumPoolSize&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;queueCapacity&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ThreadPoolExecutor&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;executor&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;corePoolSize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                                 &lt;span class=&quot;n&quot;&gt;maximumPoolSize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                                 &lt;span class=&quot;mi&quot;&gt;1L&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                                 &lt;span class=&quot;nc&quot;&gt;TimeUnit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;MINUTES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                                 &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ArrayBlockingQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;queueCapacity&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Runnable&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;thread:&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;currentThread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;};&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;executor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;executor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;executor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;executor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;executor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;executor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;executor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;executor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// prevent main method termination&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;millis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;millis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;InterruptedException&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Console output
    &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;thread:pool-1-thread-1
thread:pool-1-thread-2
thread:pool-1-thread-3
thread:pool-1-thread-4
thread:pool-1-thread-5
thread:pool-1-thread-5
thread:pool-1-thread-4
thread:pool-1-thread-1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;팩토리 메소드로 간편하게 생성할 수도 있음
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Executors.newCachedThreadPool()&lt;/code&gt; : 스레드 개수 제한이 없는 스레드풀&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Executors.newFixedThreadPool(int)&lt;/code&gt; : 스레드 개수 제한이 있는 스레드풀&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Executors.newSingleThreadExecutor()&lt;/code&gt; : 스레드가 1개만 있는 스레드풀&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;팩토리 메소드를 안 쓰고 직접 값을 설정해서 만들 수도 있음&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;threadpoolexecutor-설정값&quot;&gt;ThreadPoolExecutor 설정값&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Core, maximum pool sizes
    &lt;ul&gt;
      &lt;li&gt;ThreadPoolExecutor를 생성한다고 바로 스레드가 생성되는 것은 아니다.
        &lt;ul&gt;
          &lt;li&gt;현재 스레드 개수가 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;corePoolSize&lt;/code&gt; 개수 이하인 경우, 새로운 task를 받았을 때 무조건 새로운 스레드가 생성된다. (이미 생성된 스레드가 놀고 있어도 무조건 생성함)&lt;/li&gt;
          &lt;li&gt;현재 스레드 개수가 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;corePoolSize&lt;/code&gt; 이상, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maximumPoolSize&lt;/code&gt; 미만일 경우, queue가 꽉 찼을 때만 새 스레드가 생성된다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;corePoolSize&lt;/code&gt;와 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maximumPoolSize&lt;/code&gt;를 동일하게 설정할 경우 fixed-size thread pool이다.&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maximumPoolSize&lt;/code&gt;를 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Integer.MAX_VALUE&lt;/code&gt;로 설정하면 임의의 수의 동시 작업을 수용하도록 허용하게 된다.&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;corePoolSize&lt;/code&gt;와 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maximumPoolSize&lt;/code&gt;는 보통 생성자에서 설정하지만, setter를 통해 동적으로 변경할 수도 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Keep-alive times
    &lt;ul&gt;
      &lt;li&gt;corePoolSize보다 많은 스레드가 존재할 경우, 초과된 스레드가 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keepAliveTime&lt;/code&gt; 시간동안 놀고 있으면 (idle) 자동으로 개수를 줄인다.&lt;/li&gt;
      &lt;li&gt;역시 이 값도 setter를 통해 동적으로 변경할 수도 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Queuing
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockingQueue&lt;/code&gt;가 사용된다.
        &lt;ul&gt;
          &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockingQueue&lt;/code&gt;란? : 값을 가져오는 입장에서는 큐에 값이 들어오길 기다리고, 값을 저장하는 입장에서는 큐가 비워지길 기다리는 기능을 지원하는 큐. 구현체로는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SynchronousQueue&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LinkedBlockingQueue&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ArrayBlockingQueue&lt;/code&gt; 등이 있음&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;이미 maximumPoolSize개 만큼 스레드가 생성된 상태에서 queue가 꽉 찬 경우, 해당 task는 거부된다. (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RejectedExecutionException&lt;/code&gt; 발생)&lt;/li&gt;
      &lt;li&gt;Queuing 전략
        &lt;ol&gt;
          &lt;li&gt;바로 손 털어버리기 (Direct handoffs)
            &lt;ul&gt;
              &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SynchronousQueue&lt;/code&gt;를 이용하여 task를 큐에 들고있지 않고 바로 스레드로 넘겨버리는 것. 이 전략은 보통 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maximumPoolSizes&lt;/code&gt; 제한을 두지 않는데, 이는 처리량보다 요청량이 많을 경우 스레드 개수가 무한정 늘어날 수 있다.
                &lt;ul&gt;
                  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SynchronousQueue&lt;/code&gt;란? : &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockingQueue&lt;/code&gt;의 일종. 값을 내부 저장하지 않는다. peek 연산이 불가능하다. (remove 연산을 할 때만 값을 얻을 수 있기 때문) 서로 다른 스레드의 두 객체 간의 동기화가 이루어지는 핸드오프 디자인에 적합하다.&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
              &lt;li&gt;This policy avoids lockups when handling sets of requests that might have internal dependencies. ==&amp;gt; 큐잉 할 필요 없이 바로 처리되기 때문 아닐까?&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;Unbounded queues
            &lt;ul&gt;
              &lt;li&gt;크기 제한이 없는 큐 (예시: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;new LinkedBlockingQueue&amp;lt;&amp;gt;()&lt;/code&gt;) 사용&lt;/li&gt;
              &lt;li&gt;스레드는 최대 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;corePoolSize&lt;/code&gt;개 만큼 생성된다. (큐가 꽉 차야 새로운 스레드가 생길텐데, 큐 크기에 제한이 없으니… &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maximumPoolSize&lt;/code&gt;는 아무런 영향이 없는 값이 됨)&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;Bounded queues
            &lt;ul&gt;
              &lt;li&gt;크기 제한이 있는 큐 (예시: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;new ArrayBlockingQueue(10)&lt;/code&gt;) 사용&lt;/li&gt;
              &lt;li&gt;유한한 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maximumPoolSizes&lt;/code&gt;와 함께 사용되었을 때 불필요한 리소스 낭비를 막아줄 수 있다.&lt;/li&gt;
              &lt;li&gt;하지만 적절한 튜닝과 제어가 어렵다. 큐 크기와 pool 크기는 trade-off 관계이므로 적절한 조절이 필요하다.
                &lt;ul&gt;
                  &lt;li&gt;큐 크기는 큰데 pool 크기는 작을 경우 : CPU 사용, OS 자원, 컨텍스트 스위칭 비용은 줄일 수 있지만 처리량(throughput)이 낮아질 수 있다.&lt;/li&gt;
                  &lt;li&gt;큐 크기는 작은데 pool 크기는 클 경우 : CPU를 더 바쁘게 쓸 수 있지만 스케줄링 오버헤드가 생겨서 오히려 처리량이 더 낮아질 수 있다.&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;</content><author><name>Jang Junyeong</name></author><category term="Java" /><category term="Java" /><summary type="html">ThreadPoolExecutor를 사용하여 비동기 작업을 동시에 처리해보자!</summary></entry><entry><title type="html">[Spring Framework] Transaction Management</title><link href="https://joyyir.github.io/spring%20framework/spring-transaction-management/" rel="alternate" type="text/html" title="[Spring Framework] Transaction Management" /><published>2020-01-06T13:00:00+09:00</published><updated>2020-01-06T13:00:00+09:00</updated><id>https://joyyir.github.io/spring%20framework/spring-transaction-management</id><content type="html" xml:base="https://joyyir.github.io/spring%20framework/spring-transaction-management/">&lt;h2 id=&quot;spring-transaction-management&quot;&gt;Spring Transaction Management&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Spring Reference : &lt;a href=&quot;https://docs.spring.io/spring/docs/5.2.2.RELEASE/spring-framework-reference/data-access.html#transaction&quot;&gt;링크&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;transactional-어노테이션-사용하기&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Transactional&lt;/code&gt; 어노테이션 사용하기&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;스프링에서 제공하는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org.springframework.transaction.annotation.Transactional&lt;/code&gt; 어노테이션. 자바 표준인 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;javax.transaction.Transactional&lt;/code&gt;을 사용해도 됨 (단, 스프링이 제공하는 기능을 다 쓰지는 못함)&lt;/li&gt;
  &lt;li&gt;클래스에 붙일 수도 있고, 메소드에 붙일 수도 있음 (클래스에 붙일 경우, 클래스의 모든 메소드에 어노테이션을 붙인 효과)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Transactional&lt;/code&gt;의 디폴트 설정
    &lt;ul&gt;
      &lt;li&gt;전파(propagation) 옵션은 PROPAGATION_REQUIRED.&lt;/li&gt;
      &lt;li&gt;격리 수준(isolation level)은 ISOLATION_DEFAULT.&lt;/li&gt;
      &lt;li&gt;트랜잭션은 read-write 가능.&lt;/li&gt;
      &lt;li&gt;타임아웃 시간은 내부 트랜잭션 시스템의 디폴트값 (없을 수 있음)&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RuntimeException&lt;/code&gt;이 발생하면 롤백 진행 (checked exception은 롤백하지 않음)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;트랜잭션 전파 (Transaction Propagation)
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PROPAGATION_REQUIRED&lt;/code&gt; (default)
&lt;img src=&quot;/assets/images/tx_prop_required.png&quot; alt=&quot;&quot; /&gt;
        &lt;ul&gt;
          &lt;li&gt;하나의 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;물리적 트랜잭션&lt;/code&gt;만 사용함&lt;/li&gt;
          &lt;li&gt;각 메소드 별로 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;논리적 트랜잭션 스코프&lt;/code&gt;가 만들어짐&lt;/li&gt;
          &lt;li&gt;각 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;논리적 트랜잭션 스코프&lt;/code&gt;는 rollback-only 상태를 개별적으로 관리함. 논리적으로 바깥 트랜잭션 스코프와 안쪽 트랜잭션 스코프는 독립적임&lt;/li&gt;
          &lt;li&gt;이러한 스코프들은 결국 같은 물리적 트랜잭션에 매핑됨. 따라서 안쪽 트랜잭션 스코프에서 rollback-only로 마킹된 것이 바깥 트랜잭션에서 커밋할지 말지 여부에 영향을 줌&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PROPAGATION_REQUIRES_NEW&lt;/code&gt;
&lt;img src=&quot;/assets/images/tx_prop_requires_new.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PROPAGATION_NESTED&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;// TODO : jyjang - TBD&lt;/p&gt;</content><author><name>Jang Junyeong</name></author><category term="Spring Framework" /><category term="Spring" /><summary type="html">스프링의 트랜잭션 관리 기능 알아보기</summary></entry><entry><title type="html">부자 아빠 가난한 아빠 - 로버트 기요사키</title><link href="https://joyyir.github.io/personal%20development/rich-dad-poor-dad/" rel="alternate" type="text/html" title="부자 아빠 가난한 아빠 - 로버트 기요사키" /><published>2019-10-27T13:00:00+09:00</published><updated>2019-10-27T13:00:00+09:00</updated><id>https://joyyir.github.io/personal%20development/rich-dad-poor-dad</id><content type="html" xml:base="https://joyyir.github.io/personal%20development/rich-dad-poor-dad/">&lt;h2 id=&quot;20주년-서문&quot;&gt;20주년 서문&lt;/h2&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;16년 동안 내가 받아온 교육은 나를 피고용자로 기르는데 초점이 맞춰져 있다. 열심히 공부해서 좋은 직장에 취업하면 부자가 된다는 허상을 지워야 한다.&lt;/li&gt;
  &lt;li&gt;지금은 정보가 자산인 시대이다. 학습 능력이 무엇보다 중요하다.&lt;/li&gt;
  &lt;li&gt;한 분야에 전문가가 되는 것은 점점 더 구렁텅이에 빠지는 것이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;서문&quot;&gt;서문&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;가난한 아버지 vs 부자 아버지&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;가난한 아버지&lt;/th&gt;
      &lt;th&gt;부자 아버지&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;돈을 사랑하는 것은 모든 악의 근원이다.&lt;/td&gt;
      &lt;td&gt;돈이 부족하다는 것은 모든 악의 근원이다.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;공부 열심히 해서 좋은 대학/직장 가거라.&lt;/td&gt;
      &lt;td&gt;공부 열심히 해서 좋은 투자 대상을 찾아야 한다.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;그런거 살 돈 없다. (단언)&lt;/td&gt;
      &lt;td&gt;내가 어떻게 하면 그런 걸 살 수 있을까? (고민)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;기업이나 정부가 개인의 문제를 해결해주어야 한다고 생각&lt;/td&gt;
      &lt;td&gt;완전한 재정적 자립을 중시&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;내가 부자가 될 일은 없을 거야.&lt;/td&gt;
      &lt;td&gt;빈털터리가 될지라도 스스로를 부자로 여김&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;가난한 것은 돈을 적게 벌어서가 아니라 부정적인 사고방식과 행동방식 때문이다.&lt;/li&gt;
  &lt;li&gt;돈이 나를 위해 일하도록 만드는 법을 배워야 한다.&lt;/li&gt;
  &lt;li&gt;돈의 작용 원리에 대한 지식만 있으면 돈을 통제할 수 있을 뿐 아니라 부를 쌓을 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;교훈-1-부자들은-돈을-위해-일하지-않는다&quot;&gt;교훈 1. 부자들은 돈을 위해 일하지 않는다.&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;“얘들아, 너희들은 포기할 때만 가난한 거란다. 가장 중요한 것은 너희가 무언가를 실행했다는 점이다.” p.39&lt;/li&gt;
  &lt;li&gt;학습 원뿔&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/cone-of-learning.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;돈에 대해 배우지 않기 때문에 인생의 황금기를 돈을 위해 일하면서 허비하게 된다. p.55&lt;/li&gt;
  &lt;li&gt;대부분의 사람들은 자기 자신은 그대로 놔두고 늘 남들을 바꾸려고 한다. 하지만 다른 사람들보다 나 자신을 바꾸는 것이 훨씬 쉽다. p.56&lt;/li&gt;
  &lt;li&gt;대부분의 사람들이 계속 참고 일하는 건 두려움 때문이다. p.61&lt;/li&gt;
  &lt;li&gt;인간이 죽을 때까지 지배되는 감정 : 두려움과 욕심 p.70
    &lt;ul&gt;
      &lt;li&gt;사람들은 돈으로 살 수 있는 즐거움을 얻기 위해 돈을 갖고 싶어 한다. 하지만 돈으로 사는 즐거움은 대게 순간적이고, 더 많은 즐거움이나 기쁨, 편안함, 안정감을 얻으려면 곧 더 많은 돈이 필요하게 된다. 그래서 그들은 계속 일을 한다. p.73&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;가난이나 재정적인 어려움을 겪는 근본 원인 : 두려움과 무지&lt;/li&gt;
  &lt;li&gt;돈에 대한 무지는 지나친 두려움과 욕망을 야기하는 근원이다.&lt;/li&gt;
  &lt;li&gt;‘이렇게 열심히 일하는 게 정말로 이 문제에 대한 최상의 해결책일까?’ 물어보라. p.85&lt;/li&gt;
  &lt;li&gt;“급여의 필요성을 빨리 잊을수록 어른이 된 뒤에 쉬운 삶을 살 수 있을 거다.” p.87&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;교훈-2-왜-금융-지식을-배워야-하는가&quot;&gt;교훈 2. 왜 금융 지식을 배워야 하는가&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;가난한 이, 중산층, 부자의 현금흐름 패턴&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/poor-cash-flow.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/assets/images/middle-class-cash-flow.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/assets/images/rich-cash-flow.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;직업적으로 성공한 사람도 돈에 대해서는 무지할 수 있다. 이런 사람들은 대개 필요 이상으로 열심히 일하는 경향이 있는데,그것은 이들이 열심히 일하는 법만 배웠을 뿐 돈이 자신을 위해 일하게 하는 법을 배우지 못했기 때문이다.&lt;/li&gt;
  &lt;li&gt;똑똑한 사람은 자기보다 더 똑똑한 사람을 고용한다. p.128&lt;/li&gt;
  &lt;li&gt;집이 좋은 투자 대상이 아님
    &lt;ul&gt;
      &lt;li&gt;가난한 사람은 집을 자산이라고 생각 하고, 부자는 집을 부채라고 생각함&lt;/li&gt;
      &lt;li&gt;주택 융자라는 부채가 생기고 주택 융자금, 재산세, 보험비 등의 지출이 생김&lt;/li&gt;
      &lt;li&gt;초기 투자를 하지 않고 비싼 집을 소유하면 얻게되는 결과
        &lt;ol&gt;
          &lt;li&gt;시간의 손실 : 그 사이에 다른 자산의 가치가 높아질 수 있음&lt;/li&gt;
          &lt;li&gt;추가 자본의 손실 : 투자에 쓸 수도 있었던 자본을 주택 유지 비용으로 지출하게 됨&lt;/li&gt;
          &lt;li&gt;교육의 손실 : 투자할 돈이 없기 때문에 투자 경험이 없다. 이른바 ‘현명한 투자자’가 되지 못함&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;더 큰 집을 사고 싶다면 당장 빚을 내서 집을 살 것이 아니라 먼저 현금흐름을 생성할 수 있는 자산을 구입해 주택 비용을 마련해야 함&lt;/li&gt;
      &lt;li&gt;주택을 보유한 고용인은 일반적으로 이렇게 일한다.
        &lt;ol&gt;
          &lt;li&gt;회사를 위해 일한다 : 회사의 소유주를 위한 노동&lt;/li&gt;
          &lt;li&gt;정부를 위해 일한다 : 세금&lt;/li&gt;
          &lt;li&gt;은행을 위해 일한다 : 융자금, 빚&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;부자는 점점 더 부자가 됨 : 지출을 상쇄하고도 남을 수익을 창출 하고, 남은 수익은 자산 부문에 재투자 된다. 그러면서 수익은 더 커진다.&lt;/li&gt;
  &lt;li&gt;부채와 자산의 차이를 이해하라. 그리고 수입을 창출하는 자산을 사는 데 전념하라.&lt;/li&gt;
  &lt;li&gt;간단한 법칙
    &lt;ul&gt;
      &lt;li&gt;부자는 자산을 산다.&lt;/li&gt;
      &lt;li&gt;가난한 이들은 오직 지출만을 한다.&lt;/li&gt;
      &lt;li&gt;중산층은 부채를 사면서 그것을 자산이라고 여긴다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;이 시대에 우리가 생존하는 데 돈보다 더 중요한 것은 교육과 학습 능력이다. p.145&lt;/li&gt;
  &lt;li&gt;금융 지식 중에서 회계라는 과목은 지루하고 복잡하지만 재정적 성공에 절대적으로 중요하다. p.146&lt;/li&gt;
  &lt;li&gt;중요한 것은 얼마나 버느냐가 아니라 얼마나 보유하느냐다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;교훈-3-부자는-자신을-위해-사업을-한다&quot;&gt;교훈 3. 부자는 자신을 위해 사업을 한다.&lt;/h2&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;💰어떤 종류의 자산을 사야할까?💰
    &lt;ul&gt;
      &lt;li&gt;내가 없어도 되는 사업. 소유자는 나지만 관리나 운영은 다른 사람들이 하고 있다. 내가 직접 거기서 일을 해야 한다면 그것은 사업이 아니라 내 직업이다.&lt;/li&gt;
      &lt;li&gt;주식&lt;/li&gt;
      &lt;li&gt;채권&lt;/li&gt;
      &lt;li&gt;수입을 창출하는 부동산&lt;/li&gt;
      &lt;li&gt;어음이나 차용증&lt;/li&gt;
      &lt;li&gt;음악이나 원고, 특허 등 지적 자산에서 비롯되는 로열티&lt;/li&gt;
      &lt;li&gt;그 외의 가치를 지니고 있거나 소득을 창출하거나 시장성을 지닌 것&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;자기 사업을 하라는 것이 창업을 하라는 말은 아니다. 진심으로 창업에 관심이 있는 사람이 아니라면 창업을 권하지 않는다. 차라리 직장에 다니면서 자기 사업을 하길 권한다.&lt;/li&gt;
  &lt;li&gt;부자들은 사치품을 가장 나중에 사는 반면, 가난한 이들과 중산층은 그것들을 먼저 구입하는 경향이 있다. 오랫동안 부자로 지내 온 사람들은 먼저 자산 부문을 구축한다. 진정한 사치는 진짜 자산을 개발하고 투자한 보상으로 얻는 것이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;교훈-4-부자들의-가장-큰-비밀-세금과-기업&quot;&gt;교훈 4. 부자들의 가장 큰 비밀, 세금과 기업&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;세금의 역사 : 세금은 부자들을 벌주기 위해 만들어진 것이라는 인식을 중산층과 가난한 이들에게 심었음. 그렇게 세금이 합법화 되었지만 결과적으로 중산층과 가난한 이들에게 벌 주는 것으로 나타남&lt;/li&gt;
  &lt;li&gt;부자들은 기업을 통해 세금으로부터 방어한다.
    &lt;ul&gt;
      &lt;li&gt;기업은 법적 문서가 끼워져 있는 서류철에 불과하다.&lt;/li&gt;
      &lt;li&gt;기업의 소득세율이 개인의 소득세율보다 낮다.&lt;/li&gt;
      &lt;li&gt;기업에서는 특정 분야의 지출금은 세전 금액으로 처리할 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;금융 IQ
    &lt;ol&gt;
      &lt;li&gt;회계 : 숫자를 이해하는 능력&lt;/li&gt;
      &lt;li&gt;투자 : 돈이 돈을 버는 방법에 대한 과학&lt;/li&gt;
      &lt;li&gt;시장에 대한 이해 : 수요와 공급의 과학&lt;/li&gt;
      &lt;li&gt;법률
        &lt;ul&gt;
          &lt;li&gt;기업에 제공하는 세금 혜택 : 기업은 돈을 벌고 가능한 모든 비용을 지출한 다음 남은 돈으로 세금을 낸다. (개인은 돈을 벌고 세금을 내고 남은 돈을 쓴다)&lt;/li&gt;
          &lt;li&gt;소송으로부터의 보호&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;교훈-5-부자들은-돈을-만든다&quot;&gt;교훈 5. 부자들은 돈을 만든다&lt;/h2&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;자기가 하는 일을 잘 알면 도박이 아니다.&lt;/li&gt;
  &lt;li&gt;은행에서 대출을 받지 않아도 자금을 모을 수 있는 방법은 여러 가지다.
    &lt;ul&gt;
      &lt;li&gt;구매자와 판매자 사이의 계약을 이용하는 이른바 ‘매듭 짓기’ 방식도 있음&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;똑똑한 사람들은 자기보다 똑똑한 사람들을 고용하거나 함께 일한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;교훈-6-돈을-위해-일하지-말고-교훈을-얻기-위해-일하라&quot;&gt;교훈 6. 돈을 위해 일하지 말고 교훈을 얻기 위해 일하라&lt;/h2&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;저자가 제록스에 입사하기로 결심한 이유 : “나는 수줍음이 많은 사람이었으며, 따라서 내게 있어 세일즈는 세상에서 가장 무서운 일이었다. 제록스는 미국 최고의 세일즈 훈련 프로그램을 갖추고 있었다.”&lt;/li&gt;
  &lt;li&gt;“근로자들은 해고되지 않을 만큼만 일하고, 고용주는 근로자들이 그만두지 않을 정도로만 지급한다.”&lt;/li&gt;
  &lt;li&gt;나는 젊은이들에게 돈을 벌기보다 무언가를 배울 수 있는 직장을 찾으라고 추천한다.&lt;/li&gt;
  &lt;li&gt;성공에 필요한 주요 관리 기술
    &lt;ol&gt;
      &lt;li&gt;현금흐름 관리&lt;/li&gt;
      &lt;li&gt;시스템 관리&lt;/li&gt;
      &lt;li&gt;사람 관리&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;가장 중요한 전문 기술 : 세일즈, 마케팅 (= 소통 능력)&lt;/li&gt;
  &lt;li&gt;글쓰기와 말하기, 협상하기와 같은 의사소통 기술은 성공적인 삶을 구축하는데 필수적임&lt;/li&gt;
  &lt;li&gt;“주라, 그러면 받을 것이다.”&lt;/li&gt;
  &lt;li&gt;2차 세계대전 세대는 회사를 옮겨 다니는 것을 나쁜 형태라고 여겼다. 그러나 오늘날 그것은 영리한 행동방식으로 통한다. 보다 많은 것을 배우고 장기적으로 큰 보상을 얻을 수 있기 때문이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;교훈-7-부자로-가는-길을-가로막는-장애물은-무엇인가&quot;&gt;교훈 7. 부자로 가는 길을 가로막는 장애물은 무엇인가?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;두려움
    &lt;ul&gt;
      &lt;li&gt;“실패는 승자에게 힘을 불어넣는다. 그리고 실패는 패배자들을 좌절시킨다.”&lt;/li&gt;
      &lt;li&gt;“이기는 것은 지는 것을 두려워하지 않는 것이다.”&lt;/li&gt;
      &lt;li&gt;돈이 조금밖에 없는데 부자가 되고 싶다면 우리는 균형이 아니라 집중을 추구해야 한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;냉소주의
    &lt;ul&gt;
      &lt;li&gt;대부분의 사람들이 가난한 이유는 투자에 관한 한 이 세상에는 사방을 뛰어다니며 “하늘이 무너진다!”고 외치는 치킨 리틀들로 가득하기 때문이다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;게으름
    &lt;ul&gt;
      &lt;li&gt;바쁜 사람들은 종종 게으른 사람들이다. 계속해서 그렇게 바쁜 생활을 유지하는 이유는 그들이 대면하고 싶지 않은 무언가를 회피하기 위해서다. “그럴 여유가 없다.”는 말 대신 “어떻게 그럴 여유를 마련할까?”라고 말하라.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;나쁜 습관&lt;/li&gt;
  &lt;li&gt;오만함
    &lt;ul&gt;
      &lt;li&gt;나는 오만하게 굴 때마다 돈을 잃었다. 왜냐하면 오만할 때 나는 내가 모르는 것은 중요하지 않다고 진심으로 믿기 때문이다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;교훈-8-부자가-되는-10단계&quot;&gt;교훈 8. 부자가 되는 10단계&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;부자가 되고 싶은 이유를 찾으라 : 정신의 힘
    &lt;ul&gt;
      &lt;li&gt;이유 : 원하는 것 + 원하지 않는 것&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;매일 같이 선택하라 : 선택의 힘&lt;/li&gt;
  &lt;li&gt;친구는 신중하게 고르라 : 협조의 힘
    &lt;ul&gt;
      &lt;li&gt;똑똑한 사람이라면 양쪽 의견을 모두 들어야 한다.&lt;/li&gt;
      &lt;li&gt;시장에서 대중이란 가장 늦게 나타나 손해를 보는 사람들이다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;하나의 방식에 통달하라. 그런 다음 새로운 것을 익히라 : 빠른 배움의 힘&lt;/li&gt;
  &lt;li&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;자신에게 먼저 지불하기 위하여 아래 사항을 명심하자.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
      &lt;li&gt;반드시 갚아야 할 큰 빚은 절대로 지지 마라.&lt;/li&gt;
      &lt;li&gt;돈이 부족해도 저축이나 투자한 돈에 손을 대지 마라.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;중개인에게 넉넉하게 지불하라 : 좋은 조언의 힘
    &lt;ul&gt;
      &lt;li&gt;부자 아버지는 전문가들에게 후하게 지불해야 한다고 믿었다. 정말로 전문가라면 그들은 내게 돈을 벌어다 줄 것이기 때문이다.&lt;/li&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;
  &lt;li&gt;가르치라 그러면 받으리라 : 주는 것의 힘
    &lt;ul&gt;
      &lt;li&gt;너그러움이 자신을 더욱 똑똑하게 만들 것이다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;교훈-9-당신이-해야-할-일들&quot;&gt;교훈 9. 당신이 해야 할 일들&lt;/h2&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;강의를 듣고 책을 읽고 세미나에 참석하라&lt;/li&gt;
  &lt;li&gt;많은 제안을 해라&lt;/li&gt;
  &lt;li&gt;한 달에 십 분 정도 특정 지역을 걷거나 조깅을 하거나 운전하라&lt;/li&gt;
  &lt;li&gt;모든 시장에서 저렴한 상품을 찾으라&lt;/li&gt;
  &lt;li&gt;올바른 장소를 찾으라&lt;/li&gt;
  &lt;li&gt;사고 싶어 하는 사람들을 먼저 찾으라. 그런 다음 파고 싶어 하는 사람을 찾으라&lt;/li&gt;
  &lt;li&gt;크게 생각하라
    &lt;ul&gt;
      &lt;li&gt;작은 사람들이 작게 머무르는 것은 그들이 작게 생각하고 혼자서 행동하거나 혹은 전혀 행동하지 않기 때문이다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;행동은 늘 행동하지 않는 것보다 낫다&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;중요한 것은 돈에 대한 교육과 지혜다. 일찌감치 시작하라. 책을 사고 세미나를 들어라. 연습을 하라. 작게 시작하라.&lt;/strong&gt;&lt;/p&gt;</content><author><name>Jang Junyeong</name></author><category term="Personal Development" /><summary type="html">돈을 벌기 위해 일하지 말고, 돈이 나를 위해 일하게 만들자</summary></entry><entry><title type="html">완벽한 공부법 (완공) - 고영성, 신영준</title><link href="https://joyyir.github.io/personal%20development/perfect-study/" rel="alternate" type="text/html" title="완벽한 공부법 (완공) - 고영성, 신영준" /><published>2019-09-06T13:00:00+09:00</published><updated>2019-09-06T13:00:00+09:00</updated><id>https://joyyir.github.io/personal%20development/perfect-study</id><content type="html" xml:base="https://joyyir.github.io/personal%20development/perfect-study/">&lt;h2 id=&quot;chpater-1-믿음&quot;&gt;Chpater 1. 믿음&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;학습된 무기력 (learned helplessness) : 어떤 몸부림을 쳐도 상황을 바꿀 수 없다는 것을 인지하는 순간 미래에 대한 기대를 접게 된다. (중략) 더 무서운 사실은 이러한 무기력이 ‘학습’된다는 것이다. 그러나 희망적인 것은 비관이 학습되듯 낙관도 학습된다는 것이다. 셀리그먼은 이를 ‘학습된 낙관주의(learned optimism)’이라고 불렀다.&lt;/li&gt;
  &lt;li&gt;어떻게 낙관을 학습할 것인가
    &lt;ol&gt;
      &lt;li&gt;작은 성공 경험
        &lt;ul&gt;
          &lt;li&gt;기대수준을 낮춰 작은 성공에 도전해보자. 작은 성공이 기대를 낳는다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;강점 주목
        &lt;ul&gt;
          &lt;li&gt;대부분의 사람이 긍정적인 점보다는 부정적인 점에 더 주목한다. 물론 문제점은 보완해야 하지만 장점에 주목하지 못하고 문제점만 바라보게 된다면 문제의 소용돌이 속으로 빠져 들어갈 수 있다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;의미와 가치 부여
        &lt;ul&gt;
          &lt;li&gt;니체는 “살아야 할 이유를 아는 사람은 거의 어떠한 상태에서도 견딜 수 있다.” 라고 말했다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;성장형 사고방식
        &lt;ul&gt;
          &lt;li&gt;노력만 하면 언제나 성장할 수 있다는 것을 믿는 것. 우리의 뇌가 성장한다고 믿는 것. (뇌의 가소성)&lt;/li&gt;
          &lt;li&gt;우리가 공부를 열심히 하면 뇌가 변한다. 변한 뇌는 그 공부를 더 잘하도록 돕는다.&lt;/li&gt;
          &lt;li&gt;실패에 대한 개념을 바꾸는 것. 실패는 성장을 위해 필연적인 것이며, 실패를 성장을 위한 발판이라고 믿는 것&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;자기 효능감 : 자신이 해낼 수 있는 능력이 있다는 믿음&lt;/li&gt;
  &lt;li&gt;왜 공부해야 하는가?
    &lt;ol&gt;
      &lt;li&gt;‘소통’을 잘 하기 위해 : 서로의 생각을 온전하게 표현하고 이해하여 제대로 된 소통을 하는 데 가장 밑받침이 되는 행동이 바로 공부이다.&lt;/li&gt;
      &lt;li&gt;‘생존’하기 위해&lt;/li&gt;
      &lt;li&gt;‘즐거움’이 있기 때문에 : 앎의 즐거움, 나눔의 즐거움&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chpater-2-메타인지&quot;&gt;Chpater 2. 메타인지&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;메타인지 : 자신의 인지 과정에 관한 인지 능력. 내가 뭘 알고 뭘 모르는지, 내가 하는 행동이 어떠한 결과를 낼 것인지에 대해 아는 능력. 자신을 객관적으로 볼 수 있는 능력&lt;/li&gt;
  &lt;li&gt;메타인지 능력이 높으면 자신의 장점을 극대화하고 자신의 단점을 최소화할 학습 전략 즉, ‘공부법’을 창조할 수 있다.&lt;/li&gt;
  &lt;li&gt;메타인지는 메타기억과 메타이해로 나뉨
    &lt;ul&gt;
      &lt;li&gt;메타기억 : 자신의 기억에 대한 인지 과정을 아는 것
        &lt;ul&gt;
          &lt;li&gt;대부분의 사람들은 자신의 기억을 과신하는 경향이 있음&lt;/li&gt;
          &lt;li&gt;실제 시험 점수가 낮은 학생일수록 자신이 뭘 알고 뭘 모르는지 ‘모르고’ 있음&lt;/li&gt;
          &lt;li&gt;메타기억이 낮을수록 자신의 기억을 향상하기 위한 전략을 제대로 구축하지 못하거나 잘못 아는 경우가 많음&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;메타이해 : 자신이 언어를 잘 이해하는지를 아는 능력&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;메타인지를 어떻게 높일 수 있을까
    &lt;ol&gt;
      &lt;li&gt;학습 전략을 배움으로써 메타인지를 높일 수 있음&lt;/li&gt;
      &lt;li&gt;자신의 실제 실력을 객관적으로 파악하는 피드백을 경험
        &lt;ul&gt;
          &lt;li&gt;연습문제 풀이, 내용 요약, 가르치기 등&lt;/li&gt;
          &lt;li&gt;공부를 했으면 연습문제를 풀자. 그렇게 연습문제로 지식도 축적하고 또 문제해결 능력도 키우자&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;인간의 인지과정에 대한 이해&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;인지의 착각
    &lt;ol&gt;
      &lt;li&gt;기억력 착각 : 자신의 기억 수준을 과대평가 하는 것&lt;/li&gt;
      &lt;li&gt;소박한 실재론 : 자신이 세상을 제대로 보고 있다고 순진하게 믿는 것&lt;/li&gt;
      &lt;li&gt;사후해석 편향 : 어떤 일이 벌어지기 전에는 잘 몰랐으면서 일이 벌어지고 난 후에는 ‘내 그럴 줄 알았지’라고 생각하는 것&lt;/li&gt;
      &lt;li&gt;계획 오류 : 자신의 실행력에 대해 과대평가 하는 것&lt;/li&gt;
      &lt;li&gt;정서 예측 오류 : 자신의 미래 감정을 잘못 예측하는 것. 행복감이나 슬픔이 오래갈 것이라고 여기는 것&lt;/li&gt;
      &lt;li&gt;평균 이상 효과 : 어떤 항목이든 자신은 평균 이상이라고 생각하는 것&lt;/li&gt;
      &lt;li&gt;확증 편향 : 자신이 처음 생각했던 주장에 지지하는 근거만을 찾는 경향
        &lt;ul&gt;
          &lt;li&gt;사람은 보고 싶은 것만 본다. 물론 그렇다면 문제 해결과는 점점 거리가 멀어지게 될 것&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;가용성 편향 : 내 기여도를 과장하는 것&lt;/li&gt;
      &lt;li&gt;권위자 편향 : 권위자 말이라면 제 생각도 기꺼이 바꾸는 것&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;지식의 저주 : 내가 아는 것을 상대방이 모를 수도 있다는 것을 모르는 것. 메타인지와 달리 지식의 저주는 타인에 관한 지식과 관련 있음
    &lt;ul&gt;
      &lt;li&gt;인간은 무언가를 알면 자신이 무언가 모르던 상태를 망각한다.&lt;/li&gt;
      &lt;li&gt;지식의 저주에 빠지지 않고 상대방을 대해야 한다. 그래야 소통이 가능하다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chpater-3-기억&quot;&gt;Chpater 3. 기억&lt;/h2&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;작업기억(working memory) : 작업기억은 단순히 정보를 저장하는 것에 그치지 않고 그 정보로 능동적인 작업을 하기 위해 존재함. 실제 저장소라기보다 ‘작업대’에 가깝다.&lt;/li&gt;
  &lt;li&gt;작업기억은 4개의 작업장이 있다. 4개의 작업대는 서로 독립적이다. 여러 작업대를 사용한다면 작업기억 용량이 늘어난다.
    &lt;ol&gt;
      &lt;li&gt;음운회로 : 단어와 소리를 단기간 저장하는 체제이며 계산을 다 할 때까지 공식과 도형을 일시적으로 보관한다.&lt;/li&gt;
      &lt;li&gt;시공간 메모장 : 시각과 공간 정보를 처리한다. 시공간 정보를 그냥 저장할 수도 있고 언어를 시공간화하여 저장할 수도 있다.&lt;/li&gt;
      &lt;li&gt;일화완충기 : 시공간 메모장, 장기기억에서 나온 정보를 모으고 조합하는 임시저장고 역할. 일화 완충기는 임시 저장 체계이지만 여기서 생성된 개념이나 복잡한 심상은 장기기억 속에 저장될 수 있다.&lt;/li&gt;
      &lt;li&gt;중앙집행기 : 작업기억 체제에서 CEO 역할을 한다. 음운회로, 시공간 메모장, 일화 완충기 및 장기기억의 정보 흐름을 통제하고 통합한다. 의사 결정 역할&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;어떻게 작업기억 능력을 향상시킬까?
    &lt;ol&gt;
      &lt;li&gt;앞으로 많은 장기기억을 갖는 것. 결국, 특별한 꼼수가 있기보다 작업기억 능력의 확장은 얼마나 많은 공부를 하느냐와 많은 것을 알고 있는가에서 결정된다.&lt;/li&gt;
      &lt;li&gt;새로운 정보를 기존에 자신의 기억과 연결하고 통합하는 연습을 해야함&lt;/li&gt;
      &lt;li&gt;시공간 메모장을 활용하는 것을 음운회로로 치환하지 않도록 노력함. 다시 말해, 이미지를 잘 활용하고 그림으로 해결할 수 있다면 그렇게 하는 것이 좋다.
        &lt;ul&gt;
          &lt;li&gt;심상과 소리는 서로 독립적이기 때문에 둘 다 활용한다면 작업기업의 용량이 더 커질 것이다. (시공간 메모장 + 음운회로)&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;장기기억
    &lt;ul&gt;
      &lt;li&gt;종류
        &lt;ol&gt;
          &lt;li&gt;선언적 지식 : 사실과 개념 등에 대한 지식&lt;/li&gt;
          &lt;li&gt;일화기억 : 사건에 대한 기억&lt;/li&gt;
          &lt;li&gt;의미기억 : 어휘와 사실적 정보에 대한 지식&lt;/li&gt;
          &lt;li&gt;절차적 지식 : 과제를 수행하는 방법에 대한 지식&lt;/li&gt;
          &lt;li&gt;조건적 지식 : 언제 어디서 선언적 지식과 절차적 지식을 사용할 것인가에 관한 지식&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;선언적 지식은 명시적이고, 조건적 지식과 절차적 지식은 암묵적이다. (내가 어떤 지식을 활용하고 있는지 정확히 떠올릴 수 없음)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;어떻게 기억을 잘할 수 있을까 (기억 전략)
    &lt;ul&gt;
      &lt;li&gt;강의를 들을 때 뇌가 적극적으로 활동하지 않는다.&lt;/li&gt;
      &lt;li&gt;기억전략 1 : 시험을 자주 보는 것
        &lt;ul&gt;
          &lt;li&gt;시험/연습문제 풀이는 장기기억에만 좋은 것이 아니라 메타인지를 향상해줌으로써 좀 더 효율적인 학습 전략을 세우도록 해준다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;기억전략 2 : 인출 효과
        &lt;ul&gt;
          &lt;li&gt;공부한 내용을 어떻게든 밖으로 표출해보는 것. 시험, 암송, 요약, 토론, 발표, 글쓰기 등&lt;/li&gt;
          &lt;li&gt;잊지 말자. 어렵게 공부하면 잊기가 어렵다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;기억전략 3 : 분산 연습 효과
        &lt;ul&gt;
          &lt;li&gt;연속으로 연습하면 단기기억이 주로 일을 하게 되면서 내용을 완전히 숙지한 듯 보이지만 실제로 장기기억으로 많이 가지 않게 된다. 하지만 간격을 두고 학습하게 되면 두 번째 합습할 때 약간의 어려움을 겪게 된다. 어렵게 공부하면 잊기 어렵다는 명제를 잊지 말자.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;기억전략 4 : 교차 효과
        &lt;ul&gt;
          &lt;li&gt;두 가지 이상의 과목을 번갈아 학습하면 장기기억에 긍정적인 효과를 누릴 수 있다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;기억전략 5 : 그 외 5가지
        &lt;ol&gt;
          &lt;li&gt;자기 참조 효과 : 정보를 자신과 관련시킬 때 우리는 더 많은 정보를 기억할 수 있다.&lt;/li&gt;
          &lt;li&gt;맥락 효과 : 시험을 보는 비슷한 시간, 비슷한 장소에서 비슷한 시험 유형으로 공부한다면 실제 시험에 큰 도움이 될 수 있다.&lt;/li&gt;
          &lt;li&gt;심상 활용 : 암기할 때 이미지를 이용하면 더 효과적이다. 이미지는 괴이할수록 더 효과적이다.&lt;/li&gt;
          &lt;li&gt;조직화 : 비슷한 속성끼리 분류하거나 상위/하위 개념 식으로 위계를 세우면 기억이 더 잘된다.&lt;/li&gt;
          &lt;li&gt;첫 낱자 조합 기법 : 태정태세문단세&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-4-목표&quot;&gt;Chapter 4. 목표&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;성장 목표와 증명 목표 : 성장 목표는 내가 성장하려는 게 목표, 증명 목표는 타인에게 자신을 증명하는 게 목표&lt;/li&gt;
  &lt;li&gt;증명 목표는 부작용을 낳는다. : 편법, 회피&lt;/li&gt;
  &lt;li&gt;크고 위험하고 대담한 목표 (BHAG, Big Hairy Audacious Goal)
    &lt;ul&gt;
      &lt;li&gt;학계의 많은 연구는 대담하고 매력적인 장기목표가 혁신과 생산성에서 큰 도약을 이룬다고 말한다.&lt;/li&gt;
      &lt;li&gt;매력적인 장기 목표는 사람의 행동을 이끈다. 이러한 목표가 사람의 감정을 움직이기 때문이다. 사람을 행동하게 하는 데는 감정이 매우 큰 역할을 한다.&lt;/li&gt;
      &lt;li&gt;단점 : 목표가 너무 크면 동기부여가 되는 것이 아니라 그 묵직한 무게에 짓눌려 아예 포기하게 된다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;어떻게 장기 목표에 접근할까?
    &lt;ul&gt;
      &lt;li&gt;많은 위대한 사람도 어렸을 때 뚜렷한 목표가 없었고 하고 싶은 일도 수시로 변했다. 그러는 과정에서 자신이 진정으로 하고 싶은 일을 찾았다.
        &lt;ol&gt;
          &lt;li&gt;지금 자신이 하는 일을 ‘왜’ 하는지를 계속 물어보자 : 이런 식으로 물어본다면 자신의 궁극적인 관심에 도달할 수 있을 것이다.&lt;/li&gt;
          &lt;li&gt;자신이 가장 존경하는 사람을 떠올려 보자&lt;/li&gt;
          &lt;li&gt;인생의 마지막 때를 생각해보자.&lt;/li&gt;
          &lt;li&gt;우선 이것저것 다양하게 적극적으로 시도해보자. 우선 시작하다보면 자신도 모르게 어떤 방향으로 가게 된다.&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;장기 목표를 가지되 그 목표를 분해해야 한다. (믿음 장에서 언급한 ‘작은 성공’을 위해서라도)&lt;/li&gt;
  &lt;li&gt;SMART 목표
    &lt;ul&gt;
      &lt;li&gt;Specific (구체적)&lt;/li&gt;
      &lt;li&gt;Measurable (측정 가능한)&lt;/li&gt;
      &lt;li&gt;Attainable (성취 가능한)&lt;/li&gt;
      &lt;li&gt;Realistic (현실적인)&lt;/li&gt;
      &lt;li&gt;Timeline (시간 계획이 가능한)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;실현 가능한 목표를 구체적으로 기술할 수만 있다면 그 목표들을 이룰 확률이 더욱 더 올라간다.&lt;/li&gt;
  &lt;li&gt;목표 설정에 대한 정리 : 먼저 BHAG 목표를 세운다. 그리고 목표를 SMART 목표로 세분화시킨다. 그리고 오늘 해야 할 일들에 대해서 언제 어디서 어떻게 행동하는지까지 세세하게 계획을 잡는다.&lt;/li&gt;
  &lt;li&gt;시간 관리 : 지금부터 최소 일주일 정도 자신이 어떻게 시간을 쓰는지 매시간 적어 보고 그 시간에 대한 평가도 적어보자. 하고 싶고 해야할 일이 많은데 시간이 부족한 경우라면 우선순위를 정확히 정하자.
    &lt;ol&gt;
      &lt;li&gt;긴급하면서 중요한 일&lt;/li&gt;
      &lt;li&gt;긴급하지 않지만 중요한 일 : 독서, 운동&lt;/li&gt;
      &lt;li&gt;긴급하면서 중요하지 않은 일 : 인터넷 서핑 (지금 당장 하고싶기 때문에 긴급)&lt;/li&gt;
      &lt;li&gt;긴급하지 않으면서도 중요하지 않은 일
        &lt;ul&gt;
          &lt;li&gt;우리는 2를 등한시하고 3을 더 우선순위에 두는 경향이 있다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;처음에 상상할 수 없었던 목표를 실제로 이루게 된다면 새로운 ‘눈’을 선물 받게 된다. 그 눈은 그 어떤 것과도 바꿀 수 없는 인생의 ‘보석’이 된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-5-동기&quot;&gt;Chapter 5. 동기&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;내재적 동기와 외재적 동기
    &lt;ul&gt;
      &lt;li&gt;내재적 동기 : 한 개인이 강압 없이 스스로 원해서 행동에 참여하는 것. 만족, 경쟁력, 흥미, 학습, 도전&lt;/li&gt;
      &lt;li&gt;외재적 동기 : 외부적인 이유로 활동에 참여하는 것. 칭찬, 성적, 특혜, 자격증, 물질적 보상&lt;/li&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;
  &lt;li&gt;‘자율성’은 강력한 내재적 동기를 불러일으키는 요인이다. 무기력에 빠짐 = 동기부여가 전혀 되지 않은 상태, 자율성을 상실하게 될 때 무기력이 학습되었다. 자율성 자체가 내재적 동기의 핵심인 동시에 자율성을 빼앗기면 다른 동기마저 사라진다. 내게 선택권이 있음을, 자신을 통제할 수 있음을, 그리고 공부든 일이든 인생이든 뭐든지 내가 어떻게 하느냐에 달려 있다고 믿을 때 그 사람은 그 어떤 사람보다 동기화될 것이며 자신이 원하는 목표에 기어이 도착하게 될 것이다.&lt;/li&gt;
  &lt;li&gt;정말 무기력할 때는 외부 동기가 내부 동기보다 훨씬 필요하다. 제세동기와 같이 동기도 외부에서 제대로 부여하려면 임계점을 넘긴 정도의 충격이 필요하다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-6-노력&quot;&gt;Chapter 6. 노력&lt;/h2&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;자제력은 배울 수 있는 능력임. 자제력은 훈련될 뿐만 아니라 특정 행동에 대한 자제력을 키워 나가면 자제력을 발휘해야 할 다른 영역에도 긍정적인 영향을 미침&lt;/li&gt;
  &lt;li&gt;제대로 된 방법으로 노력하지 않으면 노력은 진짜 우리를 배신할 수 있다. 과거와 현재에서 재능 차이는 크지 않을 확률이 높다. 그러나 확연하게 차이가 나는 것은 제대로 된 방법으로 아주 많이 노력해 왔다는 것이다.&lt;/li&gt;
  &lt;li&gt;자신의 능력보다 조금 더 어려운 작업을 지속해서 해야함&lt;/li&gt;
  &lt;li&gt;심성 모형을 만들어 내는 한편 거기에 의존해야 함&lt;/li&gt;
  &lt;li&gt;심성 모형 : 자기 자신이나 다른 사람 또는 특정 환경 속에서 상호작용하는 사물에 관해 가지고 있는 어떤 모형. 어떤 대상에 대해 뛰어난 심성 모형을 갖고 있으면 그 대상의 현재 상태뿐만 아니라 미래 예측까지도 잘할 수 있게 된다.&lt;/li&gt;
  &lt;li&gt;심성 모형의 질적 수준을 높이는 방법은 바로 ‘피드백’을 경험하는 것이다. 피드백을 통해 현재 내가 무엇을 알고 무엇을 모르는지를 알고 있어야 더 명확한 계획과 실행이 가능하며 효과적인 전략도 다시 세울 수 있다. 자신이 하는 공부에 대해 전문가나 동료들에게 평가받기를 두려워하지 말아야 한다. 또한, 연습문제 풀기, 수시로 시험 보기, 토론하기, 발표하기 등을 통해 자신이 실제로 얼마나 알고 있는지를 확인하는 셀프 피드백 또한 필요하다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-7-감정&quot;&gt;Chapter 7. 감정&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;이성은 홀로 존재할 수가 없다. 언제나 감정이 따라다닌다.&lt;/li&gt;
  &lt;li&gt;인간은 대체로 보상을 통해 얻은 행복보다 손실을 통해 겪는 고통이 2~2.5배나 크다.&lt;/li&gt;
  &lt;li&gt;부정적인 감정은 우리의 인식을 협소화하는 경향이 있지만, 긍정적인 감정은 우리의 인식을 확장한다.&lt;/li&gt;
  &lt;li&gt;부정적 감정일 때보다 긍정적 감정일 때 효율적으로 공부할 수 있다.&lt;/li&gt;
  &lt;li&gt;불안을 잠재우는 가장 좋은 방법의 하나는 불안을 잊으려고 노력하는 것이 아니라 오히려 불안에 대해 상세히 설명하거나 글을 쓰는 것이다.&lt;/li&gt;
  &lt;li&gt;부정적 감정을 긍정적 감정으로 재정의하기 : 자신의 감정을 묘사할 때 다른 관점으로 기술하면 불안 제거 효과는 배가 된다. 다른 연설 실험에서도 두려움을 흥분으로 다시 규정했을 때 훨씬 연설을 잘하는 것으로 나타났다.&lt;/li&gt;
  &lt;li&gt;“만일 내게 나무를 베기 위해 한 시간만 주어진다면 우선 나는 도끼를 가는 데 45분을 쓸 것이다.” - 에이브러햄 링컨&lt;/li&gt;
  &lt;li&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;가장 큰 행복의 조건 중에 하나는 ‘사람’이다. 현대인의 가장 총체적인 사망 요인은 외로움이며, 가장 큰 스트레스 원인은 사회적 배제이다. 그러나 돈을 밝히면 행복의 열쇠를 쥔 사람을 경시하게 된다. 돈은 “너희가 없어도 난 혼자 살 수 있다”라는 ‘자기충만감’을 준다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-8-사회성&quot;&gt;Chapter 8. 사회성&lt;/h2&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;내가 있는 조직에 진정한 친구 단 한 사람만 있더라도 외로움을 거의 느끼지 않는다.&lt;/li&gt;
  &lt;li&gt;진정한 친구를 만드는 가장 강력한 요소는 서로의 ‘비밀’을 아는 것이다.&lt;/li&gt;
  &lt;li&gt;대인관계가 성공을 결정짓는다. 대인관계에서 가장 중요한 덕목은 ‘공감능력’이다. 공감능력은 소설을 읽으며 기를 수 있다. 어떤 한 인물의 마음과 성격을 마음속에 그려내는 연습을 많이 할수록 공감능력은 향상된다.&lt;/li&gt;
  &lt;li&gt;대인관계를 높이는 7가지 기술
    &lt;ol&gt;
      &lt;li&gt;일관성&lt;/li&gt;
      &lt;li&gt;존중 : 존중받고 싶다면 존중해야 한다.&lt;/li&gt;
      &lt;li&gt;경청&lt;/li&gt;
      &lt;li&gt;조언 : 연구 결과 성공적으로 임원이 된 사람들은 상사에게 조언을 자주 구한다는 사실이 밝혀졌다.&lt;/li&gt;
      &lt;li&gt;겸손 : ‘나는 힘이 없는 사람이다’라고 생각할수록 타인에 대한 공감능력이 향상된다.&lt;/li&gt;
      &lt;li&gt;칭찬&lt;/li&gt;
      &lt;li&gt;실수(의외인데?) : 실수했을 때 그 사람에게 더 큰 호감이 생긴다. 상대방의 약점과 실수를 접할 때 우리는 그를 더 인간적으로 느끼게 되고 그에게 호감을 느낀다. 근데 이건 약간 반전매력인 것 같다. 평범한 사람이 실수효과를 노리면 역효과가 날 수도 있다.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;이기적 이타주의자 : 애덤 그랜트의 «기브앤테이크» 책. 실퍼한 기버의 공통된 특징은 다른 사람들을 극단적으로 도와주거나 희생만 함으로써 진이 빠지고 지친다는 점이다. 성공적인 기버들은 엄청난 야심가였다. 이기심과 이타심은 매우 독립적이기 때문에 우리는 이 둘을 모두 가질 수 있다. “모두가 당신의 승리를 원할 경우 승리는 더 쉬워진다.”&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-9-몸&quot;&gt;Chapter 9. 몸&lt;/h2&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;책상에만 앉아 꼼짝 않고 책만 보는 것은 공부 하수가 하는 일이다. 때로는 움직이고 운동하고 여유로운 시간을 확보하며 낮잠도 적절히 활용하게 된다면 당신의 공부 효율성은 한 단계 아니 몇 단계 업그레이드 될 것이다.&lt;/li&gt;
  &lt;li&gt;“건강한 신체에 건강한 정신이 깃든다.” 고대 로마 시인 유베날리스의 명언&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-10-환경&quot;&gt;Chapter 10. 환경&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;인터넷에서는 우리의 인지 자원을 콘텐츠에 집중시키지 못하고 다른 데에 사용하게하는 다양한 방해물들이 있다.&lt;/li&gt;
  &lt;li&gt;“우리가 집을 만들지만, 그 집이 다시 우리를 만든다” - 처칠&lt;/li&gt;
  &lt;li&gt;실천 모멘텀이 강한 사람과 가까이 지내는 것도 좋은 환경 설정이 될 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-11-창의성&quot;&gt;Chapter 11. 창의성&lt;/h2&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;창의성을 갖기 위한 태도
    &lt;ol&gt;
      &lt;li&gt;새로운 것을 찾으려고 하기보다는 기존에 있는 것들을 새로운 방식으로 연결하기 위해 바라보고 생각하는 자세&lt;/li&gt;
      &lt;li&gt;연결하기 위한 재료를 많이 가지려는 노력. 즉 다양한 경험이 있을수록 그 사람은 창의적인 아이디어를 낼 가능성이 커진다.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;자기에게 이질적이고 낯선 경험일수록 창의성을 발휘할 확률이 높아진다.
    &lt;ul&gt;
      &lt;li&gt;이질적 문화를 가진 나라로의 여행, 다양한 분야의 독서 (책만큼 적은 비용으로 다양한 경험을 선물하는 것은 없다.)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;도전도 많이, 실패도 많이 : 진짜 창의적인 사람들은 대박 웃음을 만들기 위해 남들보다 썰렁한 이야기를 아주 많이 하는 사람이다. “수없이 많은 개구리에게 입맞춤을 해 봐야, 그중에 왕자를 하나 찾아낼 수 있다.”, 창의적인 사람은 일단 아이디어를 많이 낸다. 창의적인 사람에게는 도전도 일상이지만 실패도 일상이다. 결국, 실패를 잘 받아들일 수 있는 사고방식을 갖고 있을 때 창의적인 사람으로 성장할 수 있다.&lt;/li&gt;
  &lt;li&gt;창의적인 결과물을 내기 위한 과정 : (1) 공부한다 (2) 시도한다 (3) 분석한다 (4) 다시 시도한다&lt;/li&gt;
  &lt;li&gt;위험에 민감하여 항상 안전판을 생각하는 조금 소심해 보이는 기업가가 더 성공할 확률이 높다.&lt;/li&gt;
  &lt;li&gt;부모와 애착 관계가 형성된 아이일수록 실제로 탐구심이 높다.&lt;/li&gt;
  &lt;li&gt;가난이라는 것이 단순히 경제적 어려움만 주는 것이 아니라 한 사람의 인지적 자원을 치명적으로 침해한다. «결핍의 경제학»&lt;/li&gt;
  &lt;li&gt;‘린 스타트업’ 에릭 리스 : 처음부터 세상을 놀라게 할 명품을 만들 생각은 교만으로 치부하고 승산이 있는 새로운 아이디어가 나오면 조금은 어설프지만, 이 새로운 아이디어를 테스트 할 수 있는 최소한의 제품을 빠르게 만들어 출시한다. 이런 제품을 MVP(Minimum Viable Product)라고 한다. 이에 대한 고객의 반응을 파악한 후 이를 분석하여 발 빠르게 제품을 개선한다. 만약에 처음 아이디어를 세울 때 세웠던 가설이 잘못되었다고 판단했다면 미련 없이 방향을 선회한다. 이를 Pivot(방향 전환) 이라고 한다.&lt;/li&gt;
  &lt;li&gt;실패를 했을 때 다시 도전할 수 없다면 어떻게 계속 도전하겠는가? 실패의 비용이 무시할 정도로 적거나 실패의 비용을 감당할 수 있는 안전판이 있을 때 도전하고 또 도전하는 것이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-12-독서&quot;&gt;Chapter 12. 독서&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;의문이 없다는 말은 ‘비판적 사고’의 결여를 뜻한다.&lt;/li&gt;
  &lt;li&gt;호기심이란 이미 알고 있는 것이나 전혀 모르는 것에는 발동하지 않는다. 결국, 지적인 호기심을 갖고 ‘왜’라는 질문을 던지기 위해서는 그 분야에 대한 지식이 있어야 한다는 것이다.&lt;/li&gt;
  &lt;li&gt;다독이 첫 시작이다. 읽고 싶은 책을 골라 ‘이 책을 제대로 읽어야지’, ‘서평을 써야지’, ‘내용을 거의 숙지해야지’ 등의 생각은 절대 하지 말고 그냥 편하게 읽는 것이 중요하다. 매일 한 시간 이상 2~3달 꾸준히 독서하면 습관이 형성되는데 이때부터는 서서히 독서가 삶의 일부분처럼 느껴진다.&lt;/li&gt;
  &lt;li&gt;어떤 책은 하나의 책이 100권의 가치가 있다는 사실을 개인적으로 깨닫게 된다.&lt;/li&gt;
  &lt;li&gt;성인이라면 처음에는 계독을 추천한다. 계독은 한 분야의 계보에 따라 책을 읽는 것이다. 자신의 관심 있는 분야나 일이나 전공과 관련된 분야의 책을 최소 50권 많게는 200권 정도 읽어 보는 것이다.&lt;/li&gt;
  &lt;li&gt;한 분야만 책을 파게 되면 자칫 생각이 편협해지거나 교만해질 수 있다. 그래서 남독이 필요하다. 남독은 다양한 책을 읽는 것이다.&lt;/li&gt;
  &lt;li&gt;독서 습관을 만드는 방법
    &lt;ol&gt;
      &lt;li&gt;스마트폰과 멀어지기&lt;/li&gt;
      &lt;li&gt;책을 읽기에 최적인 장소 찾기&lt;/li&gt;
      &lt;li&gt;인지부조화 이용하기 : ‘그냥’ 읽기. 독서하기 싫을 때조차도 그냥 읽어보기. 뇌는 인지부조화를 벗어나기 위해 자기정당화를 발동시킴&lt;/li&gt;
      &lt;li&gt;책 한꺼번에 많이 사기 : 5~10권씩 한번에 사고 잘 보이는 곳에 두기&lt;/li&gt;
      &lt;li&gt;독서 모임&lt;/li&gt;
      &lt;li&gt;3~4권 동시에 읽기&lt;/li&gt;
      &lt;li&gt;다독가를 주변에 두기&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-13-영어&quot;&gt;Chapter 13. 영어&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;문법 공부의 90퍼센트를 이뤄야 하는 것은 예문 암기다.&lt;/li&gt;
  &lt;li&gt;말하기를 잘 하기 위해 우리는 ‘문장 자원’을 확보해야만 한다. 문장을 많이 암기해야한다는 뜻&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;chapter-14-일&quot;&gt;Chapter 14. 일&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;공부한 지식이 실전에 얼마나 도움이 될지를 결정하는 것은 지식 자체가 아니라 그 지식을 어떻게 공부했느냐이다. 지식을 실전처럼 공부했다면 실전은 해 볼 만한 것이 된다.&lt;/li&gt;
  &lt;li&gt;탁월한 결정을 하는 데 최종 의사결정자의 직관이나 전문가 그룹의 분석보다 ‘프로세스’가 6배나 더 중요하다는 것이 밝혀졌다.&lt;/li&gt;
  &lt;li&gt;선택안을 늘릴수록 성공적인 의사결정을 할 확률이 높아진다.&lt;/li&gt;
  &lt;li&gt;‘확증 편향’ : 마음속으로 이미 어느 정도 결정을 한 뒤 그 결정을 뒷받침하는 정보만 선별해서 수집하려는 것&lt;/li&gt;
  &lt;li&gt;단기감정을 극복하려면 이것은 내 결정이 아니라 나의 친한 친구의 결정이라고 상상해 보는 것도 큰 도움이 된다. 타인의 결정에 대해서는 감정 배제를 잘하기 때문이다.&lt;/li&gt;
  &lt;li&gt;많은 사람이 반복연습의 무서움을 모른다. 물론 반복연습은 상당한 의지력이 있어야 함은 틀림없지만 한 사람을 빛나는 천재처럼 보이게 할 정도로 대단하다는 것을 알 필요가 있다. 특히 발표하거나 중요한 프레젠테이션을 할 때 반복연습만큼 중요한 것이 없다.&lt;/li&gt;
  &lt;li&gt;시뮬레이션은 실제로 행동하는 것만큼의 효과를 거둘 수 없다. 하지만 그다음으로 가장 훌륭한 방법이다.&lt;/li&gt;
  &lt;li&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;명확한 의사전달을 위해 발표를 잘하려면 우선 ‘내용 장악’이 필요하다.&lt;/li&gt;
      &lt;li&gt;글이 되지 못하는 발표는 대부분 기교에만 의존하는 발표다. 쉽게 말하면 알맹이가 없는 것이다.&lt;/li&gt;
      &lt;li&gt;핵심 내용 파악이 어느 정도 되었다면 이제는 연습을 해야 한다. 첫 단계는 그냥 말하기다. 발표 자료는 어디까지나 보조 수단이다. 반복 연습을 하되 피드백을 받아 가면서 올바른 방법으로 연습해야 원하는 수준에 도달할 수 있다. 녹음해서 들어보자.&lt;/li&gt;
      &lt;li&gt;발표자료에는 키워드 중심으로만 쓰고 그림으로 표현할 수 있는 것은 글보다 그림으로 표현하는 것이 직관적이다.&lt;/li&gt;
      &lt;li&gt;그림만 넣어서 발표자료를 만들지 말자. 우리는 스티브 잡스가 아니다.&lt;/li&gt;
      &lt;li&gt;가장 중요한것! 발표는 꾸준히 연습해야 한다. 단시간에 늘지 않는다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;집단 의사 결정의 실패
    &lt;ul&gt;
      &lt;li&gt;집단이 개개인보다 더 어리석게 행동하는 경우가 상당히 많다.&lt;/li&gt;
      &lt;li&gt;집단 논의가 집단 구성원들에게 미치는 영향
        &lt;ol&gt;
          &lt;li&gt;‘정보 신호’ : 다른 구성원이 공개적으로 말하는 정보를 존중하다 보니 자신이 아는 바를 밝히지 못하는 상황&lt;/li&gt;
          &lt;li&gt;‘사회적 압력’ : 사람들은 사회적 압력을 느끼면 그로 인한 불이익을 피하려고 자연히 침묵을 택하게 된다.&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;이러한 영향으로 인해 생기는 집단 의사 결정의 실패 원인
        &lt;ol&gt;
          &lt;li&gt;오류 확대 : 집단은 개개인이 가진 오류를 확대하는 경향이 크다.&lt;/li&gt;
          &lt;li&gt;폭포 효과 : 사람들이 서로 영향을 받아 자신의 개인적 지식을 무시하고 공적으로 알려진 남들의 판단에만 전적으로 의존하는 경우를 말함&lt;/li&gt;
          &lt;li&gt;극단화 : 집단 구성원들이 논의하면 논의를 시작하기 전보다 그들이 선호하는 방향으로 더 극단화된 결론이 나는 현상&lt;/li&gt;
          &lt;li&gt;정보 누락 : 대부분의 집단은 소수만 알고 있는 정보의 가치는 소홀히 하지만 대부분 알고 있는 정보에 대한 선호가 높은 경향이 있음&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;해결책 : 정보 신호와 사회적 압력을 최대한 없애야 한다. 회의를 할 때 직급에 상관없이 누구나 자유롭게 발언할 수 있는 분위기가 만들어져야 한다. 리더는 사회적 압력을 고려해 이왕이면 마지막에 자신의 의견을 개진하는 것이 좋다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&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;직급이 올라갈수록 탐구능력이 없다면 본인 뿐만 아니라 팀원 모두가 고생한다.&lt;/li&gt;
      &lt;li&gt;디테일의 중요성을 인정 못하고 넘겨버리면 회사는 바로 지옥으로 변할 수 밖에 없다. 흔히 아는 만큼 보인다고 한다. 디테일을 잡는 것도 역시 공부가 필요하다.&lt;/li&gt;
      &lt;li&gt;결국은 공부가 생각보다 많은 것을 해결해 주지만 안타깝게도 많은 사람이 공부하지 않는다. 잊지 말자. 공부가 답이다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;생각&quot;&gt;생각&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;어렵게 공부할 수록 잊기 어렵다.&lt;/li&gt;
  &lt;li&gt;한 번 듣고 한 번 읽고 끝난다면 머리 속에 남는 것이 없다. 시간 낭비이며 노력이 배신하게 된다.
    &lt;ul&gt;
      &lt;li&gt;똑같은 내용이라도 두 번 세 번 반복해서 읽는다. 요약하며 읽는다. 포스트잇에 생각을 정리하며 읽는다.&lt;/li&gt;
      &lt;li&gt;공부한 내용에 대해 주변 사람들과 이야기를 나눈다. 내용과 느낌을 정리해서 블로그에 올린다. 유튜브 영상을 찍는다. 배운 것을 업무나 일상 생활에 실제로 적용해본다.&lt;/li&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;
&lt;/ul&gt;</content><author><name>Jang Junyeong</name></author><category term="Personal Development" /><summary type="html">평생 학습을 위한 지침서</summary></entry><entry><title type="html">[자바스크립트 패턴과 테스트] 6장 - 프라미스 패턴</title><link href="https://joyyir.github.io/reliable%20javascript/reliable-javascript-06/" rel="alternate" type="text/html" title="[자바스크립트 패턴과 테스트] 6장 - 프라미스 패턴" /><published>2019-09-06T13:00:00+09:00</published><updated>2019-09-06T13:00:00+09:00</updated><id>https://joyyir.github.io/reliable%20javascript/reliable-javascript-06</id><content type="html" xml:base="https://joyyir.github.io/reliable%20javascript/reliable-javascript-06/">&lt;h2 id=&quot;61-단위-테스트&quot;&gt;6.1 단위 테스트&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Promise : 비동기 작업과 그 결과를 갖고 해야 할 일을 캡슐화한 객체로서, 작업 완료 시 이 객체에 캡슐화한 콜백을 호출한다.&lt;/li&gt;
  &lt;li&gt;콜백은 귀결(resolve) 콜백과 버림(reject) 콜백으로 나뉜다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;611-프라미스-사용법&quot;&gt;6.1.1 프라미스 사용법&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Promise 사용된 코드의 테스트코드 짜기 : &lt;a href=&quot;https://github.com/joyyir/006844/commit/7a7e5bcd605e8cd187da97def3f72c5befb46789&quot;&gt;github commit&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Promise에 ‘이르렀을 때’ 기대식을 평가하도록 유의&lt;/li&gt;
      &lt;li&gt;재스민 사용하여 비동기 코드 테스트 시에는 done()을 쓸 것&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;상태와 숙명
    &lt;ul&gt;
      &lt;li&gt;Promise는 세 가지 상태(state)를 가짐 : 이룸(fulfilled), 버림(rejected), 보류(pending)&lt;/li&gt;
      &lt;li&gt;Promise는 두 가지 숙명(fate)를 가짐 : 귀결(resolved), 미결(unresovled)&lt;/li&gt;
      &lt;li&gt;미결 프로미스는 항상 보류 상태이지만 귀결 프로미스는 세 가지 상태 중 하나가 될 수 있음&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>Jang Junyeong</name></author><category term="Reliable JavaScript" /><category term="JavaScript" /><summary type="html">프라미스를 잘 써보자</summary></entry></feed>