9월 1일(수) React Query로 서버 상태 관리하기
react-query는 서버상태를 관리하는 라이브러리다.
서버 상태는
필요한 작업
react-query는 이런 기능을 사용하도록 도와준다!
redux와 달리 서버 상태를 다른 장소에 저장할 필요 없다. 함수형 컴포넌트에서 hooks 형태로 사용!
useQuery 훅에 파라미터를 통해 API 데이터의 만료 시간 / 리프레쉬 간격 / 데이터를 캐시에서 유지할 기간 / 브라우저 포커스시 데이터 리프레쉬 여부 / 성공 or 에러 콜백 등 제어 가능
자세한 사용법은 본문을 다시 읽자
useQuery는 queryKey, queryFunction, options를 파라미터로 갖는다
9월 2일(목) alert() 가 사라진다?
alert()
, confirm()
, prompt()
를 크롬에거 제거할 계획 발표!
해당 기능으로 팝업되는 대화 상자는 브라우저 자체 UI처럼 보일 수 있고, spoofing
에 악용될 수 있다.
대부분의 개발자가 반대하고 있다고 한다. 여러 이유가 있지만 구글이라는 하나의 회사가 웹이라는 플랫폼을 건드리는 것에 반대하고 있는 듯.
9월 3일(금) 개발팀이 일을 매듭 짓는 방법
9월 4일(토) 웹 성능을 위한 이미지 최적화
웹 페이지의 대부분의 용량을 차지하는건 당연히 이미지이므로, 최적화를 해야한다
빨라지고 / 서버 공간 절약 / SEO 모바일 응답성 점수 증가
aspect-ratio
를 잡아야 한다. srcset
, sizes
속성을 사용하자src
속성이 동작한다.loading="lazy"
을 사용한다.loading="lazy"
사용 금지웹사이트 성능/속도 분석 사이트
9월 5일(일) { tsconfig.json } 제대로 알고 사용하기
이전에 한 번 공부했던 tsconfig.json
에 대해 복습겸 훑어보자
tsc
는 tsconfig.json
이 없어도 사용할 수 있다. tsconfig.json
을 설정하는 이유는 매번 tsc
명령어에 옵션 주기도 힘들고, 프로젝트에서 일정한 설정을 유지하기 위해서이다.
vscode 에디터 상에는 에러가 나오지 않지만 정작 tsc를 통해서 컴파일을 시도하면 에러가 날 수도 있고 그 반대의 상황이 나올 수도 있다.
files
: 원하는 파일만 tsc의 대상으로 지정
include/exclude
: 원하는 파일 목록의 패턴을 지정/제외 할 수 있다.
lib
는 typescript
가 그런 문법과 기능이 있다는 것을 알게 해주는 것이지 runtime에 해당 기능을 추가해주는 것이 아니다.
babel-loader
는 tsconfig.json
를 필요로 하지 않고 자체적으로 컴파일한다. 컴파일 옵션을 따로 줄 때 isolatedModules
는 꼭 true
로 설정해야한다
9월 6일(월) 야 너두 자동 배포 할 수 있어 with AWS CodeDeploy
우테캠 종호님이 작성하신 아티클을 읽어보자!
AWS CodeDeploy의 장점 4가지
Blue-Green deployment. 라이브 환경을 Blue, 새로운 환경을 Green이라 해서 Green에 배포하고 에러 검출이 되지 않으면 traffic을 Green으로 옮기는 배포 전략
9월 7일(화) 베일 벗은 카카오웹툰, 혁신과 낯섦 사이에서
혁신은 기대를 충족시키지 못 하면 그저 구호화가 되는 단어이다.
멘탈모델 : 인터페이스가 어떠한 방식으로 작동할 것이라 유추하는 인간의 사고 과정
웹툰 IP가 드라마/영화화 되는 등 2차 콘텐츠로 제작 되고 있다. 웹툰이 정적인 모습을 고수할 이유가 사라졌다!
유저는 유사한 서비스에서 기존의 멘탈모델과 유사한 UX를 기대한다. 즉 멘탈 모델은 혁신적인 UX의 걸림돌이 된다.
카카오웹툰은 멘탈모델을 꽤 벗어나면서 낯설지 않은 UX를 만들어냈다.
Y축 이동은 사용자에게 불편함을 줄 수도 있지만, 특정 부분이 아닌 앱 전반에 Y축에 대한 고민/적용이 있기에 UX 콘셉을 만들 수 있었다.
9월 8일(수) AWS 1755만원 요금폭탄 맞았다..!
AWS 과금 폭탄이 발생?하면 고객센터에서 전화가 온다.. 국제전화라고 무조건 안 받기보다 내가 AWS를 사용중이라면 한 번쯤 받을 생각을 해야 할지도..
무조건 환불해주는건 아닌가보다. 100만원 어치 과금받고 환불 받지 못 한 케이스도 있는 듯..
역시나 개인키 노출로 인한 문제! 이분은 결국 잘 해결된거 같다. AWS 사용시 개인키 노출을 절대로 절대로 조심하자
9월 9일(목) Typescript 4.4에 추가된 기능
const argIsString = typeof arg === "string"
이후에 argIsString
으로 분기 처리를 한다면, true
인 경우 그 안에서 arg
의 type
은 string
이 된다.interface Array<T> { index: number } : T
. 이전까지 인덱스 서명은 string/number만 가능했는데 이제 Symbol/Template String도 추가 됨9월 10일(금) 프론트엔드 개발자라면 반드시 알아두어야 할 32가지의 UI 요소 (번역)
32가지 UI에 대한 글. 옮겨적기보단 한 번 쓱 감상하자
UI는 크게 4가지로 나뉜다
9월 11일(토) 리액트 useEffect: 개발자가 알아야 할 네가지 팁
useEffect는 하나의 기능만 담당하도록 분리해야한다
커스텀훅 내부에서 상태까지 관리하는 구조를 생각해본다.
useEffect의 callback 함수가 return하는 함수는 cleanUp 함수이긴하지만, early return을 해도 상관 없다
의존성 배열을 비우는 경우는 가급적 피해야한다. 코드가 더 확장되거나, 변경 사항이 있을 때 추적하기가 힘들다. (깨진 프롭 or 클로저)
useEffect 콜백 함수 내부의 디펜던시는 반드시 의존성 배열에 추가하고, early return을 통해 해결하는게 옳은 방법이다.
9월 12일(일) 웹 서비스가 사용자를 판별하는 법
일반적으로 인증을 원하는 주체는 사용자이며, 로그인시 발급받은 토근으로 사용자를 인증, 서버에서 데이터를 받는다. 쿠키 등을 통해 stateless하더라도 동일한 사용자인지 알 수 있다.
인증이 필요 없고 사용자가 자신을 노출하고 싶지 않은 경우, 익명 브라우징(크롬 시크릿 탭 같은)을 사용할 수 있다. 서버 입장에서 동일한 사용자인지 알 수 없지만, 여전히 IP address 등은 노출되어있다. 이것마저 막으려면 VPN 등을 사용한다
VM 등을 통해 익명화 된 여러 요청을 하나의 사용자로 인지하기 위한 기술로 Device fingerprinting을 사용한다
공격 뿐 아니라 개인 맞춤형 광고를 위해서 사용할 수도 있다.
webGL fingerfrinting.
9월 13일(월) 이미지 최적화의 모든 것, 최고의 완벽 가이드 - 1부
볼품없는 디자인보다, 느린 사이트가 웹 서비스 이탈율에 더 큰 영향을 미친다
세계적인 비즈니스를 지향한다면, 생각보다 많은 나라의 인터넷 속도가 평균 이하라는 것을 인지해야한다.
-또한 사용자는 여러 대의 기기를 동시에 사용해서 웹 서비스를 소비한다. 그렇기에 디바이스별 최적화 이미지도 중요하다
이미지는 페이지의 서버공간 46%를 차지한다는 통계가 있다.
모바일 우선 인덱싱이 SEO에 큰 영향을 미치고, 이는 이미지 최적화도 관련되어있다.
이미지 크기 줄이기 / 파일 크기 줄이기
파일 크기 줄이기는 무손실 이미지 압축을 목표로 한다.
이미지 파일은 이미지 자체보다 더 많은 데이터가 포함되어 있는데, JPEG/PNG의 경우 메타데이터, 기타 정보 등이 있다. 이 추가 데이터들을 제거/최소화한다. 단 이는 표면적인 방법이다
웹 페이지의 이상적인 전체 이미지 크기는 1~2MB 사이다.
무손실 압축은 이미지 표시에 필요하지 않은 데이터만 제거하고, 손실 압축은 페이지에 이미지를 표시하는데 사용되는 데이터까지 제거한다. 대부분의 경우 무손실은 되돌릴 수 있지만, 손실은 불가능하다
크로마 서브 샘플링(Chroma subsampling)
허프만 코딩(Huffman coding)
파일 형식
9월 14일(화) 이미지 최적화의 모든 것, 최고의 완벽 가이드 - 2부
온라인 이미지 최적화 도구
독립형 최적화 앱
이미지 소프트웨어 내 최적화
CMS(콘텐츠 관리 시스템) 내에서 최적화
대량(일괄) 이미지 크기 조정 도구
이미지 축소 도구
9월 15일(수) 국제화(i18n) 자동화 가이드
일반적으로 gettext를 활용한 라이브러리, i18next 등을 사용해서 key를 받아 번역된 문자열을 리턴하는 함수를 이용했다.
key를 사용하는 방식은 번역할 문자열이 많아지면 개발,기획,번역 간의 협업 비용이 많아지고 배포마다 진행해야하는 불편함이 있다.
기존 국제화 프로세스에서 수작업이 필요한 과정은
구글 스프레드를 사용하면 파일을 메일로 주고 받을 필요가 없다. 이를 기반으로 자동화 도구를 추가해서 반복적인 작업을 자동화한다
소스 코드에서 key를 스캔, 추가된 key를 구글 스프레드 시트에 업로드
소스 빌드 시 스프레드 시트에서 번역된 문자열 다운받아서 빌드
자세한 방법은 본문을 참조하자.
9월 16일(목) Preload의 개념, 그리고 올바른 사용법
웹 사이트 방문시 필요한 리소스를 동시에 요청하고, 서버는 요청 순서가 아닌 처리 완료 순서로 응답을 한다.
이 때 특정 리소스를 빠르게 로딩하기 위해 우선순위를 부여하는 방법을 preload라고 한다.
HTML파일의 head 태그에 rel="preload"
속성을 추가하면 된다.
단 preload로 선언하면 해당 소스를 실제로 사용하지 않더라도 무조건 서버로부터 요청, 다운로드 한다. 반드시 초기 로드에 사용되는 요소에만 적용하자
그렇다고해서 초기 로드에 필요한 요소를 모두 preload로 하는 것도 좋은 방법은 아니다. preload는 전체적인 웹 성능 향상을 위해서 사용하는게 아니라, 비즈니스에 따라 빠르게 로딩해야 하는 특정 리소스만을 위해사용 하는 것임을 명심하자
예를 들어 SEO 최적화 중 하나로 Core web vitals의 LCP 수치를 높이기 위해서는 페이지 내 가장 큰 컨텐츠 요소를 빠르게 로딩시키는 것이 중요하다. 이를 위해 큰 영역을 차지하는 이미지만 preload한다면 비즈니스적 이점을 얻을 수 있다.
이런 SEO가 중요한 서비스가 아니라면, webfont에 preload를 걸기도 한다.
9월 17일(금) [2021.06.11] Production Environment에서 SourceMap 보안 이슈 해결
일반적으로 배포 버전에는 sourceMap을 포함하지 않는게 정석이다.
Next.js 환경에서 유저 환경에서 Error 발생시, sentry를 통해 어떤 부분에서 에러가 발생했는지 확인할 필요가 있다. 따라서 Sentry 환경에 sourceMap을 업로드한다. 이를 위해 SentryWebpackPlugin를 사용해서 SoureceMap을 임의로 생성하는데, 이 때 Sentry 환경 뿐 아니라 Production 환경까지 올라가서 보안 이슈가 발생한다
해결 방법으로 build 디렉토리 내의 .map
확장자를 찾아 삭제하는 script 명령어를 추가한다
S3, CloudFront에 따라 위 방법만으로 해결되지 않을 때 S3에서도 script를 실행하고, 캐시도 제거하는 작업까지 추가한다.
9월 18일(토) [Browser] Reflow와 Repaint
브라우저에서 화면을 다시 그리는 Repaint(Redraw) / Reflow(layout)에 대해
Reflow. 화면의 구조가 변경되었을 때, 뷰포트 내 렌더 트리의 노드의 정확한 위치, 크기를 계산하는 과정
Reflow 최적화 방법
position
을 fixed
또는 absolute
로 지정한다. table
태그 사용을 지양한다. cssText
사용하여 한 번에 스타일을 변경한다.Repaint는 화면의 변화가 있을 때.
9월 19일(일) 자바스크립트 검색엔진 최적화(SEO) 가이드 총 정리
9월 20일(월) 다크모드의 의의와 웹환경에서의 구현
다크모드의 장점
웹 환경에서 구현하는 방법
prefers-color-scheme
라는 속성은 사용자의 시스템이 라이트/다크테마를 사용하는지 감지한다html[data-theme='dark'] {}
ThemeProvider
를 사용한다9월 21일(화) 실제 웹사이트에서 Web Vitals 디버깅하기
Lab tools는 각종 조건을 흉내내는 시뮬레이션 환경에서 페이지를 로드한다. lighthouse
Field tools는 실제 사용자로부터 크롬이 수집한 데이터를 기반으로 작성된 크롬 사용자 경험 보고서 같은 도구를 말한다.
Field tools가 더 정확한 데이터를 제공하지만, Lab tools가 문제를 찾고, 수정하기 더 용이한 경우가 많다
lighthouse는 문제를 찾고 어떻게 개선하면 되는지 구체적으로 제안하지만, 페이지를 로딩할 때 발견되는 성능 이슈에 국한되어 있다. 사용자의 클릭, 스크롤 같은 이벤트의 상호작용에서 발생하는 문제는 탐지하지 않는다.
따라서 현장에서 실제 사용자의 Web Vitals 매트릭 데이터에 대한 디버그 정보를 어떻게 알아낼 수 있는가라는 질문이 생긴다.
CLS는 페이지 전체 수명에 걸쳐 수집되므로, 디버그 시 주요 정보는 사용자가 페이지에 상호작용함으로써 레이아웃 변경, 요소 변경이다.
CLS는 Field Data와 Lab Data가 상당한 차이를 보인다.
본문에서 레이아웃 변경과 변경된 요소를 로깅하는 예제 코드를 참고하자. 단 이 코드의 목적은 모든 변경을 감지하는게 아닌, 가장 많은 사용자에게 영향을 미치는 변경을 찾아내서 CLS를 개선하고자 함이다.
LCP를 디버그할 때 주요 정보는 해당 페이지를 로드할 때 어떤 요소가 가장 큰 요소인가(LCP 후보 요소)이다. 그 요소는 같은 페이지일지라도 사용자마다 다를 수 있다. 그 이유로는
마찬가지로 본문에서 LCP 후보요소를 찾는 코드를 확인하자
FID 디버그시 중요한 점은 FID가 첫 입력 이벤트 시간의 지연시간만을 측정한다는 점이다. 즉 사용자가 무엇과 상호작용 했는지는 중요하지 않다.
하이드레이션.
Web Vitals 보고서를 사용해서 시각화하자.
9월 22일(수) 버튼에 타입을 쓰는 이유 (button type="button")
button 태그의 type 디폴트 값은 submit
이다. 따라서 form태그 내부에서 submit 목적의 버튼이 아니라면 type을 button으로 변경시켜주는 것이 좋다. IE 10 이하 버전에서는 엔터를 누르면 애꿎은 button이 실행되는 문제도 존재한다
button type의 input 태그는 과거의 산물이다. button 태그에 비해 자식 태그를 가질 수도 없고, css의 가상 선택자로 꾸미는 것도 불가능하다. 그니까 button태그를 쓰자.
9월 23일(목) JPEG vs. PNG: 적절한 이미지 포맷 선택하기 (1) - JPEG편
복잡한 이미지/사진은 JPEG, 단순하거나 투명 표현이 필요하면 PNG
JPEG(Joint Photographic Experts Group)는 JPG와 같은 확장자이다. DOS 시절 확장자 글자수 제한 때문에 JPG로 줄여쓴 게 이어져 온 것
JPEG 2000은 비손실 압축도 가능하는 등 JPEG보다 뛰어나지만 이전 버전과의 호환성 때문에 잘 쓰이지 않는다. (메모리도 많이 사용함). 참고로 JPG는 손실 압축이다.
트루 컬러(풀컬러). 사람이 볼 수 있는 모든 색을 표현한다.
서브 샘플링. 휘도(밝기 정보)는 두고 색차 정보를 줄여서 압축하는 것. 크로마 서브 샘플링, 다운 샘플링이라고도 한다.
DCT & 양자화. 사람의 눈이 고주파 명도 변화에 둔감하다는 점을 이용한다.
주파수란 '신호가 얼마나 자주 변하는가'를 나타낸다. 즉 이미지에서 인접한 픽셀의 색 차이가 적은 부분이 저주파, 큰 부분이 고주파이다.
보통 사진의 경우 보통 인접한 픽셀의 색상은 비슷할 확률이 높다. 따라서 사진은 저주파 성분이 많은 이미지이다
반대로 인위적인 이미지는 고주파 성분이 많은 이미지가 많다.
그렇기에 사진은 JPEG로 저장하고(고주파를 날려버리기 때문에), 문자, 선, 세밀한 격자, 인위적 이미지는 주로 PNG로 저장한다.
결론적으로, JPEG 압축 알고리즘은 색상이 매끄럽게 변화하는 사진, 그림에 적합하다
9월 24일(금) JPEG vs. PNG: 적절한 이미지 포맷 선택하기 (2) - PNG편
PNG(Portable Network Graphics)는 인터넷에서 표현될 이미지를 염두하고 개발된 확장자이다.
따라서 RGB만 지원하며 CMYK는 지원하지 않는다.
JPEG와 다르게 알파채널(A)을 통한 투명도를 지원한다
GIF를 대체하기 위해 등장했다. (PNG IS NOT GIF)
무손실 압축으로 용량보다 품질을 우선시한다.
LZ77 압축 알고리즘은 현재 압축하고자하는 데이터가 이전에 존재했는지 파악해서 반복 여부를 표시한다.
허프만 부호화로 데이터 문자의 출현 빈도를 파악해 순서대로 짧은 접두어 코드를 부여한다.
따라서 단순한 이미지, 투명 표현이 필요한 이미지에 적합하다.
9월 25일(토) CSS-in-JS, 무엇이 다른가요?
*.module.css
파일을 생성, CSS pre-processor
를 사용해서 css module
형태로 사용Radium
같은 라이브러리 등장:before
, :nth-child
등의 pseudo selector, 즉 모든 CSS Spec을 사용할 수는 없다<style>
태그를 생성, 주입한다prop
가 변할 때 마다 스타일을 동적으로 생성한다. build 타임이 아닌 runtime에서 활용 가능하다9월 26일(일) 기술부채가 쌓여있는 상황에서 서비스 성능 임팩트 있게 개선하기
보통 레거시 코드들은 1년이 지날 즈음부터 변화에 대한 비용이 급격하게 증가한다. 코드 작성자가 퇴사하거나, 퇴사하지 않았더라도 기억이 나지 않는 경우가 많아서!
어떤 지표를 개선할 것인가를 정하고 하나씩 해결하는 전략을 취함
구글의 Core Web Vitals를 사용.
데일리 배포 / 기능 추가 책임을 엔지니어가 담당하는 형태
Critical Rendering Path.
script
태그의 async, defer 옵션과 link
태그의 DNS Prefetch, Preconnect 옵션 사용DNS prefetch는 link 태그를 이용해서 해당 도메인에 해당하는 IP 주소를 미리 알아내는 것이다. (DNS resolution 요청을 미리 하는 것)
preconnect는 TCP 연결을 미리 맺어두도록 하는 것. 클라이언트 리소스를 사용하는 것이기에 남용해서는 안 됨.
defer loading은 렌더에 필요하지 않은 스크립트를 defer하게 받아올 수 있도록 하는 옵션 스크립트 다운을 백그라운드에서 진행한다. 파서가 block되지 않음
async executing는 다운로딩이 아닌 실행에 관련된 옵션이다. 다운로드가 완료된 순서대로 스크립트가 실행 된다. 따라서 번들링된 핵심 서비스 코드를 먼저 실행할 수 있다.
이미지 lazy loading은 LCP에 악영향을 미친다. 따라서 처음 보는 화면에서는 lazy loading을 하지 않는게 좋다.
번들 용량을 줄이는건 성능 최적화에 항상 거론되는 주제이다. chunk를 사용해서 공유 코드를 나눈다.
import 되고 사용되지 않는 코드를 제거하면 번들 용량을 줄일 수 있다.
9월 27일(월) 브라우저에서 미디어 권한을 다루는 간단 tip
navigator.permissions.query
사용. navigator.mediaDevices.getUserMedia
사용navigator.mediaDevices.enumerateDevices
사용navigator.mediaDevices.addEventListener('devicechange', callback)
으로 리스너 등록 9월 28일(화) Airbnb의 Server-Driven UI
9월 29일(수) Generalist
9월 30일(목) CSR 앱에서 SSR + CSR 환경으로 이주하기
CSR에 SSR을 도입하면서 얻게 되는 이점
reverse proxy
ReactDOMServer.renderToString
를 사용해서 <App />
컴포넌트를 렌더한다.
renderToString
은 리액트가 컴포넌트 구조를 파악하고 HTML string으로 바꾼다.
CSR에서는 ReactDOM.render()
를 사용하지만 SSR에서는 ReactDOM.hydrate()
를 사용해서 리액트가 SSR에 의해 일부 렌더링 되고, 나머지 부분만 CSR로 채운다고 생각하고 이벤트 리스너만 등록하거나, 렌더링 되지 않은 나머지 부분을 추가 렌더링해주는 등 효율적인 동작을 한다.
이미 로그인된 상태의 화면을 가져올 수도 있다.
HTML 문서에 script 태그를 포함하는 방법으로 access token을 담아서 응답한다.
XSS에 취약할 수 있으나 이 방법으로 간단하게 해결할 수 있다. script 태그에 정보를 담을 때 JSON.stringify
대신 serialize-javascript
같은 라이브러리를 사용하자. JSON.stringify
로 넘기는 정보에 악의적인 스크립트 태그가 있을 수 있기 때문
10월 1일(금) REST 및 베스트 프랙티스
Representational Safe Transfer는 2000년 로이 필딩이 2000년 논문에서 소개한 네트워크 기반 아키텍처이고, Representational State HTTP 표준만 따르면 어떤 기술이든 사용할 수 있는 인터페이스 스타일이다. 사실 말장난같기도하고, 굳이 구분해야하나 싶기도하다. 우리가 개발하면서 자주 언급하는 REST는 주로 후자를 지칭한다.
HTTP
+ JSON
조합으로 구현하는 OPEN API.
REST
는 크게 리소스, 메서드, 메세지로 구성된다.
"이름이 Terry인 사용자를 생서앴을 때'
멱등하지 않은 메소드(POST)는 REST API를 다른 API와 함께 호출하다가 실패할경우 트랜잭션 복구를 위해 기존 상태를 저장했다가 다시 원상 복구시켜주어야 한다
REST는 유니폼 인터페이스로, HTTP+JSON 표준만 따르면 웹/안드로이드/IOS 등 플랫폼을 가리지 않고 사용할 수 있다.
REST는 HTTP를 기반으로 하기에 웹의 인프라 (로드 밸런서, SSL, 캐싱) 등을 적용할 수 있다.
캐싱은 HTTP의 가장 강력한 기능 중 하나이다. 일반적인 서비스에서 60~80% 가량의 트랜잭션이 SELECT
와 같은 조회성 트랜잭션임을 고려하면, HTTP의 웹 캐싱은 이점이 많다
Last-Modified
, E-Tag
를 이용해 캐싱 구현 가능
Last-Modified
값과 함께 보내면, 콘텐츠 변화가 없을 경우 REST 컴포넌트는 304 Not Modified
를 반환하며 클라이언트는 자체 캐시값을 사용한다. REST는 API 메세지만으로도 예측할 수 있는 형태여야한다. 최소한의 문서의 도움만으로 API 자체를 이해할 수 있어야한다
REST 안티 패턴
GET/POST
를 이용한 터널링하는 것. (메소드에 맞는 목적으로만 사용하라)에러는 적절한 상태코드와 메세지를 담아서 디버깅하기 쉽게 한다.
에러 발생시 스택 정보를 포함시킬수는 있지만, 이는 대단히 위험하다. 내부 코드 구조, 프레임워크 구조를 외부에 노출하기 때문이다. 다만 내부 개발 중일 때에는 유용하다. 프로덕션 환경과 개발 환경을 구분하자
API 버전 관리 예시
api.server.com/account/v2.0/groups
페이징
응답 메세지에 모든 필드를 포함할 필요 없다. 필요한 필드만 부분 응답 처리한다.
API 서버가 물리적으로 분리되어 있더라도, 단일 URL을 사용하는 것이 좋다
HAProxy
, Reverse Proxy
를 사용하는 방법이 있다. api.apiserver.com/user/
는 user.apiserver.com
으로 라우팅하고 api.apiserver.com/car/
는 car.apiserver.com
으로 라우팅하도록 구현하면 된다.10월 2일(토) [CSS] width 속성과 너비 결정 매커니즘
절대값으로 지정하면 부모 엘리먼트를 삐져나올지언정 절대 변하지 않는다
상대값은 가용 너비
를 기준으로하며, 가용 너비
는 박스 모델 상 부모 엘리먼트의 컨텐츠 박스 크기를 말한다.
auto
는 width의 기본값으로, 브라우저 자동으로 계산한다. 계산 알고리즘은 가용 너비 - margin
이다.
min/max-content
는 가용 너비가 아닌 담고있는 컨텐츠에 의해 width 값을 결정한다. min/max content
는 해당 엘리먼트의 너비를 줄일 수 있는 만큼 최소/최대로 만든다. max의 경우 텍스트의 배경색을 적용할 때 유용하다. 텍스트 길이에 딱 맞기 때문에.
fit-content
는 min/max-content
의 하이브리드 모드로, 가용너비가 넉넉하면 max, 부족하면 auto처럼 동작한다.
10월 3일(일) SVG 아이콘 백그라운드 이미지로 활용하기
SVG는 <img>
, <embed>
, <object>
, <iframe>
, <svg>
등으로 표현할 수 있다.
SVG 파일을 에디터에서 연 후, DTD
, version
, xmlns
는 반드시 필요한 속성은 아니니 제거해도 좋다.
SVG 압축 도구로 "웹 SVGOMG"를 사용한다.
Data URI 형태로 변환한다.
data:
스킴으로 시작하는 URLdata:[<mediatype>][;base64],<data>
IE 크로스 브라우징을 고려한다면 <
를 %3C
로, >
를 %3E
로, #
를 %23
으로 치환하면서 캐릭터 셋을 utf8로 지정하는 과정을 거치는게 좋다.
10월 4일(월) 2021년 검색엔진 최적화(SEO) 변경 사항 6가지 및 순위에 미치는 영향
결론적으로, 구글의 우선순위는 사용자 경험을 개선하는 것이다.
10월 5일(화) Headless UI Library란?
UI를 컴포넌트로 만들기 전에 고민할 세가지
UI 라이브러리들을 둘러보면 ‘스타일’이 포함되어있는 경우가 많아 바로 사용하기 곤란한 경우가 많다. 이런 귀찮은 문제를 잘 해결할 수 없을까?
대부분의 스타일 재정의는 CSS Override로 쉽게 제어가 가능하지만 몇 가지 단점이 있다
Headless는 스타일링을 담당하는 부분을 과감하게 제외하고 상태와 관련된 부분만 다루는 것이다.
React 공식문서의 Higher-Order Components의 내용을 참고해서 만들 수 있을 것이다.
본문의 달력 예시를 참고하자
10월 6일(수) 브라우저 핑거프린팅(Browser Fingerprinting)이란?
디바이스 핑거프린팅은 식별을 위해 수집된 원격 컴퓨팅 기기의 하드웨어/소프트웨어 정보를 말한다.
persistent 쿠키를 읽을 수 없거나 / 클라이언트 ip가 숨겨져 있거나 / 한 기기에서 다른 브라우저를 사용해 접근하는 경우 등에서 사용자를 식별하기 위해 사용된다.
위조 ID / 신용카드 등 사용을 막는 목적도 있지만, 마케팅 개인화를 위해 사용되기도 한다
광고를 목적으로 하는 회사는 어떻게든 개인 데이터를 수집하려하고, 브라우저는 사용자에게 좀 더 private한 환경을 제공하기 위해 노력한다. (그럼 구글은..? 크롬과 광고 사이에서...?)
웹 브라우저 발전사 / 핑거프린팅 기법 / 방어 기법 등 설
동일한 텍스트는 운영체제 / 폰트 라이브러리 / 그래픽카드 / 그래픽 드라이버 / 브라우저에 따라 다른 컴퓨터에서는 다르게 렌더링 될 수 있다. 일련의 과정(본문참조)를 통해 hash 값을 추출, 유용한 식별자로 사용 가능하다.
브라우저 익스텐션을 통해 특정 URL 또는 DOM 변경을 통해 특정 익스텐션이 설치되었는지 확인하거나 / 가짜와 존재하는 익스텐션에 대해 쿼리를 실행, 요청 간으 시간차를 측정해서 익스텐션을 파악한다고 한다.
그외에도 JS 엔진의 컴파일을 이용하거나 / 특정 브라우저의 유니크한 CSS 속성 prefix / 기기의 CPU, GPU capabilities 벤치마킹 / 배터리 충전량을 통해 식별하기도 한다..
이러한 핑거프린트 방어에 다양한 기법이 있지만 주로 모던 웹 브라우저의 기능을 제한하거나, privacy를 높이는 것 사이의 균형을 맞추는 것에 가깝다.
다양한 방법들은 본문을 참고하자.. 너무많다..
10월 7일(목) [React] CORS요..? 제 잘못,,, 인가요?
프론트엔드로서 CORS를 마주할 때! (백엔드.. 문제..아닌가요..? 근거를 대자..)
헤더에 약속된 토큰을 넣어주고 / withCredentials : true가 설정되어 있다면 프론트가 할 일은 다 한것이다? (진짜?)
10월 8일(금) 프론트엔드 개발자에게 가장 중요한 역량은?
사용자, 사용자! 사용자 경험을 중요시하는 마인드 셋
사용자가 서비스가 살아있다고 느끼는게 중요하다. 누적 신청자 수를 라이브로 보여주기 애니메이션. 간편한 퍼널
제품에 대해 오너십을 갖는다
개발 뿐 아니라 제품 전반에 대한 이해가 필요하다. 주도적으로 제품을 만드는데 기여할 수 있다.
다양한 일의 맥락을 파악하고, 중요도와 우선순위를 판단한다. 한정된 시간 자원을 최대로 활용
동료와 적극적인 소통을 통해 일 진행 정도를 공유한다
빠르게 실험하고 사용자 반응을 본다. 그러기 위해 코드의 유지보수성을 고려해야한다. 수정은 당연하니까!
웹을 앱처럼 보이도록 하는 웹 성능 최적화는 중요도가 높다.
타 직군과 세부사항을 맞춰가며 소통하자
새로운 것에 호기심을 갖자
성장에 대한 열망
왜?
10월 9일(토) Express만 하다가 Nest를 하고 느낀 점
10월 10일(일) 🤔 JWT, 정확하게 무엇이고 왜 쓰이는 걸까?
HTTP는 연결과 상태를 유지하지 않기 때문에, 로그인 구현시 자신이 누구인지 계속 인증해야한다.
서버에서 사용자 인증을 유지하는게 세션, 클라이언트에서 하는 것이 토큰 방식이라 볼 수 있다. 토큰 방식은 서버 확장성을 가진다!
JWT는 header / payload / signature로 나뉜다
header는 JWT를 어떻게 검증하는지 / payload는 토큰에 담는 내용 / signature는 header와 payload를 합친 문자열을 서명한 값이다.
JWT 장점
단점
10월 11일(월) Next.js - SSR이라고만 알고있었다.
getStaticProps
는 빌드타임에 호출되어 fetch된 데이터를 해당 페이지의 props로 전달해서 pre-render한다. getStaticPaths
는 빌드타임에 요청을 보내 이에 따른 페이지들을 생성해야하기 때문에 그 결로들을 미리 정의한다.10월 12일(화) React에서 선언적으로 비동기 다루기
명령형으로 에러를 처리하는 try-catch
를 사용하는 함수는 컴포넌트에서 그대로 가져다 쓰기 불편한 비동기 함수이다. 사용하기 위해서는 useState/useEffect 등을 사용해 상태 관리가 필요하다
try-catch
를 통해 로딩/에러 상태를 정의하는 hooks를 사용하곤 한다 (본문참조)
로딩/에러 상태를 매번 확인, 정의해야하고 수 많은 에러를 각 컴포넌트/hooks에서 처리하는게 번거롭다.
선언적으로 에러를 처리하는 방법으로 Suspense
와 ErrorBoundary
를 사용한 비동기 컴포넌트를 사용하자
swr
, react-query
를 사용하면 간단하게 처리할 수 있다.
Suspense
의 fallback
덕분에, 해당 컴포넌트는 호출 상태가 로딩인지 판단할 필요 없이 데이터가 로드된 시점만 고려하면 된다
Suspense
는 SSR을 지원하지 않는다. 다만 Client환경 시점을 알아내기 위한 hooks를 섞는 방법으로 Suspense
를 확장해서 구현 가능하다 (본문참조)
이 방법으로 loading 값을 따로 관리하지 않아도 된다. 하지만 여전히 error 상황 처리를 하지 않았다
ErrorBoundary
는 클래스형 컴포넌트이지만 확장한 후에 함수형 컴포넌트에서 사용할 수 있는 듯하다. 본문참조! 상당히 복잡하다.
10월 13일(수) 클라이언트의 사용자 중심 예외 처리
에러는 크게 언제, 어떻게 발생할지 예상 가능/불가능한 에러로 구분할 수 있다.
API 응답 status code중 500대 이하 코드는 예상 가능한 에러로 볼 수 있다. 각자 상황에 맞는 코드를 부여하고, 그에 맞는 처리를 미리 작성해둘 수 있다.
500대는 예측할 수 없는 에러로 분류한다. 서버의 예상 할 수 없는 상황, 사용자 네트워크, 브라우저 환경에 따른 에러는 예측하기 어렵다.
또한, 환경이 아닌 사용자와의 상호작용으로 에러를 구분할 수도 있다. 사용자가 그 에러를 해결 가능한가/불가능한가
해결 가능한 에러의 예시는 인증/권한 관련 에러이다. 로그인을 하거나, 동의를 해야한다거나, 권한을 요구해야한다거나 등 안내를 통해 사용자가 스스로 해결할 수 있도록 유도할 수 있다.
해결 불가능한 에러의 예시는 사용자의 기기가 저사양이거나, 브라우저 문제 등이 있다. 다른 브라우저를 사용하라는 메세지를 줄 수도 있긴 하지만, 근본적인 해결은 되지 않는다.
이를 통해 예상 OX, 사용자 해결 OX로 4가지 경우의 수가 나온다. 자세한건 본문을 참고하자
예상 X 사용자 해결 O
예상 X 사용자 해결 X
예상 O 사용자 해결 X
예상 O 사용자 해결 O : 비즈니스 로직 일부로 개발자가 이미 알고 있는 에러들.
하지만 현실적으로 딱 나누어지지는 않는다.
예상 가능/불가능 에러를 판단할 기준, 에러 전파를 막을 장치, 모니터링을 위한 도구를 마련하자.
10월 14일(목) 선언적으로 에러 상황 제어하기
예상했던 에러를 처리하기 위해서는 API에서 내려오는 status code 외에 에러를 구체화하기 위한 error code / flag 같은 값이 필요하다.
try catch의 catch
에서 전달받는 error 객체가 예상 가능한 형태인지??
Sentry. 에러 모니터링 도구
AsyncBoundary
로 감싸서 에러가 전역으로 퍼지는 것을 방지하자. (본문 참고!)
error가 catch 되었을 때 에러를 초기화함과 동시에 다른 곳에 캐싱된 값(react-query로 호출한 API의 에러는 react-query에 캐싱됨)들을 같이 reset해주어야 한다
때로는 전역에서 처리해야하는 에러가 있다. 이 경우 비동기 컴포넌트를 감싸고 있는 AsyncBoundary에서 capture하지 않을 에러를 무시하는 로직이 필요하다 (ignoreError)
10월 15일(금) 서치엔진은 어떻게 작동할까?
웹 크롤러는 문서(HTML)의 상태를 확인하기위해 각 URL을 가져오는데 문서에 에러코드가 출력되면 해당 문서의 어느 한 부분도 사용할 수 없다
크롤러는 301/302 처럼 redirection status code를 발견하면 그 방향대로 낭가가고, 필요하면 컨텐츠를 다운 받으며 진행한다. 즉 다음 문서로 가기 위해 링크
가 필요하다.
크롤러는 즉각적으로 링크/버튼 등을 클릭하는게 아니라 나중에 방문하기 위해 queue에 URL을 쌓아둔다.
새로운 URL을 방문할 때 쿠키/로컬스토리지/서비스워커 사용은 불가능하다
크롤러가 문서를 검색하면 서치 엔진에게 컨텐츠를 넘기고, 서치 엔진은 문서를 렌더링한다. (인덱싱)
서치 엔진은 keyward, title, link, heading, text 등을 본다
서치 엔진은 단순히 키워드를 인덱스에 매칭하는 일 뿐 아니라, 최적의 정보를 주기 위해 문맥, 대체단어, 사용자 위치 등을 고려한다.
10월 16일(토) 🔎 검색 상단에 오르기 위한 SEO 최적화
lighthouse의 SEO 점수로 검색 우선순위 파악 가능
도메인의 복잡성은 검색엔진에게 큰 의미가 없다. 검색엔진은 도메인의 국적, 연식을 더 중요시한다. kr보다는 com이 유리하며, 신생보다 오래된 도메인이 유리하다!
head 최적화
태그 최적화
getInitialProps
, getStaticProps
, getStaticPath
, getServerSideProps
등을 이용한다.getInitialProps
가 있다면 실행한다.getInitialProps
가 있다면 실행한다. pageProps들을 받아온다.getInitialProps
가 있다면 실행한다. pageProps들을 받아온다._app.tsx
에, 지역 데이터 패칭은 각 페이지에서 진행한다. getInitialProps
는 만으로 데이터를 패칭하는건 next 9.3
버전이전이고, 이후 버전에서는 getStaticProps
, getStaticPath
, getServerSideProps
로 분화되었다. _app.tsx
에서 getInitialProps
를 사용해야한다. 단, 이 경우 자동 정적 최적화가 비활성화되어 모든 페이지가 SSR로 제공된다. 그래서 9.3
버전 이후에 getStaticProps
, getServerSideProps
같은 것들을 추가한 것이다.getInitialProps
내부 로직은 서버에서 실행 되기 때문에 클라이언트에서만 가능한 로직(window, document 등)은 피할 것!getStaticProps
를 원할 때 사용한다.10월 18일(월) 모두의 네트워크 정리 (1)
네트워크는 연결이며, 컴퓨터 네트워크는 2대 이상의 컴퓨터가 연결되어있는 상태를 의미한다.
인터넷은 전세계의 크고 작은 네트워크를 연결하는 거대한 네트워크를 의미한다.
패킷은 컴퓨터 간의 데이터를 주고 받을 때 네트워크를 통해 전송되는 데이터의 작은 조각을 말하며 큰 데이터도 작게 나누는 것이 규칙이다.
LAN(랜)은 좁은 범위의 네트워크로, 건물/특정 지역을 범위로 한다. 사무실 같은 곳에서 컴퓨터-프린터 연결하는 등
WAN(왠)은 인터넷 서비스 제공자(ISP)가 제공하는 구축된 네트워크. 랜과 랜을 연결한다고 생각해도 됨.
10월 19일(화) 모두의 네트워크 정리 (2)
10월 20일(수) 모두의 네트워크 정리 (3)
1계층 - 물리계층
데이터가 흐르는 물질적 선로
리피터
허브
스위치
10월 21일(목) 모두의 네트워크 정리 (4)
이더넷. 랜의 데이터 링크 계층에서 가장 많이 사용되는 규칙.
예를 들어 허브는 각 포트에 연결된 모든 컴퓨터에 데이터가 전송되기 때문에, A에서 B로 보낼 때 C, D ..등은 데이터의 내용을 보지 못 하게 하는 규칙이 있다.
이더넷은 여러 컴퓨터가 동시에 데이터를 전송해도 충돌이 일어나지 않는 구조다.
충돌을 막기 위해 시점을 늦추는 CSMA/CD 방법이 있었으나, 효율이 좋지 않아서 스위치라는 네트워크 장비를 주로 사용한다
MAC 주소(Media Aceess Control Address). 랜카드의 고유번호로, 전 세계에서 유일한 번호로 할당하려 하지만 종종 충돌 문제가 발생한다.
이더넷 유형. 인터넷으로 전송되는 상위 계층 프로토콜의 종류로, 프로토콜 종류를 식별하는 번호가 들어간다.
스위치.
10월 22일(금) 모두의 네트워크 정리 (5)
라우터. 네트워크 계층에서 다른 네트워크로 데이터를 전송하기 위해 필요한 장비. 데이터의 목적지까지 어떤 경로로 가는 것이 좋은지 알려준다
IP 주소. 데이터의 목적지. IP 헤더에는 출발지 IP주소와 목적지 IP주소가 있다.
라우팅. 목적지 IP 주소까지 어떤 경로로 데이터를 보낼지 결정하는 것
IPv4 / IPv6. IPv4 주소는 32비트로 되어 있어서 약 43억개의 주소를 만들 수 있다. 처음에는 충분하다 생각했지만 인터넷이 널리 보급되며 부족해졌다. IPv6는 128비트로 340간 개를 만들 수 있는데, 340간이란 340조 1조 1조를 말한다
공인/사설 IP. IPv4 주소는 고갈되고 있기 때문에, 인터넷에 직접 연결되는 컴퓨터/라우터는 공인 IP 주소를, 회사나 가정의 랜에 있는 컴퓨터는 사설 IP주소를 할당한다.
10월 23일(토) 모두의 네트워크 정리 (6)
전송 계층은 신뢰할 수 있는 데이터를 전달하는데 필요하다.
오류를 점검하고, 전송된 데이터 목적지가 어떤 어플리케이션인지 식별한다.
신뢰/정확한 데이터를 전달하는 통신을 연결형 통신, 효율적인 데이터를 전달하는 통신을 비연결형 통신이라고 한다
TCP. 전송 계층에 신뢰할 수 있는 정확한 통신을 제공하는 프로토콜
3-way 핸드셰이크.
데이터 전송 후에도 연결을 끊기위한 요청을 교환해야한다.(FIN, ACK)
3-way 핸드셰이크가 끝나고 실제 데이터를 주고 받을 때 TCP 헤더의 일련 번호/확인 응답 번호를 사용한다
10월 24일(일) 실무에서 느낀 점을 곁들인 Intersection Observer API 정리
등장 이유. scroll
이벤트, 가시성 관찰에 사용되는 getBoundingClientRect
의 문제점 때문에.
스크롤 이벤트는 짧은 시간에 수 백, 수 천번의 이벤트가 동기적으로 실행될 수 있기 때문에, 메인 스레드에 큰 부하를 줄 수 있다.
getBoundingClientRect
는 reflow를 발생시킬 수 있다.
더불어 신뢰도 있는 공식 API의 필요성도 더해서, Intersection Observer API
가 등장하게 되었다.
Intersection Observer API
는 루트 요소/타겟 요소의 교차점을 관찰한다. scroll
이벤트와 달리 비동기적으로 실행되며, 가시성 구분 시 reflow를 발생시키지 않는다.
요소의 모든 부분을 감싸는 가장 작은 사각형을 가정하고 교차성을 계산한다.
인스턴스를 생성할 때 callback
과 options
를 받는다
Options
callback
을 실행시킬 지에 대한 퍼센테이지 값 (단일 숫자 / 배열)Callback
entries
, observer
를 받는다.대표적 용례
한계점
사용법은 따로 정리하지 않겠음!
10월 25일(월) 새로운 CSS 기능적인 의사 클래스 :is()와 :where()
:is()
선택자를 통해 선택자 중복을 줄일 수 있다!
h1 > b, h2 > b, h3 > b
를 is(h1,h2,h3) > b
로 줄일 수 있다!브라우저 호환성도 나쁘지 않다. IE는 당연히 안 되지만, 사파리는 일부?만 된다
:is()
가 할 수 있는 그룹화는 :where()
도 할 수 있다.
차이점
10월 26일(화) 웹 서비스 캐시 똑똑하게 다루기
HTTP 캐시를 효율적으로 관리하려면 Cache-Control 헤더를 섬세하게 조절해야한다.
리소스. 브라우저가 HTTP 요청으로 가져올 수 있는 모든 종류의 파일
브라우저가 서버에서 지금까지 요청한 적 없는 리소스를 가져오려고 할 때 완전한 HTTP 요청/응답을 주고 받는다. 리소스의 생명주기는 HTTP 응답에 있는 Cache-Control 헤더에 따라 결정된다.
개발자도구 네트워크 탭에 General에서 from memory cache는 캐시 메모리에서 값을 가져왔다는 뜻.
캐시의 유효시간이 지나도 캐시가 완전히 사라지는건 아니다. 이후 브라우저는 서버에 조건부 요청을 통해 캐시가 유효한지 재검증한다.
no-cache. 대부분 브라우저에서 max-age=0과 동일하다. 캐시는 저장하지만, 사용하려고 할 때마다 서버에 재검증 요청을 보내는 것
no-store. 해당 리소스를 절대 캐싱하지 않는다.
캐시를 삭제하는 건 상당히 까다롭다. 브라우저 캐시는 쉽지만, 여러 CDN/중간 서버에 저장된 캐시는 각각 지워야한다. 따라서 max-age같은 값은 신중히 정해야한다.
public, private. CND/중간서버에서 특정 리소스를 캐시할 수 있는지
s-maxage. 중간서버에서만 적용되는 max-age값
HTML 파일은 새 배포가 이루어질 때 마다 바뀔 수 있기 때문에 불러올 때 마다 새로운 배포가 있는지 확인해야한다 따라서, max-age=0
, s-maxage=31536000
JS/CSS 파일은 (토스의 경우) 빌드 결과의 버전 번호를 URL에 붙여서 고유하게 관리하기 때문에, 같은 URL에 대해 내용이 바뀔 경우가 없다. 따라서 리소스 캐시가 만료될 일도 없다.
그렇기에 max-age=31536000
최대치로 설정한다!
10월 27일(수) 셀프서비스 디자인시스템 #1 – 디자이너 편
우아한형제들 개발/플랫폼 조직은 도메인별로 구분되어 있다. 각 조직에 다양한 요구사항이 들어오는데, 이를 해결하는 방식, UX를 일관성있게 제공하기 어려웠다.
어떤 종류의 기능은 항상 이렇게 동작하고, 어떤 종류의 정보는 항상 이렇게 표현한다.는 것을 정해두어 병렬로 업무를 처리하는 프로세스를 마련하고자 하는 목적
디자인 시스템이 일관성을 부여하면서,
1년 후, 셀프서비스 팀 뿐 아니라 다른 서비스에서도 이 디자인 시스템을 공유하고 있음.
공통디자인 TF 라는 조직 신설.
10월 28일(목) 셀프서비스 디자인시스템 #2 – 개발자 편
디자인시스템의 시스템은 복잡한 사회적 체계의 맥락에서 구조와 행동을 통제하는 규칙들의 집합체에 가깝다.
우형 셀프 서비스팀은 단순히 UI/UX 가이드라인이 정의된 UI 템플릿이 아닌, 프로토콜과 같은 매우 강력한 규칙으로 시스템을 만들었다.
정보를 노출하는 원칙을 정하고, 이를 컴포넌트화해서 재사용성을 높이면 좀 더 효율적으로, 빠르게 개발할 수 있을 것
코어 컴포넌트 / 코어 라이브러리 / 패턴 등으로 나눌 수 있다
코어 컴포넌트
코어 라이브러리
주로 객체지향 추상 클래스로 구성되어 있다.
후기로는, 이제 함수형 컴포넌트만 쓰는가 싶었는데 여전히 클래스형 컴포넌트도 쓰이는 거 같다. 클래스형 컴포넌트에 대한 공부도 게을리해선 안 되겠다!
10월 29일(금) 배민쇼핑라이브를 만드는 기술: 채팅 편
구매 인증 상황에서 분당 2만건도 넘는 메세지가..?
Sendird / FCM 같은 외부 메시징 서비스가 존재한다. 하지만 자체개발함!
과거 Thiiing을 만든 경험(DM)을 살린다.
WebFlux ?
프론트엔드로서 방향성은 WebSocket을 최소한으로, RDB 직접 접근 배제
너무 백엔드 얘기라서.. 이해는 잘 가지 않는..
10월 30일(토) node_modules로부터 우리를 구원해 줄 Yarn Berry
기존 npm의 문제
yarn berry는 plug`n`Play 전략을 이용해서 위 문제들을 해결한다
.yarn/cache
폴더에 의존성 정보를 저장하고 .pnp.cjs
파일에 의존성을 찾을 수 있는 정보가 기록된다.10월 31일(일) MSW로 API 모킹하기
서비스워커가 네트워크 요청을 가로채는 방식을 통해 mocking을 위해 어플리케이션 코드를 변경하지 않고 개발이 가능하다
서비스워커가 네트워크 요청에 대해 method, URL을 기반으로 해당 사항이 있는 요청을 가로채서 MSW에 보내고, handler에 정의한 모의 응답을 받는다.
서비스워커는 보안상의 이유로 HTTPS에서만 동작하고, 예외적으로 localhost만 허용한다.
11월 1일(월) SameSite Cookie란? 변경된 크롬 80 쿠키 정책
None
에서 Lax
로 변경되었다.a
, link rel=prerender
, form GET
은 쿠키를 전송하지만 form POST
, iframe
, Ajax
, img
는 쿠키를 전송하지 않는다.Secure
특성을 태깅해서 HTTPS 연결이 필요함을 나타내야한다.11월 2일(화) 공개적으로 학습하라!
글쓰기 / 발표하기 / 스택오버플로우 등 공개적인 장소에 질문하고 답하기 / 영상 제작하기 / 소식지 만들기 / 만화 그리기 .. 등..
좋은 영상을 보면 강사/발표자에게 감사를 전하고 궁금한 걸 물어보자
오픈 소스에 기여하자
나만의 라이브러리를 만들어보자
좋아하는 것들을 따라 만들어보고, 어떻게 동작하는지 보자
워크샵에서 강의하자
컨퍼런스를 찾고 학습한 것을 요약하자
가장 중요한 것은, 해결한 문제에 대해 문서화하자
11월 3일(수) 지금 당장 적용할 수 있는 '10가지 UI Tips'
11월 4일(목) 토스뱅크의 에러메시지에 동의하지 않습니다 - 에러메시지는 어떠해야 하는가
에러메세지는 1. 사용자에게 에러의 내용을 충분히 설명하고, 2. 해결방안을 제시하는 것이어야 한다.
프로그램의 에러메세지 자체를 일반 사용자에게 보여주는 건 가장 최악이다.
개발 모드일 때의 사용자는 개발자이기 때문에 프로그램 에러를 보여주고, 프로덕션 모드에서는 일반 사용자라는 것을 명심하자
에러 메세지는 격식체를 사용하자. 잘못했으면 격식을 차리자. 다만 '죄송합니다'같은 단어는 지양하자.
금융 서비스라면 '돈을 옮기는 중' 보다는 '송금 중'이라는 단어가 제품의 신뢰도를 높인다. 사용자는 금융 전문가가 내 돈을 조심히 다뤄주길 바라기 때문. 즉 서비스마다 사용자가 우리 제품을 어떻게 생각하는지에 따라 적합한 단어를 선택해야한다.
에러메세지라 해도 느낌표나 붉은색 경고 표시는 사용자의 긴장과 당황을 유발시키고 메세지를 읽지 않게 만들 수 있다.
11월 5일(금) [실무편] 회원가입을 쉽게 만드는 UI/UX 디자인은?
사용자에게 꼭 받아야 하는 정보만 받는다. 이메일/전화번호/이름/나이/성별/직업 등은 서비스마다 필요한 내용이 다르다. 불필요한 정보를 요구함으로써 사용자가 이탈하는 상황은 피해야한다.
간편 로그인을 제공하자. 모바일 유저의 경우 가상 키보드는 오타가 자주 발생하는 환경이기에 가능하면 가상 키보드를 사용하지 않게 하는 것이 좋다
같은 이유로 생년월일도 키보드가 아닌 날짜피커를 통해 입력하도록 한다. (또는 숫자 키보드)
사용자가 누르지 않았으면 하는 버튼(뒤로가기, 닫기 등)은 엄지영역에서 최대한 멀리 배치한다
회원가입시 얻을 수 있는 이점을 짧은 문구로 설명한다
한 화면에 너무 많은 선택지를 주면 사용성이 낮아진다. (로그인, 회원가입, 아이디찾기, 간편 로그인 등을 한 페이지에서...)
섬세한 디자인으로 사용자가 불편하지 않게 한다.
11월 6일(토) 웹뷰 애니메이션 최적화 하기(FPS, Css hack, Throttle)
애플은 주로 고해상도 사진, canvas 속성으로 애니메이션을 구현한다 => 인앱 웹뷰에서 좀 무리
토스는 js보다는 videofmf 이용해서 애니메이션을 구현한다. 깔끔하고 반응이 좋지만 시간과 인력이 더 많이 들어가는 거 같다
따라서 iframe + js + aos 프레임워크를 사용했다고 한다.
requestanimationframe
을 사용하자. 다음 리페인트가 진행되기 전, 해당 애니메이션을 업데이트하는 함수를 콜백한다. 실제 화면이 갱신되어 표시되는 주기에 따라 콜백 함수를 호출하기 때문에, 프레임 시작시 js가 실행되도록 보장한다. 즉 프레임을 유지한다.
개발자 도구에서 command + shift + p
를 누르면 프레임 확인이 가능하다!
will-change
해당 속성이 변환 될 속성이라는 것을 브라우저에게 미리 전달해서, 해당 레이어를 GPU를 통해 렌더링 하는 과정이다. 브라우저가 알아서 최적화를 한다.
단, 브라우저는 이미 모든 것을 최적화하기 위해 다양한 시도를 하고 있다. 너무 많은 요소에 will-change
를 적용하면 오히려 기기의 자원을 과도하기 소모하고, 페이지 속도가 느려질 수도 있다.
스크롤 애니메이션은 매우 빈번하게 일어나므로 스로틀을 적용해서 최적화한다.
11월 7일(일) [Browser] Cookie 톺아보기
쿠키는 세션 관리 / 개인화 / 트래킹. 크게 3가지 목적으로 사용한다
브라우저는 서버가 응답에 설정한 set-Cookie
헤더를 보고 쿠키를 저장한다. 이후 같은 서버에 요청할 때 해당 쿠키를 포함해서 요청을 전송한다.
단, 보안 정책 강화로 credential: 'include'
/ withCredential : true
등으로 쿠키를 전송함을 알려야한다.
secure
: HTTPS 요청일 경우에만 쿠키를 전송한다
httpOnly
: 자바스크립트로 쿠키에 접근할 수 없다.
sameSite
: None
Lax
Static
중 하나.
Domain
: 쿠키의 도메인 유효 범위를 지정한다. 없으면 현재 서버 주소가 기본
Path
: 쿠키의 디렉토리 유효 범위를 지정한다.
퍼스트 파티 쿠키 : 사용자가 방문한 웹 사이트에서 직접 발행한 쿠키
서드 파트 쿠키 : 다른 웹 사이트에서 발행한 쿠키. 구글은 23년 말까지 크롬에서 서드 파티 쿠키 지원을 중단하겠다고 발표했다. 보통 광고 서버에서 발행하는 쿠키
11월 8일(월) Template Literal Types로 타입 안전하게 코딩하기
Template Literal Type이란 기존 TypeScript의 String Literal Type을 기반으로 새로운 타입을 만드는 도구이다
type + type을 사용한 union도 만들 수 있다. 조합도 가능..!
Conditional Type과 더 강력한 추론가능. Conditional Type은 삼항 연산자와 비슷하다.
11월 9일(화) UX/UI의 10가지 심리학 법칙 ①
11월 10일(수) 2021년에 살펴볼 법한 브라우저 개발자 도구의 유용한 스타일 관련 기능
11월 11일(목) 타입스크립트 안전하게 활용하기
11월 12일(금) 브라우저 동작원리를 알아야 하는 이유가 무엇인가요?
11월 13일(토) 웹 성능 최적화를 위한 Tree Shaking 소개
11월 14일(일) 웹 성능 최적화를 위한 Image Lazy Loading 기법
11월 15일(월) WeakMap이 알고 싶다
11월 16일(화) 프로모션 없이 UX만으로 신규 가입 유저를 235% 늘리는 방법
11월 17일(수) [React] 리액트를 처음부터 배워보자. —01. React.js란 무엇인가?
11월 18일(목) [React] 리액트를 처음부터 배워보자. — 02. React.createElement와 React.Component 그리고 ReactDOM.render의 동작 원리
11월 19일(금) [React] 리액트를 처음부터 배워보자. — 03. React 의 Update 스케줄링 과정
11월 20일(토) [React] 리액트를 처음부터 배워보자. — 04. Functional Component와 useState
11월 21일(일) [React] 리액트를 처음부터 배워보자. — 05. Context API
11월 22일(월) [React] 리액트를 처음부터 배워보자. — 06. 합성 이벤트와 Event Pooling
11월 23일(화) [React] 리액트를 처음부터 배워보자. — 07. createRef와 useRef 그리고 useImperativeHandle