[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에서 한글 등이 사람 언어로 표시된다.

알기 쉬운 BEM 알아보기(CSS)

block__element_modifier모듈 기반의 방법론 (+mix)

공식 문서(https://en.bem.info)에서는 BEM을 이렇게 설명한다.

BEM(Block, Element, Modifier)는 컴포넌트 기반 접근 방식이다. 기본 아이디어는 사용자 인터페이스(UI)를 독립된 블록으로 나누는 것이다. 이를 통해 복잡한 UI도 쉽고 빠르게 개발할 수 있으며, 기존 코드를 재사용할 수 있는 장점이 있다.

BEM은 모듈을 Block, Element, Modifier 단위로 분해하며, 각 앞 글자를 따서 BEM으로 부른다. BEM은 러시아 Yandex사에서 개발한 방법론으로 실제로 이 방법에 기반한 CSS 설계 기법이 널리 사용되고 있지만 BEM은 CSS에만 국한되지는 않는다.

그렇다면 BEM의 공통 규칙과 모듈의 개별 규칙을 알아보자.

CSS style을 위한 BEM 공통 규칙

– ID 셀렉터와 태그 셀렉터를 사용하지 않는다.
– 네스팅된 셀렉터 사용을 최소화한다.
– CSS 클래스 네이밍 컨벤션을 사용하여 이름 충돌을 피하고 셀렉터의 목적을 명확하게 한다.
– Blocks, Elements, Modifiers를 구분하여 사용한다.
– Blocks를 재사용한다.

BEM의 네이밍 규칙

모두 소문자를 사용하며, 두 단어는 하이픈(-)으로 연결한다.

Blockblock, block-two
Elementblock 이름을 상속받아 언더스코어 두 개(__)로 연결block__element, block-two__element-two
ModifierBlock/Element 이름 상속받아 언더스코어 하나(_)로 연결. 키-값 쌍은 스네이크 케이스(_)를 사용.
block_modifier, block__element_modifier, element_key_value
Modifier
(MindBEMding)
Block/Element 이름 상속받아 하이픈 두개(–)로 연결. 키-값에서 키는 생략가능.block–modifier, element–value

모듈의 개별 규칙

논리적, 기능적으로 독립되어 재사용이 가능한 모듈로 정의한다. 클래스 이름은 ‘형태’가 아니라 ‘목적, 용도’를 나타내야 한다.

EX) head, logo, menu (O)
blue-button, small-title (X)

block은 다른 block 내부에서도 사용할 수 있으며, modifier를 통해 위치나 모양을 변경할 수 있다.

그림 – block의 중첩(출처: en.bem.info)

Element

block을 구성하며 block 내부에서만 사용하는 모듈로 정의한다. 예를 들어 menu__item은 menu라는 block을 구성하며 menu 밖에서는 사용할 수 없으므로 element가 된다.

그림 – block을 구성하는 element(출처:en.bem.info)


element 클래스 이름도 block과 동일하게 ‘형태’가 아니라 ‘용도’를 나타내야 한다.
element는 선택적 요소이므로 사용하지 않아도 상관없지만 element 이름을 중첩하여 사용하지 않는다.

EX) block__element__element, menu__button__icon (X)

Modifier

block/element의 모양이나 동작을 정의하는 모듈이다.
modifier는 선택적 요소이므로 사용하지 않아도 상관없지만 단독으로는 사용할 수 없고 block/element와 함께 사용해야 한다.
같은 block이라도 modifier에 따라 모양이 변할 수 있으며, modifier는 런타임이나 block에 따라 바뀔 수 있다.
modifier 클래스 이름은 형태(크기, 색, 상태, 동작)을 나타내야 한다. 형태로 나누면 boolean, key-value 두 가지가 있으며, 각각의 예는 다음과 같다.

– boolean : ex) active, disabled
– key-value : ex) color_red, line_doubled (스네이크 케이스로 표현)

modifier의 수는 제한이 없으므로 여러 개를 붙일 수 있지만 동일한 스타일은 중복하지 않는다.

MIX

mix는 하나의 요소에 역할이 다른 여러 클래스를 사용하는 기법이다.
장점은 코드를 복사하지 않고 기존의 스타일과 조합해서 새로운 모듈로 사용할 수 있다.
block+element, block+block, element+element 등의 mix를 사용할 수 있으며, 샘플 코드를 통해 확인할 수 있다.

<!-- HTML -->
<div class="header">
  <div class="logo header__logo"></div>
</div>

/* CSS */
.logo {
  width:100px;
  height:50px;
}
.header__logo {
  margin: 12px;
}

다른 요소와 관계된 레이아웃과 관련된 부분은 mix, block 내부의 문제는 modifier를 사용하는 것이 좋다.
mix는 독립성과 재사용성이 높은 상태를 유지하는 장점이 있다.


참고
https://en.bem.info
– 다양한 예제로 배우는 CSS 설계 실전 가이드


CSS 설계를 위한 기본 가이드

변경과 확장에 강하고 안정적인 CSS 구조를 위한 기법

다양한 예제로 배우는 CSS 설계 실전가이드에서 소개하는 설계의 핵심을 알아보자.

CSS의 여러 설계 기법들도 결국에는 다음 여덟 가지 리스트에 속한다고 하니 핵심을 관통하는 포인트라고 볼 수 있다.

1. 특성에 따른 CSS 분류
2. 느슨한 스타일의 결합
3. 적당한 영향 범위
4. 특정 컨텍스트에 대한 적절한 의존도
5. 적절한 명시도(specificity)
6. 영향 범위가 유추 가능한 클래스 네임
7. 형태, 기능, 역할의 유추가 가능한 클래스 네임
8. 확장 용이성

1. 특성에 따른 CSS 분류

첫 번째는 CSS 역할이나 특성에 따라 분류하는 것이다.

베이스 그룹 : 사이트에서 베이스가 되거나 공통으로 적용되는 사항 등
레이아웃 그룹 : 헤더(header), 푸터(footer), 콘텐츠(content) 영역 등
모듈 그룹 : 재사용되는 모듈 등

모듈 자체에는 레이아웃과 관련된 부분은 설정하지 않는 것이 좋다. 모듈은 자신의 레이아웃에는 관여하지 않고 해당 모듈 자체의 역할 및 자녀 요소의 스타일링에만 관심을 가져야 한다. 여기서 레이아웃과 관련된 부분이란 다음과 같다.

-position, z-index, top/right/bottom/left, float, width, margin

/* 베이스 */
body {
  font-family: 'Noto Sans';
}

/* 레이아웃 */
layout_content {
  width: 1000px;
  padding: 10px;
  margin: 0 auto;
}

/* 모듈 */
.bl_media {
  display: flex;
  justify-items: center;
  align-items: center;
}

.bl_media_title {
  margin: 5px;
  font-weight: bold;
}

2. 느슨한 스타일의 결합

정확히는 HTML과 스타일링의 느슨한 결합이다. 느슨한 결합이란 의존하지 않는 상태를 이야기하는데 가장 간단한 방법으로는 요소형 셀렉터를 피하고 클래스 셀렉터를 사용하는 것이다.

p{}, div{}, h1{}과 같이 요소의 스타일을 직접 정의하는 요소형 셀렉터는 요소의 변경이 발생하게 되면 스타일이 중복되거나 누락될 가능성이 크므로 클래스를 사용해서 정의하는 것이 좋다.

3. 적당한 영향 범위

영향 범위를 가능한 좁게 하거나 영향 범위가 넓은 CSS의 스타일을 최소화한다.

영향 범위를 고려하지 않은 채 스타일을 추가하다보면 의도하지 않은 부분에서 오류가 발생하므로 최대한 범위를 줄이기 위해 가장 가까운 부모 요소를 포함시키거나 손자와 자녀 셀렉터의 사용도 함께 검토하는 것이 좋다.

4. 특정 컨텍스트에 대한 적절한 의존도

컨텍스트란 위치 또는 상황을 의미하며, 이 컨텍스트가 변할 때 코드가 동작하지 않을 수 있는 상황을 주의해야 한다. 사용 목적이 명확하다면 문제없지만 그렇지 않은 경우에는 셀렉터를 불필요한 부분까지 구체화하게 되면 해당 문제가 발생하기 쉽다.

/* id인 main을 지정하게 되면 해당 모듈 내부에서만 사용 가능한 .title_top 클래스가 되어 의존도가 높아짐. -> 불필요한 #main 제거 */
#main .title_top{
  display:flex;
  align-items: center;
  color: green;
}

5. 적절한 명시도(specificy)

우선순위를 나타내는 명시도와 관련된 내용은 여기를 클릭하면 확인할 수 있다.

명시도가 높은 CSS의 단점은 다음과 같다.

– 셀렉터 예측이 어려움
– 다른 요소(부모 요소 등)에 대한 의존도 상승
– 덮어쓰기의 어려움
– 유지 보수의 어려움

당연히 !important는 사용하지 않는 것이 기본이며, 셀렉터를 사용할 때는 클래스 셀렉터를 사용한다. id 셀렉터는 우선순위가 매우 높으며 한 페이지 안에서 동일한 값은 한번 밖에 사용하지 못하는 제약도 있으므로 id를 사용하는 이점은 많지 않다.

따라서 기본적으로 클래스 셀렉터를 사용해서 의도하지 않은 우선 순위가 뒤섞이지 않도록 해야 한다.

6. 영향 범위가 유추 가능한 클래스 네임

규모가 커질수록 모듈이나 클래스도 늘어나므로 하나의 클래스 수정이 어떤 범위까지 영향을 미칠지를 이름에서 판단할 수 있도록 해야 한다.

HTML에서 정의된 요소의 클래스 네임만 보고도 CSS의 영향 범위를 유추할 수 있도록 하자.

클래스 네임으로 영향 범위를 쉽게 유추하기 위해서는 자녀 요소에 루트 요소의 클래스 네임을 포함하도록 하는 것이 좋다.

7. 형태, 기능, 역할의 유추가 가능한 클래스 네임

영향 범위와 마찬가지로 형태, 기능, 역할도 유추가 가능하도록 네임을 지정해야 한다.

– title1, title2, title3
– main-title, nav-title, sub-title

두 항목 중 형태나 기능, 역할의 유추가 쉬운 쪽이 어디인지는 분명하다. 각 모듈의 기능이나 역할에 맞춰 이름을 붙이는 것이 매우 중요하다. 특히 작은 규모의 코드라면 title1, title2와 같이 네임을 대충 지정하기 쉽다. 하지만 규모란 언제 어떤 방식으로 커질지 모르므로 항상 습관적으로 이름에서 형태, 기능, 역할을 유추할 수 있고 구체성과 범용성의 균형을 맞추도록 하는 노력이 필요하다.

8. 확장 용이성

확장성이란 결국 기능의 추가나 유지와 연결되는 부분으로, 항상 가능성을 열어두어야 한다.

확장이 쉽도록 클래스를 설계하거나 추가하는 클래스에는 기능, 역할에 따라 적절한 상세도와 영향 범위를 갖도록 한다.

확장이 쉬운 클래스란 멀티 클래스를 사용하는 것으로, 하나의 클래스에는 보편적인 속성, 추가 클래스에는 특정 속성을 추가하여 덮어쓰기를 통해 여러 클래스로 스타일을 지정하는 방식이다.

이를 통해 HTML은 복잡해지지만 CSS는 매우 간단해지는 트레이드오프가 발생하기도 한다. 하지만 멀티 클래스의 이점은 불규칙한 상황에서도 클래스 하나만으로 원하는 작업을 완료할 수 있는 간결함이다.

결국 모든 항목은 별개의 사항이 아니라 다 연결되어 있음을 알 수 있고, 작은 수정 하나가 큰 나비효과를 불러올 수도 있다는 점을 명심해야 한다.

매번 하나하나 체크해가면서 코드를 작성하기보다는 작성 방식이 고민되거나 자율성이 주어졌을 때, 해당 리스트를 떠올리면서 작성하다보면 생각보다도 더 견고한 구조를 만들 수 있을 것이다.


참고 : 다양한 예제로 배우는 CSS 설계 실전가이드(2021, 제이펍)

[BOOK] 프레임

세상을 바라보는 마음의 창

지구를 ‘구sphere’라고 부르는 이유는 평균 때문이다. 울퉁불퉁한 면이 있더라도 평균적으로 보면 지구는 둥글다. 사람을 보는 우리의 눈도 그래야 한다.

주변에서 일어나는 모든 일을 자신과 관련시켜 해석하는 경향은 정신 건강을 해치는 주범 중 하나이다. 심리학 연구에서 ‘자기’에 대해 지나친 생각이 남들과 자신을 자주 비교하게 만들고 행복을 저하시킨다는 점을 보여준다. 물론 자신이 세상을 바라보는 소통의 창구가 되는 것을 막을 수는 없다.

진정한 지혜는 나 자신의 행동을 설명하는 것과 동일한 방법으로 다른 사람의 행동을 설명하는 마음의 습관이다.

사람은 마음 속에 CCTV를 설치해놓고 자신을 감시하고 있으면서 다른 사람이 자신을 주목하고 있다고 착각한다. 다른 사람들이 나를 주시하고 있다고 생각하지만 정작 우리를 보는 것은 남이 아닌 자기 자신이다.

우리는 연극의 주인공이 아니지만 자신은 스타들처럼 조명 받고 있다고 착각하면서 다른 사람들의 시선을 필요 이상으로 신경 쓴다.

어떤 것이든 자신과 관련지어 바라볼 때 기억이 잘되는 현상을 자기 준거(self-reference)효과라고 한다. 똑같은 것이라도 자신과 관련지어 생각하면 기억을 더 잘하게 된다.

세상은 아직 살 만한 곳이고 주변에는 좋은 사람들이 많다고 생각하는 사람은 가까이 해도 좋다. 이런 사람은 누구와 있어도 상대의 장점부터 보기 때문이다.

자기 주변에 남을 비방하는 사람이 많다고 불평하는 사람은 가까이 하지 않는 것이 좋다. 자신이 남의 허물을 습관적으로 들춰내는 사람일 가능성이 높기 때문이다.

우리가 다른 사람을 평가하는 내용을 보면 다른 사람보다 자신이 어떤 사람인지를 더 많이 드러낸다.

허위 합의 효과에 사로잡힌 우리가 깨달아야 할 사실은 세상에는 자신의 생각과 다른 사람들이 생각보다 훨씬 많다는 것이다.

자기중심적 프레임 때문에 다른 사람들도 나와 비슷할 것이라고 생각한다. 이런 현상을 허위 합 효과(false consensus effect)라고 하며, 자신의 의견이나 선호, 신념, 행동이 실제보다 더 보편적이라고 착각하는 자기중심성을 나타내는 개념이다.

지혜가 기대림의 대상이 아니라 적극적인 훈련의 대상이 될 수 있는 이유는 지혜의 본질이 우리 마음의 한계를 지각하는 데 있기 때문이다.

기본적으로 제시되는 양이 ‘사회적으로 바람직한 평균적인 양’이라고 해석하는 경향이 있어 이에 따라 사람의 행동도 변한다.

현명한 소비자는 소유보다는 경험의 프레임을 가지기 위해 노력한다. 경험을 위해 구매한 물건은 대부분 사람들과의 관계에 사용되는 것들이다. 이는 어떤 물건의 구매 행위를 통해 새로운 삶을 경험하는 것이 소유 자체를 위해 구매하는 것보다 많은 사람들에게 더 큰 행복감을 안겨준다.

같은 물건을 사면서도 경험 프레임을 갖고 구매하는 사람은 물건을 통해 맛보게 될 새로운 경험에 주목한다.

일상에서 소유의 프레임과 경험(존재)의 프레임이 가장 빈번하게 대비를 이루는 분야는 소비의 영역이다.

어떤 문제에 봉착했을 때 해결점을 찾지 못하는 이유는 처음부터 문제의 본질이 무엇인지 제대로 프레임하지 못했기 때문이다.

상위 프레임은 왜 이 일이 필요한지 그 이유와 의미, 목표를 묻는다. 비전을 묻고 이상을 세운다. 하위 수준의 프레임에서는 일의 난이도와 시간의 소요, 성공 가능성 등의 구체적인 절차부터 묻는다.

상위 수준의 프레임은 우리가 죽을 때까지 가져야 할 삶의 태도이며 자손에게 물려줄 수 있는 가장 위대한 유산이다. 상위 프레임에서는 Why를 묻지만 하위 프레임에서는 How를 묻는다.

행복은 ‘무엇’이 아니라 ‘어떻게’의 문제이며 행복은 대상이 아니라 재능이다.

프레임은 결심의 대상보다는 설계의 대상이다. 언어와 은유, 가정과 전제, 단어와 질문, 경험과 맥락 등을 점검하여 더 나은 것으로 설계해야 한다.

우리의 프레임을 확인할 수 있는 하나의 일화가 있다.

‘아버지와 아들이 야구 경기를 보러 가기 위해 집을 나섰다. 그런데 아버지가 운전하던 차의 시동이 기차 선로 위에서 갑자기 꺼졌다. 달려오는 기차를 보며 아버지는 시동을 걸려고 황급히 자동차 키를 돌렸지만 소용이 없었고, 결국 기차는 차를 그대로 들이받고 말았다. 둘 다 크게 다쳐서 응급실로 옮겨졌다. 수술을 하기 위해 응급실로 달려온 외과 의사가 아들의 차트를 보고 “난 이 응급 환자를 수술할 수 없어. 얘는 내 아들이야!”라며 절규를 한다. 대체 어떻게 된 영문일까?’

프레임의 영향을 받지 않는다면 쉽게 이 의사는 아들의 엄마인 것을 알 수 있다. 그러나 ‘외과 의사=남자’라는 프레임에 영향을 받는다면 삼류 소설을 쓰기 시작할 수도 있다.

프레임의 또 다른 경우도 있다.

만약 안 좋을 일과 좋은 일을 하나씩 경험할 수 있다면 무엇을 먼저 경험하는 것이 좋을까? 답은 대체로 안 좋은 일을 먼저 경험하는 것이 낫다. 안 좋은 일 다음에 경험하는 좋은 일은 더 달콤하게 느껴질 뿐만 아니라 뒤의 좋은 경험이 앞의 안 좋은 경험을 긍정적으로 재해석해주기 때문이다.

인생에서는 순서가 중요하다. 젊어서 고생은 사서 한다는 말이 있듯이 젊은 시절의 고생이 인생 후반의 경험을 더 달콤하게 만들어주기 때문이다.

질문의 순서가 중요한 이유도 앞의 질문이 뒤에 나오는 질문을 해석하는 프레임으로 작동한다.

앞의 경험이 뒤에서 하게 될 경험을 바라보는 프레임으로 작동하는 것이다.

자기 삶에 대한 평가가 시시하다면 내가 시시한 질문을 던지고 있기 때문인지 모른다. 답이 안 나오는 인생을 살고 있다면 질문에 문제가 있을 가능성이 있다. 무언가 더 나은 답을 찾고 싶은 사람은 세상을 향해 던지고 있는 질문부터 점검해야 한다.

마지막에 대한 우리의 기대는 각별하다. 그래서 마지막이라고 정의를 내리면 그 프레임은 대상에 대한 우리의 기대와 평가를 극적으로 바꾼다.

어떤 상황에 처하기 전에는 보지 못했던 것들이 이후의 맥락에서는 보이기 마련이다. 역지사지란 상대의 맥락을 이해해주는 것이다.

프레임은 우리가 지각하고 생각하는 과정을 선택적으로 제약하고 궁극적으로 지각과 생각의 결과를 결정한다.

우리 마음의 한계를 자각하는 것은 역설적으로 한계 밖에 존재하는 새로운 곳으로의 적극적인 진군을 의미한다.

건물 어느 곳에 창을 내더라도 그 창만큼의 세상을 보게 되듯이 우리도 프레임이라는 마음의 창을 통해 보게 되는 세상만을 바라본다.

세상은 강자와 약자, 성공과 실패로 나뉘지 않는다. 세상을 배우는 자와 배우지 않는 자로 나뉠 뿐이다.

[BOOK] 나는 앞으로 몇 번의 보름달을 볼 수 있을까

사카모토 류이치의 세상을 대하는 태도

아름다운 선율의 음악을 만드는 사람들이라도 저마다 세상을 대하는 태도는 모두 다르겠지만 사카모토 류이치의 음악은 그의 마음가짐과 세상을 바라보는 따뜻한 시선을 그대로 담은 것만 같다.

이 책은 인생의 마지막에서 누구보다 죽음에 가까운 상태에서 인생을 돌아보며 쓴 글이다. 어떠한 마음가짐으로 하루하루를 지내야 할지 다시 한번 생각해보게 한다.

Merry Christmas, Mr.Lawrence는 영화 제목이자 사카모토 류이치의 가장 유명한 곡이기도 하다. 주연으로 캐스팅된 사카모토 류이치가 전공(도쿄예술대 작곡)을 살려 음악 감독도 맡겨달라고 청하게 되고 그의 요청이 이루어지게 되면서 음악이 탄생하게 된다.

물론 별모자가 사카모토 류이치의 젊은 시절이다.

마음에 와닿았던 부분들을 간략하게 적어본다.

설령 위선자라 비판을 받는다 해도 그로 인해 사회가 조금이라도 나아질 수 있다면 좋은 일이 아닌가. 환경에 관한 운동도, 지진 재해 후 활동도 이런 신념의 힘으로 실천하고 있다. 한번 연결되면 쉽게는 그만둘 수 없다.

역시 인간은 일하지 않고 돈만 받는다고 만족할 수 있는 생물이 아니다.

결국 사용 편리성의 좋고 나쁨은 기술 그 자체보다 설계자가 얼마나 사용자의 입장을 깊이 고려했는가에 의해 좌우된다고 생각한다.

환갑을 넘기고, 큰 병을 앓고, 속세의 욕망에 휘둘리지 않는 청빈한 상태가 되었기 때문에 비로소 자신이 올라야 할 산이 모습을 드러내기 시작한 것 같다. 큰 나선을 그리듯 빙 돌아서 원점으로 돌아온 셈이다.

기본적으로는 자연스럽게 살다 자연스럽게 죽어가는 것이 동물 본래의 순리이자 생명 본연의 모습이라고 믿는다. 인간만 거기서 벗어나 있다.

몸이 건강할 때는 시간의 영원함이나 일방향성을 전제로 하는 면이 있었지만 생의 유한함에 직면한 지금은 이제까지와는 다른 각도에서 다시 생각해볼 필요가 있다고 느낀다.

친구끼리는 사상이나 신념, 취미가 달라도 아무런 문제가 되지 않는다. 그저 묵묵히 기댈 수 있는 사람, 그런 이들이 많지 않아도 확실하게 존재하므로 그것만으로도 나는 행복한 사람이라고 느낀다.

인간은 자신의 죽음을 예측하지 못하고, 인생을 마르지 않는 샘이라고 생각한다. 하지만 세상 모든 일은 고작 몇 차례 일어날까 말까이다. 자신의 삶을 좌우했다고 생각할 정도로 소중한 어린 시절의 기억조차 앞으로 몇 번이나 더 떠올릴 수 있을지 모른다. 나는 앞으로 몇 번이나 보름달을 더 볼 수 있을까. 사람들은 이런 사실을 모르고 기회가 무한하다고 여긴다.