2021.04월.읽음 - 사용 시작한지는 한달정도 되었는데 사용법이 쉬워 기본 사용에는 큰 어려움이 없었고, 책을 보며 좀더 고급 기능을 배우게 되었습니다.

업무와 일상을 정리하는 새로운 방법 Notion - 전시진, 이해봄 지음 [Jpub, 2019년05월16일]

 

Notion.so

 

Notion – 메모, 작업, 위키, 데이터베이스를 위한 올인원 워크스페이스.

매일 쓰는 여러 업무용 앱을 하나로 통합시킨 새로운 도구. 당신과 당신의 팀을 위한 올인원 워크스페이스예요.

www.notion.so

Notion.so - 도움말과 지원

 

도움말과 지원

Notion에서는 원하는 방식으로 문서를 작성하고 도구나 시스템을 구성할 수 있습니다. 이 페이지 오른쪽 상단에 있는 검색을 클릭해 필요한 내용을 검색하세요.

www.notion.so

 

 

목차

 

이 책의 구성 004
머리말 015
독자 지원 016
Notion Pro 제공 템플릿 10선 017
Notion 활용 사례 019



[Chapter 01 업무 효율성을 높여줄 Notion 시작하기]


Notion 01 분산된 도구를 하나로 모아주는 Notion 023
_ 개인 노트부터 기업의 협업 도구까지 023
_ Notion의 주요 특징 025   => 블록(Block), 클라우드 기술, 다양한 문서 편집, Embed
Notion 02 편리한 사용을 위한 Notion 설치하기 026   => www.notion.so/desktop
Notion 03 Notion 계정 생성하기 030
_ 구글 계정으로 생성하기 030
_ 다른 이메일로 생성하기 033
_ 프로필 설정 및 계정 생성 이후 기본 절차 둘러보기 035
Notion 04 Notion 플랜 및 유료 결제하기 040
_ 플랜 살펴보기 040
_ 유료 플랜으로 결제하기 041
Notion 05 다른 도구에서 데이터 가져오기 044
_ Import 기능 사용하기 044
_ 에버노트에서 가져오기 046
_ 트렐로에서 가져오기 052
_ 아사나에서 가져오기 055
_ Google 문서 가져오기 057
_ 드롭박스 Paper 가져오기 061
_ Quip 데이터 가져오기 064
_ 워크플로위 파일 가져오기 065
_ 그 밖의 다양한 파일 가져오기 068



[Chapter 02 다양한 도구의 통합을 위한 탄탄한 기본기 다지기]


Notion 01 Notion의 기본 구조 이해하기 073
_ 하나의 작업공간에서 영역을 구분하는 섹션 074
_ 활용도 200%의 자율성을 가진 페이지 076
_ 레고 블록 같은 Notion 블록 077
Notion 02 생산성 도구를 하나로 모아줄 페이지 생성 및 관리하기 079
_ 새 페이지 만들고, 하위 페이지 만들기 079
_ 디렉토리 구조의 페이지 구성하기 082
_ 페이지 스타일로 보기 좋게 꾸미기 084
_ 필요 없는 페이지 삭제하기 090  => 페이지 보호를 위해 [Page Lock]을 설정하여 잠금 설정.
Notion 03 텍스트 관련 기본 블록으로 기본기 다지기 093
_ 클릭 한 번으로 블록 추가하기 093
_ 텍스트 관련 다양한 블록 살펴보기 095
_ 텍스트에 스타일 적용해서 꾸미기 100
_ 블록 종류 자유롭게 변경하기 102
_ 블록 재사용으로 빠르게 편집하기 103
_ 필요 없는 블록 삭제하거나 이동하기 104
_ 블록 이동으로 단 나누기 105
Notion 04 실전! 대시보드 페이지 만들기 107
Notion 05 이미지부터 영상까지 삽입하는 MEDIA 블록 114
_ Image, Video, Audio, File 블록 114
_ 즐겨찾기 웹사이트를 관리하는 Web Bookmark 블록 118
_ 프로그래밍도 Notion에서, Code 블록 119
Notion 06 거의 모든 서비스를 삽입하는 EMBEDS 블록 120
_ Embed 기능으로 삽입할 수 있는 서비스 120
_ 풍성한 Notion을 책임질 Embed 블록 활용하기 122
_ 여행 계획에 효과적인 Google Maps 블록 124   => https://maps.google.com -> /embed 또는 /Google Maps로 추가.
_ Notion에서 PDF 파일 내용 바로 확인하기 128
Notion 07 이런 것까지 가능해? ADVANCED 블록 130
_ 수학 기호를 사용하고 싶다면 Math Equation 블록 130   => /math
_ 반복되는 업무 서식을 만들 수 있는 Template Button 블록 131
_ 페이지 내비게이터 역할을 하는 Breadcrumb 블록 132   => /breadcrumb
_ 자동으로 목차를 생성해주는 Table of Contents 블록 133   => Heading 1,2,3 블록으로 내용 작성하고, /toc
Notion 08 템플릿 페이지 만들고 활용하기 134
_ Notion에서 제공하는 기본 템플릿 사용하기 134
_ 기본 템플릿 종류별 기능 살펴보기 136
_ 다른 사용자가 만든 페이지 복사해서 사용하기 138



[Chapter 03 데이터베이스를 알아야 진정한 Notion 사용자]


Notion 01 Notion의 꽃, 데이터베이스 알고 가기 143
_ 페이지 위치에 따른 DATABASE 블록의 구분 144   => inline <-> Full Page [Turn into Page]로 전환.
_ 다양한 형태의 뷰 추가 생성하기 149
_ 각 뷰의 형태 및 쓰임 살펴보기 152   => 5가지 뷰 [표, 보드, 캘린더, 리스트, 갤러리]
_ 여러 뷰를 동시에 배치하여 관리하기 157   => [Create Linked Database](/linked) -> 필터, 정렬 등

      => DATABASE 블록을 단으로 나누려면 BASIC 블록으로 단을 구분해 놓고 그 아래로 DB 블록을 이동.
Notion 02 데이터베이스 각 열의 속성 지정하기 162
_ Notion 데이터베이스와 스프레드시트의 차이점 162   => Notion의 데이터베이스에서는 각 행이 하나의 페이지.

      => 행에 있는 각 칸은 하나의 페이지에 포함된 옵션들.
_ 각 열마다 지정할 수 있는 데이터 속성 163
Notion 03 기본 속성의 종류 및 쓰임 살펴보기 167
_ 문자 또는 숫자만 입력하기 167   => 속성: 텍스트(Text), 숫자(Number) => 숫자형식 지정 가능.
_ 태그를 선택하여 값 입력하기 170   => 속성: 선택(Select), 다중선택(Multi-Select)
_ 날짜 형식 입력하기 173   => 속성: 달력(Calendar) => Remind로 알림 설정.
_ 협업 중인 사용자 입력하기 178  => 속성: 사람(Person)
_ 파일 첨부하고 이미지, 동영상 추가하기 178   => 속성: 파일과 미디어(Files & Media)
_ Checkbox & URL & Email & Phone 179   => 셀 래핑(Wrap Cells)으로 여러 줄 보기 설정/해제
Notion 04 데이터베이스의 고급화, ADVANCED 속성 182
_ 엑셀 함수와는 다른 Notion Formula 182   => 속성: 수식(Fomula)
_ 관계형 데이터베이스 Relation 183   => 서로 다른 데이터베이스끼리 연결하여 특정 행의 데이터를 페이지 형태로 가져오는 기능.
_ Relation의 단짝, 열 정보를 가져오는 Rollup 184   => 연결된 데이터베이스로 가지않고 데이터를 보여주는 기능.
_ 생성 시간 Created Time과 생성한 사용자 Created By 185
_ 마지막 수정 시간 Last Edited Time과 수정한 사용자 Last Edited By 186
_ 데이터베이스를 요약해주는 Calculate 187



[Chapter 04 함수, 관계형 데이터베이스 그리고 롤업]


Notion 01 수식 작성의 기본, 열 선택 또는 상수 입력 193
_ Properties: 데이터베이스의 열 193   => prop("열 이름")
_ Constants: 상수 194   => e(오일러 상수), pi, true/false 등
Notion 02 사칙연산 및 결과를 비교하는 Operators 기본 함수 196
_ if: 조건의 참, 거짓을 구분하는 함수 197   => if (prop("열") > prop("열2"), true, false) <해당열을 미리 숫자로 변경>
_ add: 두 열을 더하는 함수 198   => add(prop("열"), prop("열2")) 또는 prop("열") + prop("열2") <열 속성이 숫자면 덧셈, 열 속성이 문자열이면 문자열 연결>
_ subtract: 두 열을 빼는 함수 200   => subtract(num1, num2) or num1 - num2
_ multiply, divide: 두 열을 곱하고 나누는 함수 200
_ pow, mod: 거듭제곱 값과 나머지를 구하는 함수 201
_ unaryMinus: 결과에 -를 붙이는 함수 203   => "unaryMinus(num)" or "-num" ;양수->음수로 음수->양수로 변환
_ unaryPlus: 논리값을 숫자로 변경하는 함수 203   => "unaryPlus(num)" or "+num" ;논리값(true,false)을 1,0으로
_ not: 결과의 반대를 도출하는 함수 203   => true면 false로
_ and, or: 두 조건 모두 충족하거나, 하나만 충족하거나 204   => and(boolean, boolean), or(boolean, boolean)
_ equal, unequal: 두 인수를 비교하는 함수 206
_ larger, largerEq: 두 인수의 크기 비교 함수 208
_ smaller, smallerEq: 두 인수의 크기 비교 함수 209
Notion 03 못하는 게 없는 Functions 고급 함수 210
_ concat, join: 텍스트를 더하는 함수 210   => join("-", "A", "B", "C", "D"), concat("A", "-", "B", "-", "C", "-", "D")
_ slice: 지정한 위치의 텍스트만 가져오는 함수 212   => slice(text, num1, num2) ;특정 위치 문자열 얻기
_ length: 텍스트의 개수를 세는 함수 214   => length(text)
_ format, toNumber: 텍스트 또는 숫자로 변경하는 함수 214   => format(value) ;문자열로 변환.
_ contains: 단어 포함 여부를 판단하는 함수 216
_ replace, replaceAll: 지정한 텍스트를 다른 텍스트로 바꾸는 함수 217
_ test, empty: 지정한 텍스트 혹은 빈 칸을 찾는 함수 218   => test(prop("열"), "A") ;열에서 A포함이면 true
_ abs: 절댓값을 표시하는 함수 219
_ cbrt: 큐브루트(3도 루트) 구하는 함수 220
_ ceil, floor, round: 올림, 내림, 반올림 함수 220
_ exp: 오일러의 상수의 거듭제곱 222   => e ^ number 동일
_ ln, log10, log2: 자연 로그, 밑수 10인 로그, 밑수 2인 로그 관련 함수 223
_ max, min: 가장 큰 수 또는 작은 수 224
_ sign: 양수, 음수 판단 함수 225   => 양수 1, 음수 -1, 0은 0
_ sqrt: 제곱근 함수 225
_ start, end: 시작 날짜 혹은 마지막 날짜 226
_ now: 오늘 날짜와 시간 227
_ timestamp, fromTimestamp: 밀리초 관련 함수 228
_ dateAdd, dateSubtract: 날짜에서 기간을 더하거나 빼는 함수 228
_ dateBetween: 날짜와 날짜 사이의 기간을 구하는 함수 230
_ formatDate: 날짜 형식 지정 함수 231   => formatDate(now(), "YYYY-MM-DD HH:mm:ss
_ minute, hour, day, date, month, year: 날짜 함수 232
Notion 04 고급 같은 기본 기능, 관계형 데이터베이스와 롤업 234
_ 서로 다른 데이터베이스 연결해보기 234   => 열속성을 "관계형(Relation)"으로 하고, 셀 클릭하여 DB연동.
_ 열 데이터를 구체적으로 확인하는 롤업 기능 240   => 열속성을 "롤업(Rollup)"으로 하고, 셀 클릭하여 설정.
_ 여행지별 가격 정보 확인 및 합계 구하기 243   => 여행DB들 Relation하고, 티켓 가격 Rollup해서 Sum 계산.
_ Rollup 속성으로 가져온 데이터에 함수 적용해보기 245



[Chapter 05 Notion으로 생산성 올리기]


Notion 01 작업 속도를 2배로 올려줄 단축키와 명령어 249
_ 빠른 실행을 도와주는 단축키 249    => 단축키 많아요. Notion 윈도우 어플 사용시..

_ 마크다운 스타일 문법 252
   => 마크다운 스타일 문법

      '- 개인적으로 자주 사용하는 것: *, 1., >(토글), "(인용), ---, [], #(Heading, TOC 만들때)

_ 슬래시(/) 명령어 252
Notion 02 Notion의 제어판, 왼쪽 사이드바 활용하기 255
_ All Updates: 변경 사항을 한방에 확인하기 256
_ FAVORITES 섹션: 자주 사용하는 페이지를 한곳에 모아두기 257
_ WORKSPACE 섹션: 협업이 필요한 페이지 258   => 모든 팀원에게 공개
_ PRIVATE 섹션: 나만의 개인 공간 259   => 특정 페이지만 공유하려면 PRIVATE내 두고 특정 페이지 공유.
_ SHARED 섹션: 임의의 사용자와 공유한 페이지 261
Notion 03 자료를 빠르게 찾는다, 퀵파인드 및 검색 기능 262
_ 모든 페이지 검색은 Quick Find 262   => Ctrl+P
_ 페이지에 포함된 텍스트 검색하기 263   => Ctrl+F
_ 데이터베이스 검색하기 264
Notion 04 반복되는 서식을 위한 템플릿 버튼 활용하기 265   => /Template Button
_ 반복되는 업무에 활용할 체크리스트 만들기 266
_ 매일 작성해야 하는 회의록 만들기 269
_ 월 단위 계획도 Notion에서 효과적으로 관리하기 271
Notion 05 중요한 할 일은 알림 설정으로 기억하기 273   => "@" 리마인드 설정.
Notion 06 대표적인 커뮤니케이션 협업 도구, 슬랙과 연동하기 277
Notion 07 새로운 프로젝트를 위한 새 작업공간 활용하기 280
_ 필요에 따라 자유롭게, 작업공간 추가/삭제하기 280
_ 아이콘으로 작업공간 구분하기 282
Notion 08 인터넷에 있는 각종 정보를 스크랩하는 웹 클리핑 284
_ 웹 클리핑 사용을 위한 웹 클리퍼 설치 285   => 크롬 확장프로그램 "Notion Web Clipper" 설치.
_ 기본 페이지에 웹 클리핑하기 287
_ 스마트폰에서 웹 클리핑 사용하기 288
Notion 09 웹 클리핑을 가장 효과적으로 관리하는 데이터베이스 291
Notion 10 실수를 되돌리는 히스토리 & 페이지 복구하기 295
_ 특정 시점으로 되돌리기 295
_ 삭제한 페이지 다시 복구하기 297
Notion 11 Notion의 모든 변경 사항을 빠르게 확인하는 알림 설정하기 299
Notion 12 필요한 정보만 빠르게 확인하는 데이터베이스 필터 301
_ 필터 기능 사용하기 301
_ 필터의 기본 구조 파악하기 302
Notion 13 자료를 보관하거나 다른 도구에서 활용하기 306
_ 특정 페이지 내보내기 306   => "..." -> "Export" (하위 페이지 포함은 기업 플랜부터)
_ 현재 작업공간 전체 내보내기 307   => "설정과 멤버" -> "설정(Settings)" -> "콘텐츠 내보내기(Export Entire Workspace)"
Notion 14 Notion의 안전한 사용을 위한 보안 설정 309   => "설정(Settings)" 옵션들
Notion 15 Notion 사용을 윤택하게 해줄 꿀팁 모음 311
_ 여러 창에서 Notion 사용하기 311   => 웹 새창 or Notion 어플에서 Ctrl + Shift + N
_ 사용 중인 Notion 이메일 계정 변경하기 312
_ 느려진 Notion 되살리기 314

   => 웹브라우저의 인터켓 사용 기록 삭제 -> 캐시 데이터 삭제

   => Windows: C:\Users\사용자\AppData\Roaming\Notion 폴더 삭제? 주의 필요..
_ 무료로 제공하는 Notion 포인트 획득하기 315



[Chapter 06 Notion을 Notion답게 활용할 수 있는 협업]


Notion 01 외부 사용자와 협업을 위해 공유하기 319
_ 특정 Notion 사용자와 Share 기능으로 페이지 협업하기 319
_ 불특정 다수를 대상으로 편집 불가능하게 공유하기 322
Notion 02 같은 작업공간에서 협업할 팀원 초대하기 325
_ 같은 이메일 도메인을 사용하는 팀원 자동으로 추가하기 327
Notion 03 팀원 중 특정 사용자에게만 공유하기 330
_ 새로운 그룹 생성하기 330
_ 그룹별 공유 권한 설정하기 333
Notion 04 협업에 효율적인 데이터베이스 활용 사례 334
_ 담당자 설정하기 334
_ 다양한 함수를 협업에 활용하기 335

   => dateBetween(now(), prop("시작일"), "days") 작업 진행 일수 구하기

   => if(prop("진행일") > 5, "Job too late.", "We need merge.")

   => if (prop("상태")=="완료", "Merge Fin.", if(prop("진행일") > 5, "Job too late", "Merge Need."))
Notion 05 효과적인 협업을 위한 코멘트, 토론, 멘션 사용하기 340
_ 의견을 남기고 싶을 땐 코멘트 달기 340   => Ctrl+Shift+M -> 종료시 "해결(Resolve)"
_ 특정 사용자를 호출하는 멘션 달기 343   => @
_ 광범위한 의견을 제시할 때 토론 사용하기 344
Notion 06 생생한 현업의 Notion 활용 사례들 346
_ 1등 전자책 플랫폼, 리디북스 _ 오남경, 디자이너 346
_ 여성 쇼핑몰 모음 앱, 지그재그 _ 이유진, 매니저 349
_ 커뮤니티와 커머스의 결합, 스타일쉐어 _ 이건우, 프로그래머, 사보미, 디자이너 352
_ 동네에서 발생하는 모든 생활정보, 당근마켓 _ 정창훈, CTO 356
_ 개발자를 위한 매니지먼트 회사, eBrain _ 조혜현, 매니저 360

찾아보기 364
빠른 실행을 도와주는 단축키 367

 

 

 

 

 


* 개정판 *

업무와 일상을 정리하는 새로운 방법 노션 Notion 개정판 - 전시진, 이해봄 지음 [Jpub, 2020년 10월 16일]

 

* 문자 집합(Charset)이란 컴퓨터에서 사용하는 문자들의 집합입니다. 그 집합들을 어떻게 모아두었느냐에 따라 이름을 정해주어야 구분해서 쓸 수 있겠지요. 문자집합의 이름으로는 유명한 ASCII, ISO8859, 유니코드 등이 있습니다.

 

* 인코딩은 해당 문자를 어떻게 코드화하겠느냐는 방식을 나타내며, 디코딩은 반대로 어떤 코드를 어떻게 문자화하겠느냐는 방식을 나타냅니다. 마찬가지로 방식에 대한 이름이 있어야 구분해서 사용할 수 있겠지요. 유니코드 인코딩, UTF, Base64, EUC-KR, CP949 등의 이름이 있습니다. 예상할 수 있듯이 문자 집합과 인코딩은 서로 뗄 수 없는 관계이기에 같은 이름이 많네요.

 

<아스키(ASCII)> - 최초의 문자집합이며 7bit를 사용합니다. ASCII라는 문자 집합을 구성하지 않고 컴퓨터를 개발했다면.. 정말 상상하기도 싫군요..

Ascii_Code_Table_Innosoft2021.pdf
0.38MB
The ASCII Code Table by Innosoft.kr

 

<ISO/IEC 8859>

  - 서유럽의 움라우트와 같은 특수 문자를 포함하기 위해 8bit를 사용하는 표준을 제정.

  - ASCII 부분을 유지하므로 당연히 ASCII와 호환됨.

 

<DBCS (Double-Byte Character Set>

  - 한글, 일어, 중국어 등 많은 문자가 필요로 하다보니 더이상 1byte로 표현불가하니 만들어 낸 문자집합.

  - ASCII 부분은 유지를 하고, 최상위 비트 0과 1로 확장 부분을 구분. 따라서 ASCII 호환됩니다.

  - 확장 부분은 2byte를 사용해서 문자를 구성합니다.

  - EUC-KR, CP949 등

 

<EUC-KR>의 문자 집합 00~7F (ASCII 호환)

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0                                
10                                
20   ! " # $ % & ' ( ) * + , - . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
50 P Q R S T U V W X Y Z [ \ ] ^ _
60 ` a b c d e f g h i j k l m n o
70 p q r s t u v w x y z { | } ~  

<EUC-KR>의 문자 집합 B0A0~B0FF

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
B0A0  
B0B0
B0C0
B0D0
B0E0
B0F0  

위와 같이 정해진 위치에 확정된 글자가 명시되어 있으므로 "완성형"입니다. 해당하지 않는 문자를 표현할 수 없는 것이지요. 좀더 추가된 문자를 포함하여 만든 것이 CP949입니다. 마찬가지로 완성형이고, 포함되지 않는 문자는 표현할 수 없습니다.

 

"안녕Hello"라는 문자열은 총 4byte + 5byte = 9byte를 사용하게 됩니다.

 

 

<유니코드(Unicode)>

  - 위와 같이 언어별 인코딩이 다른 불편함을 해결하고자 ISO에서 동일한 규칙을 사용하도록 만든 문자집합입니다.

  - 유니코드 문자집합을 코드화하기 위한 인코딩에는 UTF-8, UTF-16, UTF-32등이 있습니다.

 

<UTF-8> 1byte~6byte 가변 문자 길이를 사용합니다. ASCII와 호환.

en.wikipedia.org/wiki/UTF-8

 

메모장에서 "안녕Hello"를 입력하고 UTF-8로 저장.

 

텍스트 파일을 Hexa Editor로 열어보기

 

앞의 3문자 "EF BB BF"는 UTF-8을 나타내는 BOM입니다. [아래에 설명]

"안"은 "EC 95 88", "녕"은 "EB 85 95", Hello는 "48 65 6C 6C 6F"임을 알 수 있습니다.

 

<UTF-8 인코딩 과정>

  - "안" = 0xEC 0x95 0x88 = 1110 1100   1001 0101   1000 1000

  - UTF-8 인코딩 테이블을 보면 U+0800 1110으로 시작하는 문자이고 3바이트를 사용하여 표현되고 있습니다.

  - U+0800에서 구분을 위하여 사용되는 "1110", "10", "10"을 제외한 나머지를 가지고 변환합니다.

  - 1110 1100   1001 0101   1000 1000 => 1100010101001000 => 0xC548

unicodemap.org/details/0xC548/

 

<UTF-16>

  - 2byte 또는 4byte를 고정으로 사용하기 때문에 ASCII와 호환되지 않습니다.

 

<BOM(Byte Order Mark)>

en.wikipedia.org/wiki/Byte_order_mark

UTF-16의 BE(Big Endian), LE(Little Endian)의 바이트 순서에 따라 바이트를 읽는 순서를 다르게 처리해주어야 합니다.

 

UTF-8은 Byte Order와 무관하여 "EF BB BF"를 저장하며 처리하는 프로그램도 있고(메모장같은), 처리하지 않는 프로그램도 있습니다. 그래서 Visual Studio나 웹페이지 개발시에 문서의 인코딩 에러가 가끔 나타나는 문제가 있지요. 각각의 프로그램에 맞게 BOM을 삭제하거나 추가하여 사용하면 문제를 해결할 수 있습니다.

 

 

2021.04월.읽음 - 학교뿐 아니라 보통은 회사에서도 알려주지 않는듯.. 게다가 보통의 경우 내용들은 들어보고 무엇인지는 알아도 명확하게 아는 개발자는 정말 한정된 것 같습니다. 내부적인 것은 몰라도 프로그래밍하는데에는 일반적으로 문제가 덜 되는 컴퓨터 세상이 되어 그런것 아닐까 싶지만.. 좋은 내용을 쉽게 잘 풀어 설명해주시는 좋은 책입니다.

학교에서 알려주지 않는 17가지 실무 개발 기술 - 이기곤 지음 [한빛미디어 2020년 4월 16일]

 

1부 소프트웨어를 지탱하는 기술

 

1장 문자열 인코딩

2장 다국어 처리

3장 날짜와 시간

4장 정규 표현식

5장 범용 고유 식별자

6장 난수

7장 해시 함수

 

2부 데이터 처리 기술

 

8장 JSON

9장 YAML

10장 XML

11장 프로토콜 버퍼

12장 Base64

13장 데이터 압축(zlib)

 

3부 웹을 지탱하는 기술

 

14장 HTTP

15장 RESTful API

16장 HTTPS

17장 OAuth 2.0

 


 

1부 소프트웨어를 지탱하는 기술

 

1장 문자열 인코딩

  • 문자열 인코딩이란, 아스키 코드(ASCII), EUC-KR(CP949), 유니코드(UTF-8, UTF-16, UTF-32)
  • 문자 집합(Charset) : 사용할 수 있는 문자들의 집합. 유니코드, ISO-8859, ASCII
  • 문자열 인코딩 : 문자를 코드로 표현하는 방식. UTF-8, UTF-16, UTF-32
  • 아스키 코드표
  • EUC-KR 문자 집합 : 완성형. 한글 문자 표현 2 byte, ASCII 문자 표현 1byte. CP949는 EUC-KR를 확장하여 더 많은 문자 표현하도록 한 문자 집합.

2장 다국어 처리

  • i18n이란, i18n 적용하기: gettext
  • i18n : 다국어 지원을 위해 만든 국제 표준. internationalization을 줄여서 i18n으로 표시.
  • Localization = l10n, Globalization = g11n
  • 다양한 플랫폼과 프레임워크에 맞춘 i18n 프로그램이나 플러그인을 활용할 수 있습니다.

3장 날짜와 시간

  • 타임 스탬프, 단조 시간, 실제 시간, 타임 존
  • 타임 스탬프(Timestamp)는 컴퓨터가 시간을 표현하기 위해 사용하는 값.
  • 타임 스탬프 값은 1970년 1월 1일 0시 0분 0초부터 1초 단위로 계속 증가.
  • 단조 시간(Monotonic time)은 운영체제 또는 CPU와 같은 하드웨어에서 직접 계산하는 시간.
  • 실제 시간(Real time = Wall clock) : 실제 시간도 컴퓨터가 직접 계산하지만 시간 서버로부터 주기적으로 값을 가져와서 동기화.
  • 타임존 : 한국은 UTC+9시간이 기준시간.

4장 정규 표현식

  • 정규 표현식(Regular Expression)은 주어진 문자열 속에서 특정 패턴을 가진 문자열을 찾을 때 사용.
  • 특정 문자열 : super <'super' 문자열 찾기>
  • 특정 문자 여러개 : [super] <s, u, p, e, r 모든 문자 찾기]
  • 소문자 : [a-z], 대문자 : [A-Z], 대소문자 : [a-zA-Z]
  • 숫자 1개 : [0-9], 대소문자+숫자 : [a-zA-Z0-9], 소문자+숫자+쉼표+길이3자 : [a-z0-9,]{3}
  • 소문자 문자열 : [a-z]+
  • 문자열의 시작 : ^super <super로 시작하는 문자열 찾기>
  • 문자열의 끝 : man$ <man으로 끝나는 문자열 찾기>
  • 정규 표현식 처리속도는 꽤 느린편이므로 특정 웹페이지나 RESTful API처럼 특정 시간 내에 응답을 해야하는 경우 등은 정규 표현식 대신 파서(Parser) 라이브러리를 사용하는게 좋음.
  • 참고 : RegExr (웹기반 정규표현식 테스트)

5장 범용 고유 식별자

  • UUID 구조, 버전
  • 범용 고유 식별자(Universally Unique IDentifier, UUID) : 컴퓨터 시스템 내에서 고유한 객체를 식별하기 위해 사용하는 값.
  • UUID 구조 : 16진수 32개와 하이픈(-) 4개. '8개-4개-4개-4개-12개' <하이픈은 생략 가능>
    • 1234ABCD-1234-1234-1234-123456789ABC' = '1234ABCD123412341234123456789ABC'
    • UUID 저장시에는 하이픈 제외한 16진수만 저장. 총16bytes(128bit) 사용됨.
  • 많은 식별자가 필요하지 않을 때는 일부 값만 랜덤하게 생성해서 사용. 'innosoft-1234-1234-...'
  • UUID 버전1 : 컴퓨터 맥 주소와 타임스탬프 값 기반 UUID 생성 <더이상 사용 안 함>
  • UUID 버전2 : 규모 큰 시스템 환경 고려 자릿수 일부를 site-defined로 남겨둠. <더이상 사용 안 함>
  • UUID 버전3 : 네임스페이스와 문자열을 해시 함수를 사용 UUID로 변환. MD5기반.
  • UUID 버전5 : 네임스페이스와 문자열을 해시 함수를 사용 UUID로 변환. SHA-1 기반.
  • UUID 버전4 : 가장 많이 사용하는 UUID 버전. 버전 표기하는 4비트 제외 나머지 122비트 모두 무작위 생성.

6장 난수

  • 유사 난수, 암호학적으로 안전한 난수, 공정한 난수(셔플 백)
  • 유사 난수(Pseudo random) : 난수표, 난수 알고리즘, 알고리즘 초기화에 사용할 시드(Seed)값으로 생성한 난수.
    • 알고리즘 대신 열 잡음, 광전자 등 신호의 노이즈를 이용해 시드가 불필요한 HRNG(Hardware random number generator)를 사용하기도 함.
    • 충분한 수(624개)의 난수 확보시 다음 난수 예측 및 시드값 역 예측 가능. 암호학적 관점에서 불안전.
    • 타임스탬프 시드값 사용하면 시간에 따라 비슷한 난수가 생성될 확률 큼.
    • <포켓몬스터>의 루프(loop) 또는 랜덤 어뷰즈(RNG abuse), <에픽세븐>의 특정시간 동일 아이템 얻는 문제.
  • 암호학적으로 안전한 난수(Secure random) - 생성속도 느리지만 시드값 사용하지 않아 예측 불가능.
    • 리눅스/유닉스는 /dev/urandom 파일 읽은 값 사용, 윈도우는 BCryptGenRandom() 함수에서 반환값 사용.
  • 공정한 난수(셔플 백) : 당첨 제비 3개와 꽝 제비 7개를 넣고 적당히 섞은 후, 뽑는 순서만 난수를 적용하는 방식.
    • 전체 요소가 많거나 확률이 희박한 경우 모든 경우의 수를 담기 위해 필요한 컨테이너 크기가 커지는 단점.
  • 랜덤박스 : 예측할 수 없고 암호학적으로 안전한 난수 사용 필요. 유사 난수를 사용해야 한다면 선형적으로 증가하거나 감소하지 않으며 예측할 수 없는 시드 값을 사용.
  • 전투 규칙 : 치명타가 발생하지 않으면 다음 공격의 치명타를 높이는 방법. 또는 셔플 백 등.

7장 해시 함수

  • 해시 함수(Hash function) : 임의의 입력값을 고정된 길이의 해시 값으로 변환하는 함수.
    • 입력값: 문자,숫자,바이너리 등 거의 모든 형태. 변환후 데이터 값을 해시 값(바이너리 형태)
    • 비밀번호 검증, 데이터가 변하지 않았음을 보장<해시 함수가 암호화를 제공하지는 않음>
    • MD5(Message-digest algorithm5): 해시 충돌 취약점 확인됨.
    • SHA-1(Secure Hash Algorithm-1): 해시 충돌 취약점 확인됨.
    • SHA-2(Secure Hash Algorithm-2): SHA-224, SHA-256, SHA-384, SHA-512 (SHA-256이상 권장)
      • 대규모 사용자 기반 서비스라면 멀티 코어 활용하는 Blake2b 해시 함수 고려.
    • 솔트(Salt) 기술: 입력받은 비번등에 특수 문자열을 더하여 해시 함수에 사용.
    • 바이너리 데이터의 무결성 검증 : 파일에 대한 해시 값을 만들었으므로, 동일 파일을 서버에 저장할 필요없이 해시 값만 저장. MurmurHash3처럼 암호학적으로 민감하지 않되 성능 빠른 해시 함수 고려..
  • 해시 값을 키로 사용 : 데이터가 많다면 충돌 가능성이 낮은 해시 함수 고려.
    • 생일 역설(Birthday paradox) : 23명 모이면 같은 생일일 확률 50%, 57명이면 99%가 넘음.
  • 시스템에 따른 고려 사항: 1) 입력값의 크기 2) 보안 수준 3) 해시값의 용도

 

2부 데이터 처리 기술

 

8장 JSON

  • JSON(JavaScript Object Notation) : 숫자, 문자, 참 또는 거짓 등 여러 형태의 데이터를 키(Key)와 값(Value)으로 구조화된 객체(Object)에 담아 처리하는 규격.
  • 몽고DB와 같은 NoSQL 데이터베이스는 JSON과 거의 동일한 BON을 공식 규격으로 사용.
  • JSON 규격: UTF-8 인코딩만 허용. BOM 허용하지 않음. 주석 지원하지 않음.
    • 주석필요시 XML이나 YAML 고려.
  • 키 문자열은 Ascii 코드만 사용을 추천. 객체 직렬화//역직렬화시 추가 코드 작업이 필요하게 됨.
  • 오류 줄이기: 1) try-catch 2) 사용전 key 검사 3) interlock 및 assert()
  • 단점: 1) 텍스트 기반에 기인한 불필요한 트래픽 오버헤드 2) 텍스트 기반에 기인한 메시지 호환성(오타 및 수정 등) 유지의 어려움

9장 YAML

  • YAML(Yet Another Markup Language): 이메일 양식에서 힌트를 얻어 만든 '사람이 쉽게 읽을 수 있는' 데이터 규격.
  • YAML 특징: 주석 지원, 유니코드(UTF-8, UTF-16, UTF-32) 지원, 앵커(Anchors)와 별칭(Aliases)
  • 앵커와 별칭: *, &, <<를 활용하여 값 참조
  • 민감한 정보들은 레디스(Redis, Remote Dictionary Server)와 같은 키-값 저장소에 보관하고, YAML 동적 생성이나 RESTful API 서버로부터 값을 받아 사용하자.

10장 XML

  • XML : 웹에서 규격화된 데이터를 효율적으로 주고받기 위해 만든 마크업 언어.
  • XML은 문자 인코딩을 직접 지정할 수 있으나 인코딩 정보가 파일 안에 있어서 파일 인코딩 정보를 미리 알고 있어야 함.
  • 태그, 요소, 속성

11장 프로토콜 버퍼

  • 스키마 파일, 인터페이스 코드, 메시지 객체
  • 프로토콜 버퍼(Protobuf, Protocol Buffers): 구글에서 만든 데이터 직렬화 규격. 바이너리 기반 규격.
  • 프로토콜 버퍼 사용 방법
    • .proto: syntax="proto3";, message, string, int64, bytes, enum, repeated, map, oneof(추상화계층), Any
    • protoc.exe(프로토콜버퍼 컴파일러): protoc-3.x.x-win64.zip
    • protobuf(Protobuf 라이브러리): protobuf-python-3.x.x.zip
    • 스키마 파일(.proto) -> 컴파일러(protoc) -> 인터페이스 코드(.py) -> 프로젝트
    •                                                                                             ↑
    •                                                  Protobuf 파이썬 라이브러리 ------'
  • 프로토콜 버퍼를 JSON으로 변환하는 의 경우 바이트 데이터가 Base64로 인코딩됨.

12장 Base64

  • Base64 인코딩/디코딩, URL-Safe Base64
  • Base64: 바이너리 데이터를 아스키 코드 일부와 일대일로 매칭되는 문자열로 단순 치환하는 인코딩 방식. (높은 확률로 ==로 끝나는 문자열), 문자열 -> 비트화 -> Base64 코드표 기반 인코딩
  • 기존 데이터 길이보다 30%정도 늘어나지만, 바이너리 데이터를 문자열 기반 데이터로 취급할 수 있어 유용함.
  • JSON 데이터에 이미지 파일을 포함하려는 경우 등: 이미지를 Base64로 인코딩하여 UTF-8과 호환 가능한 문자열로 처리.
  • Base64 인코딩: 위키백과 베이스64, 패딩('=','=='):3바이트로 나눈 나머지만큼 패딩추가.
  • Base64 디코딩: 인코딩 역순. 단지복원 데이터의 형태를 알 수 없기에 형태를 같이 기입.
    • { "type": "image", "data": "ewPKIsH..." }
  • 오늘날 스트림 데이터 처리를 위해 Base64를 주고받는 환경은 거의 없고, RTMP(Real Time Messaging Protocol)이나 HLS(HTTP Live Streaming)등으 동영상 프로토콜을 활용함.
  • URL-Safe Base64: URL 주소에서 사용할 수 없는 문자들을 치환하여 사용
    • - + → - 로 / _ 로 = . 로 (URL주소는 길이를 알기 때문에 패딩을 생략)
  • HTTP로 큰 파일을 보내야 한다면 HTTP 멀티 파트 기능 고려.

13장 데이터 압축(zlib)

  • zip, zlib, DEFLATE, INFLATE
  • zlib는 상용 프로그램에서도 라이선스 비용 없이 사용할 수 있는 가장 많이 사용하는 무료 압축 라이브러리.
  • HTTP또는 WebSocket 프로토콜은 DEFLATE 통신 기본 지원하지만, 브라우저와 Nginx같은 웹 서버 프로엠워크에서 해주므로 알아채기 어려울 뿐.
  • zlib 라이브러리 자체는 표준이 아니지만, 라이브러리에서 DEFLATE 압축 표준을 지원하며 사실상 표준에 가까운 라이브러리로 자리잡음.
  • 압축(Compression): 데이터의 공통된 부분을 찾아 하나로 묶어 그 정보를 저장하는 행위
    • DEFLATE 알고리즘은 공통 부분 찾기위해 L777 알고리즘 사용.
    • 이렇게 찾은 정보를 허프만 부호화(Huffman Coding)알고리즘으로 무손실 압축.
    • INFLATE 알고리즘으로 압축 해제
  • 손실 압축(Loss compression), 무손실 압축(Lossless compression) : 당연히 DEFLATE는 무손실압축. 압축률(Compression ratio), 압축 레벨(Compression level) 1~ 10단계, 압축 속도(Compression speed), 압축 해제 속도(Decompression speed), 체크섬(Checksum)
  • UDP등 무결성이 보장되지 않는 경우 CRC32등으로 데이터의 무결성을 확인하는 것이 좋음.
    • ADLER32는 CRC32보다 빠른 체크섬 방식.

 

3부 웹을 지탱하는 기술

 

14장 HTTP

  • 무상태성, HTTP 서버, 세션과 쿠키, 스티키 세션, CORS, 아파치와 Nginx
  • HTTP(HyperText Transfer Protocol): 서버와 클라이언트가 텍스트, 이미지, 동영상 등의 데이터를 주고받을 때 사용하는 프로토콜.
  • 무상태성(Stateless): 요청 메시지를 보내기 직전까지 대상 컴퓨터가 연결 가능한지, 메시지를 응답할 수 있는 상태인지 알 수 없는 상태. [vs Stateful Protocol(ex. TCP)]
  • 간단한 HTTP 서버: GET / HTTP/1.1\r\n <요청 메서드> <URL 경로> <HTTP 버전>\r\n
  • HTTP 요청
    • 요청 메서드: GET, POST, DELETE, PUT
    • URL, DNS, URI(Uniform Resource Identifier): 특정 자원 위치
    • 요청헤더: Host, Accept, User-Agent, Content-Type, Content-Length, Connection:keep-alive
    • 메시지 바디
  • HTTP 응답: HTTP/1.0 200 OK, 상태코드
  • 세션과 쿠키: GDPR(General Data Protection Regulation, 유럽연합 일반 데이터 보호 규칙)
  • 스티키 세션(Sticky session): 하나의 브러우저는 하나의 웹 서버에만 연결. (로드밸런스 서비스의 쿠키 문제 해결)
  • CORS(Cross-origin resource sharing, 교차 출처 리소스 공유): HTTP 서버의 웹 페이지, 이미지나 API 등을 특정 호스트로 접속한 웹 브라우저만 사용할 수 있게 제한하는 정책.
    • Same origin policy(동일 출처 정책)으로 인해 다른 서브 도메인 간 리소스 공유가 어려워지는 문제 해결.
    • CORS 단순 요청: 요청 정보가 간단해 별다른 보안 검증이 필요하지 않은 교차 출처 리소스 공유.
    • CORS 사전 요청: 추가적인 보안 검증이 필요한 요청.
  • 아파치와 Nginx
    • 웹 서버: 요청 처리, 정적 파일 캐시, 로드 밸런스 기능 지원, 압축 및 보안 기능 등등..
    • Ngix 권장: 수평적 확장에 유리한 단일 스레드, 이벤트 기반, More than 아파치 다중 사용자 처리 입증.

15장 RESTful API

  • RESTful API(Representational state transfer): 분산 시스템을 위한 소프트웨어 아키텍처의 한 형태.
  • 애저 API 디자인 가이드 문서
  • 글쓰기 API: http://localhost:5000/v1/posts, 메서드(POST, PUT/PATCH, DELETE)
  • API 테스트: 포스트맨(Postman)
  • 단일 글 읽기: GET http://localhost:5000/v1/posts/<글 번호>
  • 여러 글 읽기: http://127.0.0.1:5000/v1/posts?size=<글 개수>
  • 글 업데이트 API: PUT http://127.0.0.1:5000/v1/posts/<글 번호>
  • 글 삭제 API: DELETE http://127.0.0.1:5000/v1/posts/<글 번호>
  • 고려사항
    • OAuth 표준 인증과 인가 기능
    • DDOS 또는 클라이언트 버그로 Too many Call: 분당 API 호출 제한 정책

16장 HTTPS

  • HTTPS 핸드셰이킹
  • HTTPS(HyperText Transfer Protocol over Secure Socket Layer): TCP대신 TLS(Transport Layer Security) 프로토콜 기반
    • 예전에는 SSL(Secure Sockets Layer) 프로토콜을 사용했으나 너무 많은 취약점으로 더이상 사용하지 않음. 이름을 그대로 사용하는 경우라도 내부는 TLS 기반
  • 신뢰할 수 있는 인증서 발급 기관 목록: https://www.checktls.com/showcas.html
  • TLS 버전: 1TLS 1.0(지원중단), TLS 1.1(지원중단), TLS 1.2, TLS 1.3
  • 메시지 암호 키 교환: RSA(비공개키로 인한 보안 이슈로 1.3부터는 지원하지 않음), DHE -> ECDHE, PFS(Perfect Forward Security, 비밀 키가 노출돼도 과거에 주고받은 메시지가 안전한 특성)
  • 인증서(X.509): CA(Certificate Authority, 인증 기관)

17장 OAuth 2.0

  • OAuth 1.0a vs OAuth 2.0
  • OAuth: 데이터를 간편하고 안전하게 주고받기 위해 만들어진 표준.
    • 리소스 서버(resource server)만 액세스 토큰(access token) 발급.. 일정 시간후 폐기(revoke)
  • OAuth 1.0a: API를 사용하는 클라이언트의 권한 및 인증 역할 모두 수행. 안전하지만 복잡.
    • 서명(signature), 요청 토큰(request token)등 직접 구현 필요.
  • OAuth 2.0: 구조 간단 사용하기 쉬움. 하지만 가로채기 형태의 공격에 취약.
    • 보완 방법은 개발자의 몫: HTTPS위에서 OAuth 2.0 사용 등
  • 용어
    • 리소스 소유자(resource owner): = 최종 사용자(end-user). 상황에 따라 백엔드 서버 등
      • 주의점: 사용자의 권환 검증
    • 리소스 클라이언트(resource client)
      • 주의점: 액세스 토큰 관리, 공식 SDK 사용, 클라이언트 ID 및 시크릿 관리, HTTPS 사용
    • 인가 서버(authorization server): 액세스 토큰과 인가 코드를 관리하는 서버.
      • 주의점: 액세스 토큰 관리. 리소스 클라이언트 응답 처리
    • 리소스 서버(resource server): 리소스 관리 및 API 제공 주체
      • 주의점: 액세스 토큰 권한 검사, 클라이언트 데이터 검증
    • OAuth 2.0 동작 구조
  • JWT(JSON Web Token): 인가 서버 대신 토큰 안에 인가 정보를 포함하여 부하 줄이는 방법.

 

 

 

+ Recent posts