패키지 매니저 pnpm, 새로운 의존성 관리 방식(vs npm/yarn)

기존의 호이스팅 방식과 pnpm의 의존성 트리 유지 방식

pnpm은 Performant NPM, 즉 높은 성능을 내는 npm이라는 의미이다.

npm은 공식적으로 ‘줄여쓴 약자가 아니다(npm is not an acronym)’라고 하지만 누구에게나 Node Package Manager라고 하면 쉽게 설명이 된다…

회사 프로젝트에서도 npm yarn yarn berry를 거쳐 현재는 pnpm을 기본으로 사용하고 있으며, 특성상 낮은 노드 버전 유지가 필요한 곳만 npm을 사용하고 있다.

그렇다면 다른 패키지 매니저와 비교해 pnpm의 특징을 먼저 살펴보자.

특징pnpmnpm / yarn
속도빠름(병렬 처리)다소 느림
효율성좋음(글로벌 캐싱, 링크 사용)낮음(중복 저장 가능성)
호환성npm 호환Node.js 기본
의존성 관리엄격함(충돌 방지 장점)느슨함
모노레포 지원워크스페이스 지원yarn 일부 지원
pnpm과 npm/yarn의 차이

pnpm의 의존성 관리 방식은 기존의 호이스팅(hoisting) 방식을 사용하는 패키지 매니저와 차별화된다. 호이스팅 방식과 pnpm 고유의 의존성 트리 유지 방식을 비교해보자.

호이스팅 방식

전통적인 패키지 매니저(npm, yarn)에서 사용되는 방식으로, 의존성을 프로젝트 루트의 node_modules 디렉토리로 끌어올리는 것을 의미한다.
모든 의존성을 루트 디렉토리에 설치하여, 하위 패키지에서 해당 의존성을 마치 루트에 설치된 것처럼 접근이 가능하도록 한다.

호이스팅 방식의 장점

1. 간단한 접근 : 모든 패키지가 같은 디렉토리에 설치되므로, 의존성을 찾는 데 간단한 구조를 갖는다.

2. 중복 제거 : 중복된 의존성을 상위로 끌어올려 디스크 사용량이 줄어든다.

호이스팅 방식의 단점

1. 의존성 충돌 : 서로 다른 패키지가 동일한 이름의 의존성을 서로 다른 버전으로 요구할 때, 하나의 버전만 설치되므로 충돌 발생 가능성 존재한다.

2. 의존성 숨김 문제 : 하위 패키지가 암묵적으로 루트에 있는 의존성에 접근하게 되어, 의존성을 명시하지 않고 사용할 위험이 있다.

따라서 패키지가 다른 프로젝트에서 독립적으로 작동하지 않을 가능성이 높아진다.

pnpm 고유의 의존성 트리 유지 방식

pnpm은 의존성을 독립적으로 관리하며, 각 패키지의 의존성 트리를 유지한다. 또한 “flat” 구조 대신 하드 링크와 심볼릭 링크를 사용하여, 의존성이 설치된 위치를 참조만 한다.

작동 방식

.pnpm 디렉토리

모든 의존성은 루트의 node_modules 디렉토리 내부 .pnpm 디렉토리에 설치된다. 중복된 의존성은 단일 디렉토리에 저장하고, 필요한 위치에서 해당 파일에 심볼릭 링크를 생성한다.

독립적 의존성 트리

각 패키지는 자신만의 node_modules를 가지고, 필요한 의존성을 .pnpm에서 참조한다.

예를 들면 다음과 같은 구조다.

project/
├── node_modules/
│   ├── package-a/
│   │   └── node_modules/
│   │       └── dependency-a@1.0.0 -> .pnpm/dependency-a@1.0.0
│   ├── package-b/
│   │   └── node_modules/
│   │       └── dependency-a@2.0.0 -> .pnpm/dependency-a@2.0.0

따라서 package-a와 package-b는 서로 다른 버전의 dependency-a를 독립적으로 사용할 수 있다.

pnpm 방식의 장점

1. 의존성 충돌 방지 : 각 패키지가 독립적으로 의존성을 관리하므로, 서로 다른 버전의 의존성을 문제없이 사용할 수 있다.

2. 빠른 설치 : 동일한 의존성을 중복 다운로드하지 않고, 심볼릭 링크를 통해 참조하므로 속도가 빠르다.

3. 디스크 공간 절약 : .pnpm 디렉토리에 모든 의존성을 공유 저장하므로 중복 설치를 방지한다.

4. 명시적 의존성 사용 : 패키지는 반드시 자신이 명시적으로 선언한 의존성만 접근이 가능하며, 루트에 설치된 의존성에 암묵적으로 의존하지 않는다.

pnpm 방식의 단점

1. 복잡한 디렉토리 구조 : 심볼릭 링크를 사용하여 디렉토리 구조가 일반적인 방식보다 복잡해 보일 수 있다.

2. 호환성 문제 : 일부 오래된 라이브러리나 스크립트가 node_modules 트리 구조를 가정한 방식으로 동작할 경우 문제가 생길 수 있다.


pnpm의 의존성 관리 방식은 의존성 충돌 방지, 디스크 공간 절약, 명시적 의존성 관리에 강점을 가지고 있다. 특히 대규모 프로젝트에서 각 패키지의 독립적 의존성을 관리에 매우 유용하다.

참고
https://docs.npmjs.com
https://pnpm.io

렌더링 엔진과 특징 분석하기(webkit, blink, gecko)

독립 발전하는 웹 브라우저 렌더링 엔진

웹 브라우저의 대표적인 렌더링 엔진은 Webkit, Blink, Gecko 세 가지가 있다.

각각의 발전사와 점유율, 특징을 살펴보자.

1. 엔진의 점유율

각 엔진의 점유율은 해당 엔진을 사용하는 브라우저의 점유율 추정치로 살펴보면 다음과 같다.

엔진BlinkWebkitGecko
점유율75%20%3%
브라우저Google Chrome(65%)
Microsoft Edge(5%)
Opera(2.5%)
Samsung Internet(2.5%)
Brabe
Vivaldi
Safari(19%)
iOS용 모든 브라우저
Mozilla Firefox
Statcounter Global Stats – Browser Market Share 참고

‘iOS용 모든 브라우저’는 애플 OS에서 사용되는 크롬, 엣지 등은 Webkit, 이외의 윈도우, 안드로이드 등의 OS에서 사용되는 크롬, 엣지는 Blink를 사용한다는 의미가 된다.

따라서 애플 기기의 브라우저는 모두 Webkit을 사용하며, 이는 전체에서 대략 20%가 된다.

이 같은 특성을 봤을 때 맥 OS에서 개발하고 크롬의 호환성 OK 여부를 결정할 것이 아니라 실제 OS를 변경하여 브라우저 테스트의 필요성이 제기된다.

2. 발전사

Webkit

Webkit은 애플에서 개발한 오픈소스 렌더링 엔진으로 KHTML(1998년부터 사용된 HTML 렌더링 엔진)과 KJS(JavaScript 엔진)을 기반으로 2002년부터 개발되었다.

웹 브라우저에서 웹 페이지를 렌더링하기 위해 사용되며, HTML, CSS, JavaScript 등을 해석하여 사용자가 볼 수 있는 형태로 화면에 렌더링한다.

2003년 Safari 브라우저 출시와 함께 Webkit을 공식적으로 발표했으며, 2005년 오픈소스화하여 현재까지 애플 생태계 전반에 걸쳐 기본 렌더링 엔진으로 사용된다.

Webkit의 구성 요소는 다음과 같다.

WebCore – HTML, CSS, SVG, 이미지 등의 렌더링과 관련된 부분을 처리하는 핵심 렌더링 엔진

JavaScriptCore(Nitro 엔진) – JavaScript 코드를 해석하고 실행하는 엔진으로 성능이 개선된 Nitro 엔진이 주로 사용됨. Webkit을 사용하는 브라우저는 기본적으로 별도의 JavaScript 엔진이 필요없음

Web Inspector – 내장 디버깅 도구로 DOM, css, 네트워크 ㅇㅎ청 등의 분석과 디버깅이 가능

플랫폼 특정 코어 – 운영 체제와 엔진을 연결하거나 플랫폼 간의 차이를 추상화, 특정 플랫폼에서의 성능 최적화 등을 담당

Webkit의 특징으로는 웹 표준을 준수하여 최신 웹 표준을 지원하며 지속적인 최적화를 통해 성능과 에너지 효율성이 강화되었다. 특히 모바일 기기에서 배터리 소모 최소화에 중점을 둔다.

초기부터 경량화된 구조와 빠른 렌더링 속도가 장점이며 높은 에너지 효율성과 함께 애플 생태계에 최적화된 성능과 안정성을 보여준다.

그러나 애플 중심 개발과 강한 통제로 인해 애플 생태계 외에서는 기술 채택이 더디며 타플랫폼의 기여가 제한적이고 점유율이 낮다.

Blink

2013년 구글이 Webkit을 fork하여 만든 렌더링 엔진이다. Chrome 브라우저도 초기에는 Webkit을 사용했지만 아키텍쳐와 개발 방식이 맞지 않아 Blink를 개발하게 되었다.

초기 버전은 상당히 많은 부분의 코드를 공유했지만 독자적인 개발 노선을 걷기 시작하고 멀티 프로세스 아키텍쳐에 집중하여 다양한 운영 체제와 디바이스에서 원활히 작동하도록 설계되었다.

Chromium(구글 주도 오픈소스 웹 브라우저 프로젝트)은 Blink 엔진을 사용하므로 Chromium을 기반으로 하는 브라우저는 모두 Blink 렌더링 엔진을 사용한다.

Blink의 주요 구성 요소는 다음과 같다.

DOM core – HTML 파싱과 DOM 트리 생성 및 조작 지원

Layout&Render Engine – 레이아웃 계산 및 렌더 트리 생성

CSS Parser&Style Engine – CSS 파싱 및 스타일 계산

DevTools – 개발자용 디버깅 및 성능 분석 도구

참고로 Blink는 내부에 JavaScript 엔진을 포함하지 않고 외부 엔진인 V8 엔진을 사용한다.

특징으로는 멀티 프로세스 모델과 통합되어 각 탭이 독립적으로 실행되므로 보안이 강화된다. 렌더링 성능 향상을 위해 GPU를 적극 사용하고 멀티 프로세스 구조로 빠른 성능과 광범위한 생태계가 장점이다.

시장 점유율이 집중화되면서 경쟁이 줄고 웹 기술 발전이 특정 기업에 의존 경향을 보이는 것과 메모리, CPU 사용량이 많아 리소스 소모가 크고 해당 생태계에 속한 브라우저의 독립성이 감소하는 단점이 있다.

Gecko

1997년 Netscape에서 개발을 시작하였으며, 2004년 Firefox의 핵심 엔진으로 채택되었다. 2017년 Quantum 프로젝트를 통해 멀티스레드 지원, GPU 활용, 웹 표준 강화 등을 강화했다.

주요 구성 요소로는 HTML parser, CSS parser, Rendering Engine 등이 있으며, Gecko에 통합된 JavaScript 엔진은 SpiderMonkey를 사용하며 개발자 도구인 Developer Tools도 제공한다.

특징으로는 Servo 프로젝트 기술 통합을 통해 Stylo CSS 엔진을 도입하고 멀티스레드 렌더링을 지원하며 GPU 가속 활용이 강화되었다. 강력한 개인정보 보호 및 확장성이 장점이지만 낮은 시장 점유율과 Blink보다 리소스 사용량이 많은 것이 단점이다.


출처
Chromium Documentation
Google Developers Blog
Webkit Official
Mozilla Developer Network(MDN)

[BOOK] 인생의 의미


What Is Life?

삶의 의미라는 주제는 언제나 존재했다.
인간은 언제나 존재의 본질과 방향성을 찾으려 했다.
삶의 본질적인 의미 중 하나는 그 자체로 가치가 있는 자기목적적 행동에 있다.

야망이 의미 있는 결과를 가져올 수 있지만 쳇바퀴에서 끝없이 성취를 추구하는 것이 삶의 의미를 찾는 방법이라고 주장하는 사람은 아무도 없다.
화려하게 꾸며진 문화적 허식, 외적 규칙과 규범, 기술과 사회적 형태를 벗겨내면 서로 다른 것처럼 보이지만 우리 모두가 궁극적으로는 같은 동기에 의해 움직이고 있으며 시간과 공간을 초월해 공감대를 가질 수 있다. 자신과 전혀 다른 사람도 얼마든지 이해할 수 있다. 필요한 것은 인내와 상식, 경청하는 능력뿐이다.

사람들의 신념은 변화하지만 사람들의 마음은 시간이 지나도 전혀 변하지 않는다.
초점을 어디에 두든, 눈길은 밖으로도 안으로도 향해야 한다.
삶을 의미있게 만드는 유일한 것은 ‘다름’이다. 삶의 비결 같은 것은 존재하지 않는다.
어차피 모든 사람에게 적합한 것은 존재하지 않는다.
차이가 없다면 무엇도 존재하지 않으며 모든 것은 시간의 흐름과 함께 변화한다.
놀랍게도 아직 세상은 사람의 껍질로 그 사람이 결정된다고 믿는다. 그러나 순간순간의 경험은 껍질보다는 껍질 사이에 더 많은 것들이 있다고 말한다.

물건은 관계 형성을 위한 구실에 불과하다.
물건의 가치는 사람들 사이에 다리를 놓을 수 있는 잠재력에 있다.
식물도 마찬가지다. 대부분의 식물은 혼자서는 잘 자라지 못한다.
식물은 같은 종이든 다른 종이든 자신을 강화시키는 다른 식물 근처에서 번성한다.
물건 중에는 진정한 가치를 지닌 것들이 있다.
이는 물건이 아니라 소중한 추억을 떠올려주는 귀한 존재다.

건전한 세상에서는 다른 사람의 보답을 받아들이는 것 역시 균형과 상호 존중을 위해 갖추어야 할 인간의 신성한 의무다. 환대 안에는 삶의 기본적인 의미가 담겨 있다. 환대의 개념은 주는 행위보다 받는 행위에 대한 비중이 더 크다. 받는다는 행위에는 겸손과 감사의 능력이 요구된다.
환대는 거의 좋은 의미로 쓰이지만 아무 관련이 없는 사람에게 받는 환대는 반드신 좋은 의미만은 아니다. 선물을 받지 않는 행위는 잠재적 우정에 대한 상대방의 제안을 거부하는 것이다.

위기가 닥쳤을 때 가장 중요한 것은 두려움과 불안감을 공유할 수 있는 사람, 자신의 약점과 취약성을 존중하고 이해해줄 수 있는 사람의 곁에 있느냐의 여부이다.
다른 사람을 위해 자기를 버릴 필요가 없는 사람은 용서와 겸손, 감사의 능력이 온전한 사람이 될 수 없다. 온전한 인간으로 성장하려면 권리와 의무가 가득찬 친밀한 관계가 필요하다.
무엇보다 자녀는 우리가 누구인지, 우리가 함께 만들어가는 삶은 어떤지에 대해 긴 대화를 나눌 수 있는 대상이다. 아이들은 어른에게 의존하지만 어른도 아이들에게 의존한다. 아이들로 인해 어른은 삶의 취약성과 잠재력을 깨달을 수 있기 때문이다.
아이들의 놀이와 상상력은 세상을 잠재력이 넘치는 경이롭고 마법 같은 곳으로 바꾼다.
이혼을 한 많은 사람들은 이혼 후 자신의 삶에서 많은 부분이 삭제된 것에 놀라움과 실망을 표한다.

내가 관계에 의해 창조되며 그 관계 속에서 계속 재창조된다는 깊이 있는 식견에 도달했다면 자아실현을 궁극적인 목표로 삼는 개인주의는 과연 얼마나 의미가 있을지 되짚어볼 필요가 있다. 인도인과 파키스탄인들은 사랑에 기초한 결혼이 변할 수 밖에 없는 찰나의 끌림이라는 비판적 인식이 강하다.

배우자 사이가 오염되었을 때는 이혼이 필요하다. 하지만 이혼은 사람들이 생각하는 것보다 큰 대가가, 끊어진 관계의 길이와 강도에 비례하는 대가가 따른다. 그들은 결국 연결된 존재가 아닌 분리되고 고립된 존재가 된 자신을 발견하게 된다. 길고 다사다난했던 결혼 관계를 끝내는 것은 감성 충만했던 추억의 태피스트리를 만든 수많은 실을 끊는 것과 같다.

다른 종과의 관계에 있어서도 종의 다름을 인식하는 건 매우 중요한 문제다. 인간은 다른 종을 존중하고 배려해야 하지만 종 간의 특성을 무시하고 인간과 똑같이 간주하는 건 도리어 역차별이 될 수 있다.

인간은 가장 두꺼운 실 즉 가장 가까운 타인, 의미있는 타인으로부터 버림받거나 학대를 당할 때 가장 취약해진다. 이런 상황에서는 개인의 존재감에 심각한 타격을 입는다.
좋든 나쁘든 타인과 나를 연결하는 실은 중요하다. 그 실이 보이지 않는 순간 인간은 완벽히 혼자가 된다. 삶이 무의미해지는 순간이고 다른 어떤 생명체도 나를 필요로 하지 않으니 삶을 끝내는 것이 낫겠다고 생각하는 무서운 순간이다.
많은 사람들이 팬데믹 기간 동안 가장 큰 손실이라 생각했던 것은 ‘걱정 없이 쉽고 편안하게 사람들과 어울리는 것’이었다.
팬데믹의 교훈으로 물질적 생활 수준보다 삶의 질을 더 중요하게 생각하는 사회가 가능하다는 것이 입증되었다.

우리 사회에서는 권리에 대해 이야기하는 것이 흔한 일이며 권리를 신성시하고 옹호하고 그것을 위해 싸운다. 하지만 의무에 대해서는 훨씬 덜 이야기한다.
권리와 의무 사이에는 균형이 필요하며 둘 다 과거와 미래로 퍼져나가야 한다.
다른 생물들은 질문하지 않는다.
다른 생물들은 성당을 짓지도 않고 행복한 어린 시절을 회상하지도 않는다.
아메바에서 침팬지에 이르기까지 다른 생물들도 인류와 마찬가지로 주변 환경과 실을 연결하고 거기에 의존한다.

내가 탐색한 모든 관계는 동경과 갈망, 결핍 없이는 불가능하다. 세상의 모든 것들은 각기 차이가 있지만 그것을 당연한 것으로 받아들이면 그 차이는 시야에서 사라진다는 사실을 잊지 말아야 한다.
어쩌면 결핍 자체가 이 진기하고 이례적인 환경에서 가장 희귀한 자원일 수도 있다. 항상 구할 수 있는 것에는 가치가 없다. 오늘날 전 세계 중산층과 상류층이 직면한 큰 문제는 부족이 아니라 풍요다.
삶에 의미를 불어넣기 위해서는 다른 사람들이 필요하다.
세계는 예전보다 심각한 물질적 결핍에서 많이 벗어나 있지만 지금은 다른 형태의 정서적 결핍이 계속해서 우리의 삶을 방해하고 있다. 새로이 등장한 정서적인 결핍은 점점 그 존재가 커질 것이다.

비가 매일 내렸다면 땅은 그 차이를 알아차리지 못할 것이다.
갈증을 모르는 사람은 물의 가치를 모른다.
결핍만이 가치를 창출할 수 있다.
육신을 가혹한 조건에 두면서 단련하는 것은 마침내 필요한 것을 얻었을 때 만족감을 극대화시키도록 결핍을 쌓는 것이다.
무엇이든 감사할 수 있으려면 갈망할 수 있는 기회가 필요하다.

무엇이든 고질적인 나쁜 습관에서 벗어나고 싶다면 그 습관이 나와 내 주변을 연결하는 가느다란 실에서 비롯된다는 사실을 깨달아야 한다. 당신이라는 사람은 곧 당신의 관계다.

한계가 없는 세상은 어지럽다. 지나치게 부유한 사람들은 물질적으로 보통의 풍족함을 누리는 사람들보다 덜 행복하다. 배가 부르면 더 먹을 수가 없다.
스칸디나비아 사람들이 말하듯 수의에는 주머니가 없다.
생계를 위해 일할 필요가 없으면 뚱뚱하고 게을러지며, 가치 있고 아름다운 것들을 당연하게 여기면 비참해진다.
인간은 부재를 통해 중요한 것에 대해 명확하게 집중할 수 있다.
낙원에는 항상 뱀이 존재한다.
뱀의 눈에서 종종 달러 표시가 보인다는 것은 반박의 여지가 없는 사실이다.

돈은 실용적인 지불 수단이자 교환의 매개체이지만 유일한 문제는 참되고 아름답고 선한 일에 기여하기 전까지는 대체로 공허하고 의미가 없다.
돈이란 산맥과 바다로 갈라져 있고 다른 언어를 사용하는 사람들을 소통할 수 있게 해주는 일종의 정보 기술이다. 돈은 세상을 돌아가게 하지만 가장 중요한 기능은 인류를 한데 묶는 데 있다.
그러나 돈이 사회 영역에 침투하면 신뢰와 공동체는 약화되기 마련이다.

전 세계 사람들의 삶은 점점 소비 쪽으로 향하고 있다.
과거 종교가 차지했던 틈새를 소비주의가 채우고 있다.
광적인 소비는 지구를 파괴할 뿐만 아니라 소비자 자신에게도 만족감을 주지 못한다.
삶을 의미있게 만드는 것은 소비가 아니다. 시장의 수요와 공급의 원칙은 어떤 부분에서는 유용하고 필요하지만 사회를 운영하기에는 부적절하다.

진정한 철학자는 부자가 될 수 있을 만큼 똑똑하고 부자가 되지 않을 만큼 현명하다.
모든 문화에서 삶에서 의미 있는 것은 물건의 획득이 아니라는 사실을 인지하고 있다.
인간은 상실된 신앙이 남긴 영적 공허함을 물건과 소비로 채운다.

심하게 불평등한 사회에서는 부자도 가난한 사람도 편안하지 않다.
가난한 사람은 부자를 미워하고 부자는 가난한 사람을 두려워한다.

알랭 드 보통이 말한대로 휴가의 의미는 멋진 휴가를 기대하는 것과 휴가에서 얻은 추억을 공유하는 것 두 가지에 있다. 휴가 자체는 결코 기대에 부응하지 못한다. 울창한 열대 낙원, 번화한 대도시, 산속 휴양지 어디를 가든 나와 관계하는 것들로부터 떨어지지 못하는 까닭이다.

기대감은 희망처럼 희소한 자원이 되었다.
결핍은 때때로 새로운 연결을 만들어내기도 하지만 지금까지 보이지 않던 실로 인해 빛나는 경우가 더 많다. 가난에서 벗어나는 것과 필요한 것 이상이 필요한 것은 다른 얘기다.

분별 있는 철학자는 쾌락이 인생의 궁극적인 목표라고 주장하지 않으며 문제를 해결의 대상이 아닌 함께 살아가야 하는 대상으로 여긴다. 역경 없이는 성취도 없다. 평지를 걷는 것이 좋아도 가끔은 오르막길을 가야 한다. 편한 내리막길을 가려면 힘든 오르막길이 필요하다.
내가 가지고 있는 것에 대한 평가는 그것의 결핍을 경험했을 때 비로소 이루어진다.
평범한 진실이지만 되풀이할만한 가치가 있는 생각이다.

물질적으로 다 가진 듯 보이지만 그것 빼고는 가진 게 없는 이 사회에서 삶에 힘을 부여하는 것은 꿈 혹은 희망이다. 한 번쯤 세상의 중심에 서서 크든 작은 자신의 성취를 인정받는 권리는 존중되어야 한다. 어려운 일을 해냈으면 인정받는 것이 당연하다.

비물질적인 결핍을 채우는 이런 행위는 음식이나 섹스의 결핍을 채우는 것과 비교했을 때 자각하기 쉽지 않다. 하지만 일단 이런 비물질적인 결핍을 자각하는 순간 그것은 내 안의 갈망과 허기를 자극하고 마침내 성취를 이루고 타인의 인정을 받을 때면 온전한 정서적 포만감을 느끼게 된다.
어느 길을 선택하든 모든 선택에는 각각의 대안이 존재하므로 특정한 길이 옳다고 말할 수 없다. 선택이라는 행위에 대한 압박과 스트레스는 어느 정도 삶에 여유가 있는 사람들에게 부여되는 고통이다.

타인의 인정은 일종의 결핍이다. 장소와 시간에 관계없이 인간에게 가장 결핍된 요소일지 모른다.
바라던 모든 것을 가진 자는 순간 가난한 자가 되어 버린다.
결핍은 동기를 부여하고 입맛을 돋운다.
풍요로운 사회에서는 꿈을 꾸고 희망을 품는 능력이 결핍되어 있다.
영영 얻지 못할 수 있는 것을 오랫동안 고대하는 것은 가치 있는 일이다.
희망이 없으면 기대하는 것도 없고 우리는 절망적인 사람이 된다.

풍요로운 사회에서 가장 부족한 자원은 타인의 관심과 시간, 외부 세계와 연결하는 믿을 수 있는 실, 나 자신을 알게 되는 느린 시간 그리고 그 실에게 세심한 주의를 기울이는 것이다. 다른 사람의 삶에 대한 호기심과 지식은 나 자신을 아는 데 도움을 줄 뿐만 아니라 내가 살 수 있었던 다른 삶에 대해서도 배움과 깨달음을 준다.

결핍은 삶의 방향성과 집중도에 필요한 요소이지만 결핍의 가장 중요한 역할은 삶에 윤활유가 되는 마찰과 저항을 야기한다는 점이다. 마찰과 저항으로 인해 당신은 원하든 원하지 않든 삶에 전력을 다하게 되고, 극도로 어렵지만 반드시 달성해야 할 과제가 있다는 것을 깨닫는다. 이러한 저항은 결국 성취로 이어진다.

희망이 없으면 저항도 있을 수 없다. 희망은 꿈에서 자란다.
꿈속 세상에서는 모두가 평등하다. 아무도 우리의 꿈을 빼앗을 수 없다.
꿈의 가능성은 삶을 견디게 해준다.
많은 꿈이 실현될 수 없고 실현 불가능하다는 것을 알면서도 말이다.
희망은 꿈에 대한 가시적인 방향을 제시한다.
희망은 현실에 뿌리를 두고 증류된 꿈이다.

새장에 갇힌 새는 자유를 꿈꾸로 주류에 순응하는 것은 죽은 물고기뿐이다.
자유로운 새는 자유를 꿈꾸고 나서 실제 하늘로 날아간다.

시간은 내 내부와 외부에서 만들어지기 때문에 맹렬한 속도를 피하고 꿈과 희망을 품을 수 있는 틈새를 만들 수 있다. 가속화되는 정보화 시대에는 자기 이해가 결핍된다. 다양한 소비로 시간의 틈새를 메워버리기 때문이다.
꿈과 희망은 비현실적일지라도 결국엔 가능성을 만들어내는 낙관주의에 불을 붙인다.

세상이 정도에서 벗어났다는 이유만으로 보통의 삶을 거부하면 희망의 화살이 아래로 향한다. 그런 상태는 의미도 없고 삶의 질을 높이지도 못한다. 어둠을 저주하기보다 촛불을 켜는 것이 항상 더 나은 법이다.

극복될 수 있는 결핍은 삶에 의미를 불어넣는다. 숨가쁜 우리 시대에 가장 결핍된 것이 있다면 바로 느림이다. 나 자신을 알아가거나 타인을 사랑하고 배려하기 위해서만 느림이 필요한 것은 아니다. 느림 없이는 상상력도 상공으로 이륙할 수 없다.

사람은 시간을 들여야만 자신을 알 수 있고 창의적으로 변할 수 있다. 디지털로 만들어진 것들은 이런 시간 감각을 파괴할 위험이 있다. 세상을 계속 움직이게 하는 것은 느리고 반복적인 요소인데, 현대 사회는 불안하고 독창적이며 변화무쌍한 것에 중독되어 있다.

삶의 전체성과 생명의 그물망을 성찰할 때는 다른 가치관, 다른 종류의 지식, 느림의 가치에 대한 인식이 필요하다. 현대인들은 자연을 정복하고, 지배하고, 이익을 얻는 일에 아드레날린을 내뿜는다.
느린 산책은 세상을 새로운 방식으로 읽을 수 있게 해주며 과열된 세상에서 결핍된 시간이라는 선물을 선사한다.
혼자 식사를 하는 것과는 달리 혼자 걷는 것에는 의미가 있다. 혼자 걷는 것은 관계의 실을 강화하고 회복시키며 새로운 실을 생성한다. 물론 다른 사람과 함께 걸을 때도 생각과 감정이 해방되는 마법 같은 효과가 있다.
타인이 내게 내어주는 시간은 언제나 소중한 선물이다. 지금은 희소해졌지만 누군가에게 한 시간 혹은 하루 동안 온전히 집중하는 것은 매우 가치 있는 일이다.

느림은 세상이 정신없이 숨 가쁘게 돌아갈 때 균형을 잡기 위해 반드시 필요한 요소이다.
돌은 오래 간다. 고층 건물을 지으려면 고도의 공학 기술과 수천 명의 작업자와 시간이 필요하지만 그것을 폐허로 만드는 데는 순간이면 충분하다.
명성을 쌓는 데는 20년이 걸리지만 그것을 허무는 데는 5초면 족하다. 참나무가 다 자라기까지 수백 년이 걸리지만 2분이면 그것을 베어낼 수 있다.
돌은 다른 시간 감각을 따른다.
돌의 존재를 위협하는 것은 과학으로도 다 밝혀지지 않은 혼돈의 힘이다.

<종의 기원>이 남긴 가장 큰 업적인 모든 생물이 다른 모든 생물과 연관되어 있다는 메시지를 알린 것이다. 미래는 과거에 있다. 미래와 과거가 연결된 경첩이 부서지면 남는 것은 미친 듯 흘러가는 현재의 시간뿐이다. 기억은 우리의 실을 뒤로 향하게 하고 상상력은 앞으로 향하게 한다. 사람들은 서로에게 이야기를 들려줌으로써 과거로 향한다.

현대사회의 문제는 온통 새로움에 중독되어 과거를 잊고 지금의 여기만 우선시하는 것이다.
시간이 삶에 의미를 부여하는 것 이상으로 시간은 삶 그 자체다. 우리는 곧 시간이다.
시간을 덜 가진 사람들은 도리어 조급함에 시달리지 않는다.

운동선수, 뮤지션, 수학자, 예수 같은 선지자 등 중년 이전에 삶의 정점에 도달하는 사람이 있는 반면 느린 성장과 성숙이 필요한 사람들도 있다. 많은 사람들이 즉각적인 만족의 강박에 사로잡히는 것은 매사 저항이 가장 적은 길을 선택한다는 인간의 약점 때문이다. 느림이 없으면 삶은 숨이 막히고, 만족감을 주지 못하고, 머리와 꼬리도 구분할 수 없이 급히 꿰매진 조각이 되고 만다.

자신보다 더 큰 무언가의 일부가 되는 건 가치 있는 일이다. 긴 삶의 여정에서 작은 톱니바퀴나 먼지 한 줌이 되는 것만으로도 의미 있는 삶을 살기에 충분하다. 창조하는 일보다 파괴하는 일이 더 많이 일어나고 있는 현재 시대에 우리의 목표는 당장의 충동과 오만 그리고 눈부시지만 뒤틀리고 역설적인 성공을 물리치는 것이어야 한다.

언제가 너무 늦어버린 순간이 될지 알 수 없으므로 완벽한 때를 기다리며 일을 미루어서는 안 된다. 지금의 긴 시간도 순간으로 쪼개질 수 있다. 때문에 당신은 모두와 함께 지금 여기에서 해야 할 일을 해야 한다. 모든 시간은 지금도 앞으로도 그럴 것이다.
예기치 않게 찾아오는 순간이 있는가 하면, 계획과 기대가 있어야 맞이할 수 있는 순간도 있다.
역사에 깊이가 더해지려면 강렬한 순간이 필요하며, 그것이 기억으로 변화하는 과정에서 더 큰 무언가가 된다. 모든 사건은 특정 시간, 특정 장소에서 일어나고 세상은 빠른 시간과 느린 시간으로 이루어져 있다.

오늘을 즐기는 것과 장기적인 안목을 갖는 것은 모순되는 개념이 아니다. 지금 이 순간을 즐기는 능력은 먼 미래를 생각하는 능력과는 다른 종류의 삶의 의미를 제공한다. 둘 다 시간 속에 존재하는 방식이며 둘 다 꼭 필요하다. 가장 맛있는 순간은 번개처럼 전혀 예상치 못한 때 찾아오는 법이다.

모든 것이 상대적이지는 않지만 모든 것은 관계적이다. 의미는 실과 기대에서 비롯된다. 질병이나 장애, 가난과 억압에 시달리는 사람들도 즐거움으로 빛날 수 있고 만족스러운 삶을 살 수 있다. 만족스럽고 충만한 삶은 밝은 마음을 불행과 불운으로부터 떼어 놓으며, 고통조차 희미하게 옅어지는 강렬한 축복의 순간을 놓치지 않고 기억 속에 저장하는 능력에서 비롯된다.

마르쿠스 아우렐리우스는 순간이면 충분하다고 하였다. 아무리 짧은 순간일지라도 충분히 의미 있을 수 있으며 순간을 통해 삶에 만족할 수 있다는 뜻이다.
순간의 덧없음과 자신의 하찮음을 인식하는 일은 주로 피할 수 없는 일을 받아들일 때 자각된다.
순간이 매일의 삶에 소금과 양념을 더해주는 것은 맞지만 실체와 방향을 말해주는 것은 ‘긴 지금’과 ‘큰 여기’이다.

도전적인 목표를 향해 손을 뻗는 것도 삶에서 필요하다. 어려운 일을 해내고 그에 대해 인정을 받고 싶은 욕구는 인생의 중요한 의미 중 하나다. 기억에 남는 순간에는 놀라움이라는 요소가 필수이다. 매일의 삶에는 작지만 놀라운 일이 항상 일어난다. 다행히도 그 중에는 즐거운 놀라움이 많다.

또한 세상은 아무도 묻지 않았던 질문에 대한 답으로 가득하다. 새로운 문을 열 때 마주하는 놀라움은 느닷없이 찾아오며 우리는 감정적이고 본능적으로 반응한다. 지혜의 총량을 증가시키는 것은 이런 작은 깨달음에서 비롯된다. 인공지능의 가장 큰 문제 중 하나는 자기 멋대로 할지도 모른다는 사실이 아니라 호기심이 없다는 것이다.

놀라움과 호기심은 동전의 양면과도 같다. 완전하게 통제되고 엄격하게 계획된 삶을 고집하는 사람은 ‘놀랄 권리’를 포기하는 셈이다. 새롭고 예기치 못한 것을 경험하는 놀라움을 버리는 것이다.
삶은 작은 개인부터 내가 아끼는 사람들 그리고 앞으로 만나게 될 또는 만나지 못하게 될 모든 사람에 이르기까지 다양하다. 궁극적으로 선하고 의미 있는 삶은 올바른 균형을 찾는 데 달려 있다.
균형은 삶의 거의 모든 부분에 필요하다.
균형 없이는 의미 있는 삶을 살 수 없다.
하나는 다른 하나가 있을 때 의미가 있다는 것이다.

인생의 의미는 행복과 다르다. 의미 있는 삶이 반드시 행복한 삶일 필요는 없다. 행복한 삶이 때로는 방향성 없고 관계에 긍정적인 영향을 미치지 못하는 공허한 삶일 수도 있다.
상황을 예측하여 차선책을 찾는 것과 위험을 감수하는 것 사이의 균형 또한 중요하다. 위험을 회피하는 것은 비겁한 행동이지만 위험에 끌리는 것은 오만한 행동이다.

모든 것에 관심을 가지면 지루할 틈이 없다. 뇌 안의 더 많은 시냅스를 활성화할수록 더 많은 연결을 촉진할 수 있다. 지금의 가장 큰 문제는 연결을 만드는 마음의 능력이 아니라 정보 과부하다.

아름다움에 대한 기준은 다양하지만 아름다움에 대한 이상은 어디에나 존재한다. 외적인 모습도 중요하다. 옷차림은 꽤 많은 메시지를 전달한다. 지나치게 간소한 옷차림은 과한 옷차림보다 더 나쁜 결과를 불러올 수 있다. 광채가 나는 존재감은 직접 측정하거나 관찰할 수 없지만 자신감과 내면의 조화에 대한 이야기이며 사람들에게 욕망과 매혹을 불러일으킨다.

만들어진 지식이 지혜가 되는 것은 지금과 여기를 크고 깊게 보는 시야로 전체를 조감할 때뿐이다. 이런 상태에 도달하기 위해 느린 시간과 필터가 필요하다. 기술에서 벗어나 느림과 지속적 관심의 미덕을 유지하는 균형이 현대 사회의 핵심 과제다.

데이터는 통계나 언어로 옮겨질 때 비로소 정보가 되고 정보는 더 큰 맥락에 놓일 때 비로소 지식이 된다. 그제서야 데이터가 실제로 무엇을 말하고 무엇을 말하지 않는지 파악할 수 있게 된다. 정보가 넘쳐나는 시대에 불필요하고 중요하지 않은 것을 무시할 수 있는 능력이 균형을 찾기 위해 매우 중요하다. 좋은 평가를 내리는 기술은 다른 균형의 기술과 마찬가지로 경험을 통해 성장한다. 나이 먹는 일의 가장 큰 즐거움 중 하나는 전체를 보는 관점을 기를 수 있다는 데 있다.

종교는 감사와 용서, 겸손의 마음을 우리에게 안겨준다. 작고 보잘것없는 내가 더 큰 전체의 일부라는 사실을 깨닫게 해준다. 종교의 핵심은 미신과 폭력이 아니고 신과 악마, 천사에 대한 이야기의 핵심은 거대한 세상 속 인간의 의미에 대해 나누는 대화라는 사실이다. 우리는 순환의 일부이며, 먼지 구름 속 먼지 한 톨, 대양 속 물 한 방울, 유기체 속 하나의 세포에 불과하다.

인생은 선형적이지 않고 다중 시간적이다. 우리의 수명은 선형적이며 출생에서 죽음에 이르는 궤적을 따른다. 평생을 쾌락과 재미를 좇아 살았다면 세상과 작별을 고하는 일이 고통스럽고 어렵다. 목표가 없고 의미가 쌓이지도 않고, 성취에 이르지도 못하는 활동으로는 삶을 즐길 수 없기 때문이다. 

인생은 의미로 가득차 있지만 모든 것에는 때가 있다. 작별을 고하고 그동안 쌓아온 실이 설장하고 번성하도록 놓아주어야 하는 시간도 있다. 우리는 자신의 잠재력을 실현하기 위해 최선을 다한다. 때가 되면 내려놓을 줄도 알아야 하고, 조용히 공상에 잠길 줄도 알아야 한다. 세상은 다채롭고 가능성이 풍부한 멋진 곳이지만 모든 것에는 때가 있다. 내려놓아야 할 때도 분명 있다.

세상은 당신 없이도 잘 돌아가지만 당신이 최선을 다했다는 사실은 세월 안에 고스란히 남는다.

[BOOK] UX/UI 10가지 심리학 법칙

사용자 경험 개선을 위한 10 가지 고려사항

UI/UX를 사용하는 주체가 사람인 만큼 알 수 없는 사람의 마음을 연구하는 심리학은 UI/UX와 더 없이 좋은 궁합을 이루는 요소이다.

유명한 심리학 법칙을 UI/UX에 적용하고 개선점을 생각해볼 수 있다는 점에서 디자이너 뿐만 아니라 프론트엔드 개발자에게도 크게 도움이 될 만한 내용이다.

소개하는 법칙을 간략하게 알아보자.

제이콥의 법칙

사용자는 모든 사이트가 자신이 알고 있는 다른 사이트들과 같은 방식으로 동작하길 원한다.

익숙한 디자인은 쉽게 사용방법을 알 수 있으므로 정신적인 노력이 줄고 인지 부하가 감소한다. 따라서 인터페이스를 익히는 데 드는 정신적 에너지가 줄어들게 되고, 이는 목표 달성에 사용할 에너지가 늘어나게 되는 것을 의미한다. 따라서 성공적인 목표 달성 확률도 높아진다.

페이지 구조, 작업 흐름, 내비게이션, 검색 등의 전략적인 영역에 일반적인 디자인 패턴이나 관례를 사용하는 것은 해당 웹사이트나 애플리케이션을 즉시 사용할 수 있도록 하기 위해 흔히 쓰는 방법이다.

제이콥 닐슨이 제창한 제이콥 법칙은 사용자가 다른 웹사이트를 통해 축척된 경험을 바탕으로 디자인 관례에 대한 기대치를 형성하는 경향을 보인다는 법칙이다.

사용자의 멘탈모델(시스템의 작동 방식에 관해 알고있다고 생각하는 부분)을 따르지 않는 디자인은 서비스 인지 방식이나 이해 속도에 악영향을 미친다.

제이콥 법칙은 똑같은 디자인을 옹호하는 법칙이 아니라 사용자가 새로운 경험을 이해하기 위해 기존 경험을 활용한다는 사실을 상기시키는 것으로 보아야 한다.


피츠의 법칙

사용성(usability)은 사용이 편하다는 것을 의미하며, 인터페이스가 이해하기 쉽고 탐색하기도 쉽다는 뜻이다. 

인터랙션은 최소한의 노력만으로 불편없이 간단하게 이루어져야 하며, 인터랙티브 요소를 사용하기 위해 움직이는 시간은 인터랙션의 중요한 지표이다.

터치 대상의 크기는 사용자가 정확하게 선택할 수 있을 정도로 충분히 커야 하며, 터치 대상 사이에는 충분한 거리를 확보해야 한다.

또한 터치 대상은 쉽게 도달할 수 있는 영역에 배치해야 한다.


힉의 법칙

의사 결정에 걸리는 시간은 선택지의 수와 복잡성에 비례해서 늘어난다.

인터페이스에 선택지가 많으면 효율적이지 않으며, 사용자의 니즈를 완벽히 이해하지 못했다는 것을 드러낸다.


밀러의 법칙

자극에 포함되는 정보 양의 기억 범위는 7개 정도이다. 기억 범위에 더 큰 영향을 끼치는 건 정보의 기본 단위인 비트(Bit)가 아니라 정보 덩어리(Chunk)의 개수이다. 단기 기억에는 한계가 있으며 정보 비트를 유의미한 덩어리로 정리하면 단기 기억을 최적화할 수 있다는 것이 밀러 연구의 핵심이다. 개인이 기억할 수 있는 덩어리의 수는 맥락이나 익숙한 정도, 수용력 등의 요인에 따라 달라지더라도 단기 기억은 한계가 있으므로 정보를 덩어리로 만들면 더 효과적으로 암기할 수 있다. 덩어리화는 UX 디자인에서 콘텐츠를 다룰 때 도움이 되며, 콘텐츠를 적절한 덩어리로 나누면 이해하기 쉬운 디자인이 완성된다.

콘텐츠를 시각적으로 뚜렷이 구별되는 그룹으로 나누고 명확하게 체계화하면 디지털 콘텐츠를 평가하고 처리하는 방식에 알맞은 정보를 표시할 수 있다.

덩어리화한 콘텐츠는 모듈별로 그룹 지어지고 규칙에 따라 나뉘며 체계가 부여되기 때문에 콘텐츠끼리 어떤 관계를 이루고 있는지 사용자가 쉽게 이해할 수 있다.

특히 정보의 밀도가 높은 경험을 덩어리화하면 콘텐츠 구조가 형성된다.

따라서 콘텐츠를 적절한 크기의 덩어리로 나누어 정리하면 사용자가 정보를 더 쉽게 처리하고 이해하고 기억하는데 도움이 된다.


포스텔의 법칙

인터페이스와 시스템은 안정성과 접근성을 보장해야 하며 인터페이스 디자인은 사용하기 쉬워야 한다. 사용자의 입력은 포맷이나 메커니즘을 막론하고 무조건 수용해야 한다. 또한 다양한 입력 방식이나 네트워크 대역폭, 연결 강도 등 여러 변수에서 발생하는 차이를 모두 아울러야 한다. 

폼은 본질적으로 인간이 시스템과 인터랙션하는 수단으로, 사용자는 제품이나 서비스가 요청한 정보를 폼 요소를 통해 전송한다.

또한 사용자에게 요청하는 정보의 양은 보수적으로 책정해야 한다. 사용자가 채워야 할 필드가 늘어날수록 인지적 에너지와 노력도 커지며, 이는 의사결정 피로도(decision fatigue)와 연결되므로 중복된 요청없이 꼭 필요한 정보만 요청해야 한다.


피크엔드 법칙

피크엔드 법칙이란 감정적인 절정과 마지막 순간의 경험에 집중하여 어떤 것을 판단하는 경향을 의미한다. 따라서 사용자의 전체 경험을 긍정적으로 만들려면 이러한 순간에 각별한 주의를 기울여야 한다. 

인지편향이란 정보를 처리하고 의사결정을 내리는 과정에서 생기는 체계적인 오류를 의미한다. 이는 인간의 뇌가 복잡한 정보를 단순화하거나 빠르게 판단하기 위해 사용하는 휴리스틱(heuristic)에서 비롯된다.

인지 편향의 한 종류인 피크엔드 규칙은 기억 회상을 방해하는 기억 편향으로 자신의 감정을 강하게 자극한 사건을 그렇지 않은 사건보다 더 잘 기억하게 된다. 


심미적 사용성 효과

외형적 사용성은 내재된 사용 편의성보다 외형적 아름다움과 더 큰 연관이 있다.

브라운의 디자이너인 디터 람스는 less but better 원칙으로 형태가 기능을 따를 것을 강조한다.

미학적으로 이름다운 디자인은 사용성 문제를 눈감아 줄 확률이 더 높아지는 심미적 사용성 효과가 작동하기 쉽다.


폰 레스토프 효과

폰 레스토프 효과는 인간이 다른 요소와 시각적으로나 개념적으로 분리된 항목을 잘 기억하는 것을 의미한다.

집중 능력은 용량과 지속 시간에서 제한이 있기 때문에 관련 없는 정보를 희생하고 관련 있는 정보에 집중하는 것을 선택적 주의력(selective attention)이라고 한다.

선택적 주의력의 한 가지 사례로 배너 무시(banner blindness)라는 행동이 있다. 이는 사용자가 광고라고 인식하는 요소를 무시하는 경향을 가리키는 용어로, 디지털 광고처럼 도움이 되지 않는 정보를 무시하는 것이다.

따라서 꼭 필요한 콘텐츠라고 해도 광고처럼 보이거나 광고 근처에 위치하게 되면 무시당할 가능성이 있음을 주의해야 한다.

폰 레스토프 효과를 잘 활용하면 사용자를 의도대로 안내할 수 있으며, 폰 레스토프 효과는 남용하지 말고 명확한 목적이 있을 때만 사용해야 한다.

아예 아무것도 강조하지 않는 것보다 더 나쁜 것은 지나치게 많은 시각적 경쟁 요소를 강조하는 것이다. 


테슬러 법칙

이 법칙은 모든 애플리케이션과 프로세스에는 완전히 없애거나 감출 수 없는 일정량의 복잡성이 존재함을 의미한다.

이 복잡성은 개발 과정이나 사용자 인터랙션 단계에서 처리하게 된다. 개발 단계에서 제거하지 못한 복잡성은 사용자에게 전가되고 사용자 경험으로 이어진다. 제품과 서비스 사용자가 겪을 불필요한 복잡성을 제거하여 명쾌하고 단순한 경험을 구현하는 것은 디자이너+개발자가 추구해야 할 중요한 목표이다.

좋은 사용자 경험이란 목표 달성을 방해하는 장애물을 제거한 쉽고 직관적인 경험이다. 그러나 인터페이스가 너무 추상적인 수준까지 단순해지면 사용자가 올바른 결정을 내리는 데 필요한 정보가 충분히 제공되지 않으므로 주의해야 한다.


도허티 임계

컴퓨터 반응 시간이 생산성에 불균형한 영향을 미치는 것을 의미한다.

컴퓨터와 사용자는 서로 기다리지 않아도 되는 속도로 인터랙션할 때 생선성은 급격히 높아지며 느린 시스템은 인터페이스를 사용하는 사람의 생산성을 떨어뜨린다.

반응이 즉각적이라고 느끼려면 0.1초 이내여야 한다. 0.1~0.3초 사이의 지연은 맨눈으로 감지되는 수준이므로 자신의 통제에서 벗어난다고 느낄 수 있다.

1초 이상의 지연은 인지 부하가 커지고 사용자 경험이 나빠지게 된다. 스켈레톤 스크린을 사용하면 사이트가 더 빨리 로딩되는 것처럼 보이므로 속도와 반응성에서 더 긍적적으로 인지하게 된다. 


기타

다크 패턴은 기술이 사용자의 행동에 영향을 미치는 또 하나의 방법이다. 참여도를 높이기 위해 불필요한 정보 공유나 마케팅 정보 수신 허용 등 사용자가 의도하지 않은 행동이나 그들에게 도움이 되지 않는 행동을 하도록 유도하는 것이다.

예를 들면 재고가 부족하다고 느끼면 더 갖고 싶어하는 심리를 이용해 재고의 상태를 표시하는 희소성 패턴(scarcity pattern)이 있다.


결국은 사용자의 인지 부하를 감소시키고 복잡성을 줄여 최고의 사용자 경험을 안겨주기 위한 방법은 사용자 입장에서 고민하고 생각하여 결과물을 만드는 것으로 귀결된다.

이외에도 좋은 내용이 많다.

[BOOK] 돈의 심리학

당신은 왜 부자가 되지 못했는가

적나라하게 내가 했던 과오들을 설명한다.

지금부터 다시 시작하는 마음으로 미래를 준비해야겠다.

가장 와닿았던 말은 돈의 가치에 관한 말이다.

돈의 가치는 사고 싶은 것을 마음껏 살 수 있는 데 있는 게 아니라

내가 원하는 시간에 원하는 사람과 원하는 것을 할 수 있는 자유를 얻는데서 온다는 것이다.

그리고 밤에 잠을 편안하게 잘 수 있는 주식과 느긋함, 기다림이 필수라는 것.


천재라고 해도 감정에 대한 제어력을 상실하면 경제적으로 큰 문제를 불러올 수 있다.

사람들이 왜 빚에 허덕이는지 이해하려면 이자율을 공부하는 것이 아니라 탐욕과 불안, 낙천주의의 역사를 공부해야 한다.

행운과 리스크는 한 뿌리에서 나온 것이다. 우리가 살면서 만나는 모든 결과는 단순히 개인의 노력 이외에도 여러 가지 힘에 의해 좌우되는 것을 알아야 한다.
따라서 누군가를 판단할 때는 모든 성공이 노력 덕분도 아니고 모든 빈곤이 게으름 때문이 아니라는 사실을 꼭 알아야 한다.
확실한 것은 어떤 결과가 100% 노력이나 의사 결정으로 이루어지는 것은 아니라는 것이다.

성공에서 행운이 차지하는 역할을 인정한다면 리스크의 존재는 우리가 실패를 판단할 때 자신을 용서하고 이해의 여지를 남겨야 한다는 뜻이다. 겉으로 보이는 것만큼 좋은 경우도 나쁜 경우도 없다.

현대 자본주의는 두 가지를 좋아한다. 부를 만들어내는 것과 부러움을 만들어내는 것. 충분함을 느끼지 못한다면 삶은 재미가 없다. 결과에서 기대치를 뺀 값이 행복이다.

워렌 버핏의 경제적 성공은 사춘기에 쌓았던 금전적 바탕과 노년까지 사업에서 손을 떼지 않은 덕분이다. 재주는 투자였지만 비밀은 시간이었다. 투자에서 가장 강력한 힘을 가진 것은 시간이다.

최고의 수익률을 올리는 것이 훌륭한 투자인 것은 아니다. 최고의 수익률은 일회성이라 반복할 수 없기 때문이다. 괜찮은 수익률을 꾸준히 올리는 것이 더 나은 투자이다. 여기서 복리의 힘을 빌릴 수 있다. 복리가 빛을 발하려면 자산이 불어날 수 있도록 오랜 시간을 허락해야 한다.

돈을 버는 것과 유지하는 것은 별개이다. 돈을 벌 때는 리스크를 감수하고 낙천적 사고를 하고 적극적 태도를 갖는 등의 요건이 필요하다. 그러나 돈을 지키는 것은 정반대의 재주를 필요로 한다. 검소해야 하며 돈이 빠르게 사라질 것을 두려워할 줄 알아야 한다.

번 돈의 일부는 행운의 덕이므로 과거의 성공이 되풀이될 것이라 믿지 말고 절제하는 태도를 가져야 한다.

현금 덕분에 약세장에서 주식을 홀딩할 수 있다면 현금으로 인한 실제 수익률은 몇 배일 수 있다. 절박함 때문에 주식을 파는 일을 막는 것이 성공할 주식 수십 가지를 고르는 것보다 평생 수익률에 더 도움이 될 수도 있다.

정말 중요한 것은 남들이 미쳐가는 날에 어떤 의사 결정을 내리는가 하는 점이다. 투자자로서의 성공 여부는 공포의 순간에 보이는 반응이다.

실제로 사람들이 원하는 것은 돈으로 살 수 있는 비싼 것들이 아니라 남들로부터의 존경과 칭찬이다. 그리고 존경과 칭찬은 비싼 물건들이 아니라 겸손, 친절, 공감이 더 많은 존경을 가져다 준다.

부는 눈에 보이지 않는다. 부는 구매하지 않은 좋은 차와 같다. 눈에 보이는 물건으로 바꾸지 않은 금전적 자산이다.

대부분은 백만장자가 되고 싶다고 할 때 실제 의미는 백만 달러를 쓰고 싶다는 뜻이다. 그리고 이는 백만장자가 되는 길과 정반대의 길이다.

부자가 되는 유일한 방법은 돈을 쓰지 않는 것이다. 이것이 부를 축적하는 유일한 길일뿐만 아니라 부의 정의이다.

부는 숨어있다. 부는 쓰지 않은 소득이며, 나중에 무언가를 사기 위해 아직 사용하지 않은 선택권이다. 부의 진정한 가치는 언젠가 더 큰 부가 되어 지금보다 더 많은 것들을 살 수 있는 선택권과 유연성을 제공한다.

부를 쌓는 것은 소득, 투자 수익률과 관계없으며 저축률과 관계가 깊다. 은행에 있는 현금은 어떤 걱정으로부터 자유롭고 싶을 때 스스로 자유롭게 선택할 수 이는 여지를 준다.

지금처럼 서로 연결된 세상에서 지능은 믿을 만한 이점이 아니지만 유연성은 이점이 될 수 있다.

금융에 관한 의사 결정은 냉철하고 이성적인 것보다는 적당히 합리적인 것이 좋다.

인내심은 성공 확률을 나에게 유리한 쪽으로 끌어오기 위함 필수 요소이다.

데이 트레이딩(단타)이나 개별 주식은 성공 확률이 낮아 이성적이지 않은 행동이지만 근질거리는 마음을 해소하는 용도로 사용하면 다른 포트폴리오를 건드리지 않을 수 있으므로 적당히 합리적인 행동이 될 수 있다.

투자자들은 감정이 있다. 그렇기 때문에 과거 행동에 기초해서 미래의 행동을 예측하기가 어렵다. 과거에 의존하면 미래를 바꿀 이례적인 사건을 놓칠 가능성이 크다.

아무리 옳다고 해도 자신의 칩을 모두 걸 수 있는 순간은 없다. 세상은 누구에게도 친절하지 않으므로 일이 계획대로 되지 않을 때를 대비하는 계획을 항상 마련해야 한다. 실제로 모든 계획에서 가장 중요한 것은 계획이 계획대로 되지 않을 때를 위한 계획을 세워두는 것이다.

매몰 비용은 사악한 역할을 한다. 미래를 과거의 포로로 만들어 버린다. 더 빨리 결단을 내릴수록 더 빨리 복리의 마법을 시작할 수 있다.

성공적인 투자에는 대가가 따라붙는다. 대가는 변동성, 공포, 의심, 불확실성, 후회로 지불한다. 대가를 피하려고 하는 투자자는 결국 대가를 두 배로 치르게 된다.

돈과 관련해 중요한 점은 시간을 어떻게 보는지를 자각하고 나와 다른 게임을 하는 사람들의 행동에 설득당하지 않는 것이다.

보통은 낙관주의에 베팅하는 것이 최선이다. 대부분 사람들에게 세상은 점점 더 나아지는 경향이 있기 때문이다.

비관주의는 낙관주의보다 더 똑똑한 소리처럼 들리고 그럴싸해 보인다. 비관주의는 기대치를 낮추고 실제로 가능한 결과와 내가 기뻐할 수 있는 결과 사이의 거리를 좁힌다.

극단적으로 좋은 상황이나 극단적으로 나쁜 상황은 오래 지속되는 경우가 거의 없다. 예측하기 힘든 방식으로 수요와 공급이 적응하기 때문이다.

진정한 성공은 나를 사랑해줬으면 하는 사람들이 나를 사랑하는 것이다.

대부분의 사람이 진심으로 원하는 것은 돈이 가져다주지 않는다.

맥 nvm 14 버전 설치 오류 해결(nvm install 14)

apple silicon,nvm node 버전 14 설치하기

비교적 오래된 프로젝트에서는 호환성 문제로 인해 노드 버전을 낮춰서 작업하는 상황이 발생한다.

이 때 NVM을 사용하면 편리하게 노드 버전을 변경할 수 있다.

하지만 특정 버전(특히 node 14)은 설치가 되지 않고 에러 메시지가 끝없이 올라가는 상황이 발생한다.

이 때는 아키텍쳐(맥 실리콘, M1, M2, M3 등)이 원인인 상황이 많으므로 로제타2(Rosetta2)를 사용해 아키텍쳐를 x86_64로 전환해야 한다.

먼저 로제타2가 설치되어 있는지 확인하기 위해 다음 커맨드를 입력한다.

$ /usr/bin/pgrep oahd

프로세스 ID가 반환되면 이미 설치되어 있는 상태이다.

설치되어 있지 않다면 먼저 로제타2를 설치한다.

로제타2 설치 방법 (애플 서포트 페이지)

이제 터미널에서 다음 커맨드를 입력해보자.

$ arch

arm64가 출력되면 다음 커맨드를 사용해 x86_64로 전환한다.

arch -x86_64 zsh

다시 arch 커맨드를 입력해보면 변환된 아키텍쳐가 반환되는 것을 확인할 수 있다.

이제 nvm install 14를 문제없이 설치할 수 있다.

페이지 이동 후 쿠키가 사라지는 문제(Next.js, setHeader, writeHead)

설정한 쿠키가 페이지 이동 후 사라질 때 의심해 볼 상황

getServerSideProps에서 writeHead 또는 setHeader로 쿠키를 설정하고 redirect 시

등록된 쿠키가 사라지는 상황이 있다.

redirect된 페이지에서 쿠키가 사라진다면 헤더 설정의 문제를 확인해 봐야 한다.

합리적으로 의심해 볼 수 있는 문제는 페이지 이동 후 쿠키가 사라졌으므로 쿠키의 사용 범위에 대한 설정 문제이다.

Path=/ 설정은 쿠키가 모든 경로에서 유효하도록 설정하는 옵션이다. 이 옵션을 통해 모든 페이지에서 쿠키에 접근할 수 있도록 설정하므로 해당 옵션이 누락되면 페이지 이동 시 쿠키가 사라지는 문제가 발생한다.

setHeader와 writeHead를 사용해 path=/를 포함하는 쿠키 설정 예제를 확인해보자.
HttpOnly는 클라이언트의 자바스크립트에서 쿠키에 접근할 수 없도록 설정하는 옵션이다.

export async function getServerSideProps({ req, res }) {

  res.setHeader('Set-Cookie', 'myCookie=value; Path=/; HttpOnly; Max-Age=3600');

  return {
    redirect:{
      destination: '/new-page', // redirect할 페이지
      permanent: false
    }
  }
}

writeHead의 사용도 확인해보자.

export async function getServerSideProps({ req, res }) {
  const cookieVal = 'myCookie=value; Path=/; HttpOnly; Max-Age=3600';

  res.writeHead(302, {
    Location: 'new-page', // redirect할 페이지
    'Set-Cookie': cookieVal,
    'Custom-Header': 'Custom', // 커스텀 헤더
  });
  
  res.end();

  return {
    props: {}
  };
}

writeHead의 첫 번째 파라미터는 HTTP 응답 상태 코드, 두 번째는 헤더 객체를 설정한다.

헤더 객체 내부의 Location 필드로 redirect 페이지를 설정할 수도 있고, return 문에 redirect를 전달하면서 페이지를 설정할 수도 있다.

Next.js의 기본 권장 방식은 return 문에서 redirect를 전달하는 방법이다.

그렇다면 writeHead와 setHeader의 차이점은 무엇일까?

  • writeHead는 상태 코드를 설정(setHeader는 불가능)할 수 있는 등의 세세한 설정을 할 수 있다.
  • setHeader는 응답이 시작(res.end())되기 전 여러 번 호출이 가능하지만 writeHead는 한번만 호출한다.

따라서 상태 코드와 여러 헤더를 동시에 설정하려면 writeHead, 개별적으로 헤더를 추가하고 수정할 때는 setHeader를 사용하는 것이 좋다.

이와 같이 Path=/를 추가하면 이동하는 페이지에 상관없이 애플리케이션에서 쿠키를 확인할 수 있다.


추가 참고 : Next.js 공식 문서(Setting Headers)

다양한 이미지 파일 종류 알아보기(WEBP, PNG, SVG, JPG, TIFF….)

Webp, png, svg, gif, psd, eps, tiff

이미지 파일 종류는 크게 웹용(WEBP, PNG, SVG, JPG, GIF)과 인쇄용(PSD, EPS, TIFF)으로 나눌 수 있다.

1. 웹용 이미지 데이터

– SVG
벡터(Vector) 그래픽을 기반으로 하는 이미지 데이터. 크기를 조절해도 품질이 저하되지 않으며 텍스트 기반이므로 코드로 이미지를 수정할 수 있다. 로고, 아이콘, 일러스트 등에 적합하며 PNG보다 더 작은 용량을 유지할 수 있다.

– PNG
무손실 압축 중 작은 파일 용량이 장점인 래스터(Raster) 형식의 이미지 데이터. 그림이나 로고 등 간단한 이미지에 적합하며 SVG에 비해 브라우저 호환성, 투명 배경, 필터 효과, 복잡한 색상과 세부 사항 표현 등에 더 유용하다.
무손실 압축이지만 해상도 제한으로 인해 크기에 따라 품질이 저하될 수 있다.

– WEBP
구글이 개발한 이미지 형식으로 손실과 무손실 압축을 모두 지원한다. 손실은 JPG, 무손실은 PNG와 유사한 방식으로 품질을 유지하고 파일의 크기를 줄인다. 알파 채널을 지원하여 투명 배경을 사용할 수 있고 여러 장의 사진을 사용해 애니메이션을 만들 수 있다. 동일 품질 대비 JPG, PNG보다 약 30% 가량 크기가 작으며, 웹 이미지 최적화 등에 사용된다.

– JPG
JPEG라고도 하며, 사진이나 그라데이션 등 여러 색상을 포함하는 이미지에 적절하다. 손실 압축을 사용하므로 용량이 작지만 같은 이미지를 계속 JPG로 덮어쓰게 되면 계속되는 손실 압축으로 인해 화질 저하가 계속 발생하게 된다.

– GIF
색의 수가 256색으로 파일 용량이 작으며, 여러 이미지의 배열을 통해 움직이는 영상을 만들 수 있다. 무손실 압축 방식을 사용하지만 색상 수의 제한으로 인해 일부 사항이 손실될 수 있다.

2. 인쇄용 데이터

– TIFF
이미지를 압축하지 않고 저장하는 형식의 데이터. 인쇄 및 그래픽 작업에서 인기가 많으며 저장을 반복해도 화질 저하가 발생하지 않는다. 무손실 방식이므로 파일 크기가 크고 압축, 최적화가 부족하여 웹용으로는 적절하지 않으며, 대부분의 브라우저에서 제대로 지원되지 않는다.

– PSD
포토샵 저장 형식으로 레이어 정보를 포함해 저장할 수 있다. 레이어 정보를 포함하면 용량이 커지므로 저장 시 레이어 병합을 통해 용량을 줄일 수 있다. 포토샵 기능을 활용해 복잡한 이미지를 만들 수 있으며, 고해상도 이미지를 저장할 수 있다. 브라우저가 지원하지 않으므로 JPG, PNG등으로 변환해야 한다.

– EPS
어도비 PortScript로 만든 형식의 데이터. 저해상도와 고해상도를 가지고 있어 저해상도로 작업하고 고해상도로 출력할 수 있다. 벡터 그래픽 장점을 최대한 활용할 수 있으며, 주로 인쇄에 적합하다.


MDN – SVG
Wikipedia – PNG
Wikipedia – WebP

spec.template: Invalid value 에러


~~~ is invalid. spec.template: Invalid value

yaml을 작성하고 kubectl apply -f sample.yaml과 같이 적용할 때 spec.template에러가 뜨는 상황이 있다.

이 에러가 뜬다면 해당 yaml로 파드를 처음 생성하는 것이 아니며 ,수정 사항이 조건에 위배되기 때문이다.

spec.Completions
spec.Selector
spec.Template
 

이 항목들은 수정이 불가하도록 지정되어 있다. 따라서 spec.template를 수정하는 apply하는 상황에서 발생한 에러이다.

수정이 불가하므로 신규 생성만 가능하다.

간단한 해결 방법으로 해당 yaml을 kubectl delete -f sample.yaml로 제거한 뒤 다시 apply를 적용하면 에러가 해결되는 것을 확인할 수 있다.


참고 : https://github.com/kubernetes/kubernetes/issues/89657

bash에서 vim 설치(feat.한글 설정)

bash: vim: command not found

경량화를 추구하는 컨테이너에는 기본 에디터가 제공되지 않으므로 필요 시 직접 설치해야 한다.

간단하게 bash에서 vim 에디터를 설치하는 방법과 한글 설정(UTF-8, CP949)까지 알아보자.

1. vim 에디터 설치

$ apt-get update

Hit:1 http://deb.debian.org/debian bookworm InRelease
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Hit:3 http://deb.debian.org/debian-security bookworm-security InRelease
$ apt install vim

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libsodium23 vim-common vim-runtime xxd
Suggested packages:
  ctags vim-doc vim-scripts
The following NEW packages will be installed:
  libsodium23 vim vim-common vim-runtime xxd
0 upgraded, 5 newly installed, 0 to remove and 40 not upgraded.
Need to get 8962 kB of archives.
After this operation, 41.8 MB of additional disk space will be used.
Do you want to continue? [Y/n] 

bash에서 두 커맨드를 실행하고 y를 눌러주면 끝이다(권한 문제가 발생하면 sudo를 앞에 붙인다).

그런데 한글이나 일본어 등을 사용하려면 인코딩이 필요하다.

UTF-8을 설정해보자.

vim 인코딩 설정(UTF-8)

설치한 vim을 사용해 /etc/vim/vimrc을 열고 하단에 다음 내용을 추가한다.

" Source a global configuration file if available
if filereaedable("/etc/vim/vimrc.local")
  source /etc/vim/vimrc.local
endif

//추가하는 부분
set encoding=utf-8
set fileencodings=utf-8,cp949

utf-8은 mac, cp949는 windows에서 사용하는 인코딩 방식이다.

저장하면 vim에서 한글 등이 사람 언어로 표시된다.