일일 아티클 2021.02.28 ~ 2021.05.31
일일 아티클 2021.09.01 ~ now
6월 1일(화) ajax, fetch, xhr 비동기통신 이해하기
form 태그에 action, method 속성을 사용한 get요청이 구식 방법인가 찾아보다가 발견한 글
form
XHR
AJAX
fetch
Axios
6월 2일(수) Clean Code #2 의미 있는 이름
6월 3일(목) 배민 오픈서비스, 혁신, 그리고 내 피같은 세금
기술 아티클은 아니지만, 카카오 100 프로젝트에 있길래 한 번 보았다.
배민의 비즈니스 모델 변천사? 수수료 0% 선언 후 울트라콜/슈퍼리스트 광고 상품으로 수익 실현, 흑자 전환과 고객 수 증대 성공
다만 슈퍼리스트가 업주들의 경쟁을 과열 시킨다는 지적에 폐지, 울트라콜은 자금력 있는 업주들이 중복 등록하며 상권 독점하는 문제가 발생했다.
결국 오픈서비스를 시작, 주문이 성사되는 건에 대해 5.8% 수수료 적용
배달의 민족이 점주들의 고혈을 짜는 나쁜 기업이라는 이미지가 형성됨.
... 요약하다가 그냥 쭉 읽어보았다. 기술적인 글은 아니지만, 배민이라는 회사는 가장 관심 가지고 있으니..
배달 시장은 이 글 이전에도 계속 커졌으며, 코로나 이후로 급격하게 성장했다. 간혹 욕을 먹기도 하지만 이익을 추구하는 기업의 입장을 고려하지는 않는 목소리 같다.
코로나가 해결되면 급격히 성장한 배달앱 시장이 조금 줄어들지? 궁금하기도 하고 배민이 배달 외에 하고 있는 사업들을 어떻게 풀어갈지도 궁금해진다.
6월 4일(금) React 상태가 불변성인 이유
React에서 상태값이 불변성을 유지해야하는 이유는 크게 두 가지다
shouldComponentUpdate의 경우 이전 상태값과 이후 상태값을 !==로 비교하는데, 불변성을 유지하지 않았다면 비교 결과가 의도치 않게 동작할 수 있다.
react addon인 shallowCompare / PureRenderMixin은 최상위 오브젝트의 레퍼런스가 다른 경우에도 그 하위 오브젝트 1depth가 같다면 화면을 다시 그리지 않는다
근데 useState의 setState의 경우에는 아닌거 같은데..? 무조건 렌더되는데.. 좀 더 찾아봐야겠다.
6월 5일(토) [FE] 프론트엔드 3대장 비교와 주관적인 최신 웹 동향에 대해 (feat. React를 기반으로)
React만 공부해본 입장에서 타 프레임워크도 한 번 훑어보고, 그럼으로써 왜 리액트를 쓰는지 좀 더 구체화해보자.
Angular
React
Vue
Svelte
PWA(Progressive Web Applications)
Web Assembly(WASM)
6월 6일(일) React 상태 관리의 과거, 현재, 그리고 미래
UI, 서버 캐시, 폼, URL 상태 / 상태 기계 등의 용어가 있다. 정의는 본문 참조
과거 React 컴포넌트는 고유한 로컬 상태를 가졌으나, 웹 어플리케이션이 복잡해지면서 컴포넌트간 로직을 쉽게 공유할 수 있는 솔루션들이 등장하게 됨
Redux
서버 캐싱 작업은 까다롭다. 서버 캐시 상태와 관련된 라이브러리가 다루는 문제들
contextAPI 자체는 상태 관리가 아니지만, useReducer와 함께 함으로써 상태 관리 솔루션이 된다.
2021년 현재, 특정 문제 상황 해결에 중점을 둔 세부적인 라이브러리들이 등장하고 있다
반드시 상태 관리 라이브러리를 사용하라는 것은 아니다. 확실히 필요한 상황이 아니면 굳이 사용하지 말자
상태의 가변성 vs 불변성 논란.
immer와 같은 코드는 코드는 가변적이지만 실행은 불변적이다.
URL 상태는 새로고침해도 브라우저 값을 관리하기에 동일한 UI를 볼 수 있으며, 다른 사람에게 URL을 공유함으로써 같은 화면을 볼 수 있다.
대형 어플리케이션의 경우 Context만으로는 과도한 리렌더링 이슈가 있다. 이에 대한 대안으로 useSelectedContext Hook이 등장했다.
프로젝트 규모별 폼 상태, UI 상태 추천 해결책은 본문 참조
서버 캐시 상태는 SWR, React Query가 완벽한 솔루션이다.
6월 7일(월) 자바스크립트에서 switch (true) 패턴 사용하기
swtich에 true를 넣는 방식? 궁금하니 한 번 읽어보자
swtich true 패턴의 기본 원리는 값 뿐만 아니라 표현식과도 비교할 수 있다 는 것이다. 즉 case의 표현식 결과가 true라면, switch(true)와 일치하게 되어 해당 case문이 실행된다.
종종 복합한 if/else문 대신 사용 가능하다
데이터 유효성 검사에 유용하다. 본문 참조!
is~ 함수로 유효성 검사를 추상화하면 더 나은 가독성을 얻을 수 있다.
누군가는 오히려 가독성이 떨어진다는 의견도 있다. 취향의 차이일지도? OR이 많은 조건문 사용시 if/else보다 switch true 패턴이 가독성이 좋다고도 한다. case는 break, return, throw 등이 없으면 아래 case문도 실행되니까 중복할 수 있다. (본문 참조!)
6월 8일(화) Mistakes | 주니어 리액트 개발자인 내가 실수하고 있었던 것
6월 9일(수) npx create-react-app ... 그래서 npx가 뭐길래?
cra를 설치할 때는 npx로 설치하고, npm i와 달리 node_modules에 설치되는게 아니라 지정한 루트에 설치하곤한다. 뭐가 다른걸까?
npx는 npm5.2 버전부터 새로 추가된 도구로, 레지스트리에서 호스팅되는 CLI 도구 및 기타 실행 파일을 쉽게 사용할 수 있다.
언제 사용하나?
6월 10일(목) 타임존과 moment isBetween('어제', '오늘')
전 세계의 다양한 시간대를 표시하는 방법 타임존. 이 타임존이 필요한 이유와 역사, 프런트에서 타임존을 어떻게 지원하는지. 개발자라면 한 번은 꼭 부딪치는 타임존!
우리나라는 가로 너비가 좁아서 시간대를 나누지 않아도 불편함이 없다. 중국은 가로가 넓음에도 불구하고 하나의 시간대를 쓴다. 반면 미국은 타임존을 나누어 사용 한다. 동-서부가 3시간 정도 차이남
타임존은 경도에 따라 절대 바뀌지 않는 시간 오프셋을 지정하는 다른 표현이다.
타임존을 변경하는 기능은 ECMAScript 명세에도 없어서, 브라우저나 Node.js는 설치된 OS에 설정된 타임존을 따르도록 구현되어있다. 따라서 브라우저에서 다른 나라의 타임존으로 바꾸려면 OS 설정을 바꿔야한다.
타임존은 데이터베이스를 기반으로 변경 내역을 관리해야한다. 가장 신뢰가는건 IANA Time Zone Datebase.
ECAMScript에 타임존 정의가 모호하고, 브라우저가 이 DB를 갖고 있지 않아서 Date 타입만으로는 타임존을 변경할 수 없다.
해결 방법은 웹 페이지에 타임존 데이터베이스 내장 또는 Intl.DateTimeFormat 사용
moment.js 라이브러리가 좋은 대안이었으나, 이제 유지보수만 하게 되어 dayjs, luxon, date-fns 등이 새로 나타났다.
6월 11일(금) Uinx/Linux: Shebang과 env에 대한 설명 (#!/usr/bin/env)
npx로 수제 cra를 설치시키려는 시도 중 얻게 된 키워드 shebang. 최근 맥과 윈도우라는 OS 차이로 인해 개발에 어떤 영향이 있나 몸소 체험중이다..
킹갓맥 생태계인거 같다..
shebang(쉬뱅), #! 는 2Btye의 매직넘버로 이 스크립트를 실행시켜줄 프로그램의 경로를 지정하는 역할을 한다. html의 <!DOCTYPE>과 비슷한 역할인듯
하지만 프로그램의 경로는 시스템 환경에 따라 달라진다. 그렇기에 env를 지정한다
내가 작성한 js 스크립트를 node로 읽으라는 명령을 위해 #! usr/bin/env node를 상단에 입력했는데, 윈도우에서는 동작하지 않고 무시돼서 에러가 발생했다.
물론 이후 알아보니 이것만의 문제는 아니었지만.. OS의 차이를 조금은 실감하게 되었다
6월 12일(토) 트리 쉐이킹 되는 UI 라이브러리 만들기 ㄱ부터 ㅎ까지
UI 라이브러리를 만들기 위한 방법 소개.
- 트리쉐이킹 : 웹팩에서 JS 모듈을 번들링 할 때, 사용하지 않는 코드는 제거하는 최적화 과정. 라이브러리의 경우 사용자는 그 중 일부만 사용하고자 할 수 있다. 따라서 모든 라이브러리를 사용하지 않고, 원하는 부분만 사용함으로써 용량을 줄여 가볍게 사용하는 전략인 듯
- 절반도 이해 못 한 것 같다.. 아주 복잡하다.
단순히 동작하는 것을 떠나서 사용자가 사용하기 쉽게, 그리고 "가볍게" 사용할 수 있도록 노력하는 흔적이 보인다.
6월 13일(일) 독서가 내게 가져다 준 것들
사실 학교를 졸업할 때 개발 관련 도서 7권 정도를 지원 받았는데 아직 한 권도 제대로 다 읽지 못했다.
공부를 안 하는건 아니고 아침부터 새벽까지 하고는 있는데 책을 통한 공부는 잘 안 하게 되는거 같다. 일단 다 읽는데 부담도 있고 당장 필요한지 (일일 아티클도 뭐 그렇긴한데 부담은 적으니까) 싶어서..
그런 의미에서 제목에 이끌려 읽어보았다.
나 또한 군대에서는 책을 많이 읽다가 전역 후에(사실 병장쯤부터) 책과 다시 멀어진 케이스다. 더 쉽고 재밌는 소비제가 넘쳐나니... 짧게 만들어진 습관은 금방 사라지는거 같다.
영상 매체에 익숙해져 긴 글, 깊은 사고를 하기 힘들어졌다는 말에 너무 공감한다. 그래서 틱톡같은 짧은 영상 매체가 인기를 끄는걸지도.. 사람들은 생각하기 싫어하는 쪽으로 세뇌되고 있ㄸ ㅏ..
안 되는 이유부터 말할 것인가, 어떻게든 되게 해볼 것인가?? 사실 안 되는건 생각보다 없다..
글을 읽다보니 18년도에 토론 모임을 하고 내 생각에 대해 고민하던 때가 떠올랐다. 지금은 공부에만 집중하다보니 하지 못하고 있는 일들. 책을 읽으며 넓어진 세계관. 현실적으로 당장 독서를 시작하기엔 힘들거 같지만 노력은 해봐야겠다.
6월 14일(월) 바벨과 타입스크립트의 아름다운 결혼
최근 수제 CRA를 만들면서 동작한다 싶었는데 ts-loader만으로 커버하기엔 한계가 명확하다. 특히 import React from 'react'
생략하기는 ts-loader만으로는 안 되는거 같다.
바벨 7 이전에는 TS로 컴파일한 JS를 다시 바벨로 컴파일하곤 했지만 7 이후로는 그럴필요 없다.
바벨은 TS 코드 어떻게 처리하는가?
전체적으로 그냥 번역기를 돌린 듯한 내용이라 아쉽다 NHN처럼 큰 회사에서 이런식으로 글을 관리한다니.. 번역돌리다 문제가 생긴건지 깨진 텍스트도 있고..
6월 15일(화) 당신은 이미 펑터Functor를 알고 있다
이 글의 시작은 map의 TypeScript 타입을 지금 바로 써낼 수 있느냐? 이다. 나는 할 수 없었기에, 이 글을 읽어보기로 했다.
TypeScript에는 그저 타입만 만족하는 잘못된 구현이 존재한다. 즉 타입만 통과한다고 다가 아니다.
functor라는 개념이 나온다. 굉장히 수학적인 내용같은데.. '함자'라고 해서
대표적으로 Array가 제네릭을 품을 수 있고, map이라는 메서드로 원소에 함수를 적용할 수 있다.
이후 글은 너무 어렵다..! TS 공부를 기초부터 제대로 싹 해야겠다.
6월 16일(수) Github Action 사용법 정리
Github Action이라는게 있는건 아닌데, 정확히 어떤 기능일까 궁금하니까 알아보자
workflow를 자동화 할 수 있도록 도와주는 도구이다.
무료 / 유료 버전이 있다. action 개수, 시간, 용량등 제한이 있다
Github Action을 이해 하기 위해 workflow, event, job, step, action, runner에 대해 알아야 한다. 자세한 설명은 본문참고
스케줄 설정은 가능하나 즉시 실행은 아직 없는 듯
이미 만들어진 action을 마켓에서 가져다 쓸 수 있는 듯.
6월 17일(목) 글자가 그려지는 애니메이션
오늘 빰빰이 언급한 svg로 글자 그리는게 마침 벨로그 상단에 떴길래 오늘은 요걸로
svg는 벡터 기반. 크기 조절해도 이미지가 깨지지 않음.
svg의 text 태그에 각 글자를 넣고 css에서 스타일 변경 가능. stroke-width, stroke, fill등
stroke-dasharray
stroke-dashoffset
즉 대쉬 길이를 글자 길이로 고정하고 dashoffset을 조정한다.
keyframes로 중간값까지 디테일하게 조정하면 더 깔끔!
animation-delay값을 달리해서 더 그럴듯하게 조정
6월 18일(금) [Recoil] Recoil 200% 활용하기
6월 19일(토) 어떤 개발자가 될까?
최근 우테캠 자소서, 면접 등을 준비하면서 어떤 개발자가 되고 싶은가에 대한 질문에 선뜻 대답하기 어려웠다. 그래서 이 글의 제목이 끌렸던것 같다
이 분은 위코드가 광고를 가장 적게해서 좋았다고 한다. 나도 코드스쿼드를 선택한 이유 중 하나가 과장광고를 하지 않는다는 것이었다. 가장 큰 이유는 우형, 네이버 등에서 믿고 맡기는 교육업체이기 때문이었지만..
하루에 두 번 감사를 표한다. 뭔가 훈련소에서 시켰던 일이 떠오른다..
어떤 개발자가 될까. 누군가 나를 "함께 일하고 싶은 개발자"라고 생각하길 바란다고 한다. 뻔한 대답같지만, 좋은 대답이기도 하다. 나도 그렇게 생각하니까 흠..
6월 20일(일) [개발상식] JSON과 JavaScript Object의 차이점
json은 API 통신을 하면서 특히 많이 쓰게 되는 데이터 타입이다.
JavaScript Object는 JS Engine 메모리 안에 있는 데이터 구조이고, JSON은 객체의 내용을 기술하기 위한 text 파일이다.
JSON은 모든 키를 따옴표로 묶어야하며 string 타입이고, 함수를 값으로 할당할 수 없다(문자열이니까)
6월 21일(월) 신입 개발자 혼자 어디까지 만들 수 있을까?
이 제목을 보고 어떻게 안 볼수가 있을까..
10월에 본격적으로 공부해서 12월에 인턴, 1월 정규 채용이라.. 대단하다!!
사수 없는 개발이라.. 기회일 수도 있지만 나는 가능하면 사수가 있었으면 한다. 혼자 우여곡적을 겪는 것또한 경험이겠지만 너무 삽질을 하거나, 운이 나쁘거나? 잘못하면 성장 기대치가 낮아질 것 같다.
다양한 기능을 아주 흥미롭게 개발한거 같다. 로직 정리를 중요시해서 메모장에 각 케이스와 예외처리까지 미리 정리하고 개발을 진행한게 본받을 점인 것 같다.
"리팩토링은 다 끝내고 하는게 아니라 그냥 매일 하는 것"
사수없이 혼자 해낸 노력에 박수를 보낸다..
6월 22일(화) 개발자가 블로그를 운영해야 할 이유
어떤 글을 쓰면 좋을까?
내가 블로깅을 하는 이유는 학습한 내용을 더 구체화해서 정리하고, 다른 사람들에게 공유하기 위해서?
6월 23일(수) 누구나 원하는 개발자되기
이력서를 통해 어떤 기술을 사용했고, 채용 대상 기술셋에 맞는지
사전 과제를 통해 실무 능력을
기술 면접에서 기술의 이해, 경험에 대한 깊은 질문으로 검증
"이력서라면 글을 통해, 사전 과제라면 코드를 통해, 면접이라면 말을 통해" 보여주자
이력서는 주기적으로 업데이트하면서 관리하자
자신의 성과를 파악하자. "단순히 기술을 나열하기보다는 성과라는 스토리를 담도록 노력하자"
사전 과제에서 보고 싶은건 정상 동작이 아니라 어떤 코드인가 이다. (정상 동작은 당연하다)
잘 알고 있다고 생각하는 것도 말로 설명하려면 어려운 경우가 있으니, 설명하는 연습을 충분히 하자.
6월 24일(목) 🧐 아무도 가르쳐 주지 않는 것
비슷한 내용의 책이 있는데 아직 읽어보진 않았다. 흥미로운 제목이다.
Log
ENV
config
Test
Git
CI/CD
AMP / Analytics
Debugging / Profiling
6월 25일(금) 2020년 회고
우테캠 합격 기념, 코쿼 졸업 기념해서 찾아보다가.. 가볍게 읽어보자
이제보니 코쿼 초반에 읽었던 글이다. 이 글에서 블랙커피 스터디를 처음 알게 되었지.. 상당히 의미있는 글이네?
프론트엔드 공부를 시작한지 얼마 되지 않은 사람이 우테캠에 합격하고, 진행한 공부들에 대한 글이다. 노력 많이 하셨다..
노력한 점 / 잘한 점 / 아쉬운 점으로 나뉘어져있어서 좋았다.
6월 26일(토) babel-loader와 ts-loader의 빌드 결과가 다른 현상
ts-loader는 핫 모듈 리플레이스먼트(HMR)을 지원하지 않는다. 필수적인건 아니지만 익숙해지면 없는게 불편하다.
babel-loader 바벨 버전7부터는 TS를 지원한다. 다만 ts-loader와 빌드 결과가 좀 다르다.
클래스의 필드가 undefined로 초기화 된다.
6월 27일(일) 서버리스는 서버가 없다?
서버리스는 서버가 없다는 얘기가 아니다. 그런건 불가능하다.
백엔드이지만 직접 서버를 관리하지 않는 경우를 말한다.
하드웨어를 직접 관리하지 않고 외부에 맡기게 된다 (AWS E2, 클라우드)
소프트웨어 또한 직접 관리하지 않고 코드를 서버에서 분석, 함수 단위로 쪼개서 우리가 직접 관리하지 않아도 되는 서버에 올린다 (AWS lambda, 서버리스)
서버리스의 장점
서버리스의 단점
6월 28일(월) 상태관리 라이브러리 mobx
리덕스에 비해 비교적 단순하다
상태(state), 데리베이션(derivation), 액션(action)
상태(state)
데리베이션(derivation)
액션(actions)
원자적 / 동기적 데리베이션
원자적 : 상태 변경 요청이 여러번 오더라도 단 한 번만 반응한다.
동기적 : 모든 데리베이션은 동기적으로 갱신되기에 액션이 상태를 변경하고 곧장 상태값을 조회해도 변경된 값을 보장한다.
계산된 값은 느리게 갱신된다. 계산된 값은 사용되어야만 동작하고, 모든 상태 변화에 반응하는 것은 아니다.
모빅스를 리액트에서 사용하기 위해서 상태 변화에 따라 리액트 렌더 사이클을 돌려주는 역할이 필요하다 (redux의 connect) react-mox 패키지가 그 역할을 한다.
6월 29일(화) HTML5 폼 검증에 대해 정리해 보자
폼은 웹 개발에서 반드시 다루어야할 필수 기술이다.
폼 관련 라이브러리는 브라우저가 자동으로 처리하는 폼 검증 기능을 끄고(novaildate) 사용한다.
input 태그의 속성 required는 브라우저가 해당 폼을 필수 입력으로 인지하고 값을 검증하게 한다.
HTML5 입력 요소는 7가지 검증 속성(validation attributes)을 제공한다.
css의 가상클래스 :valid, :invalid를 통해 규칙에 맞는/맞지 않는 값을 입력했을 경우 해당 input 태그의 css를 컨트롤 할 수 있다.
HTML5 스펙을 따르는 모던 브라우저의 폼 입력 값 처리 프로세스
더 나은 ux/ui를 위해서 js로 오류 메세지를 적절하게 보여주기 (본문 참조)
constraint validation API. 오류 메세지를 요구사항에 맞게 커스터마이징 할 수 있다. (본문 참조)
오류 메세지의 스타일링 또한 커스터마이징 할 수 있다.
6월 30일(수) 패스포트 동작 원리와 인증 구현
로그인으로 등록된 사용자임을 확인하기 위해 노드에는 passport 패키지를 많이 사용한다.
웹 어플리케이션에서 인증을 구현하기 위한 방법으로 세션, 쿠키가 있다.
express를 사용해 로그인 로직을 만들고 MyPassport 클래스도 만드는 글이다. 코드를 복붙해오긴 그러니까 본문을 참조하자
myPassPort 클래스는 미들웨어 함수를 반환하는 메소드를 가지고 있고, 싱글톤 객체를 생성한다.
session 메소드로 세션에 저장된 로그인 정보를 이용해 유저 객체를 찾는다.
로그인에 성공한 유저만 접근할 수 있는 엔드포인트를 만들고 처리한다
로그아웃은 세션에 저장한 데이터를 삭제하면 된다.
passport 라이브러리 사용 방법도 나와있음!
passport 라이브러리는 유저네임/비밀번호를 이용한 인증 뿐 아니라 auth, jwt 인증 등도 가능하다. 공통 인증 로직은 passport가 처리하고 구체적인 방법을 전략{strategies) 이라는 개념으로 분리해 놓았다.
자세한 사용 방법은 본문 참조
7월 1일(목) 파일명 컨벤션과 웹팩/노드 오류
Git, MacOS에서 카멜케이스/파스칼케이스는 가끔 오류를 발생시킨다.
파일명을 fooBar.js에서 FooBar.js로 변경하면 깃이 이 변화를 감지하지 못 한다던가, MacOS에서는 문제 없지만 리눅스 배포환경에서는 문제가 생긴다던가.. (import시)
깃은 대소문자를 무시하기 때문에 대소문자를 변경해도 인지하지 못한다. 파일명 대소문자를 바꾸고 코드에서 해당 모듈을 바뀐 이름으로 찾으려고하면 에러를 발생하는 코드가 된다. not found
MacOS 또한 파일명 대소문자를 무시한다. node에서 require('FooBar.js')든 require('foobar.js')든 상관 없다. 하지만 리눅스 환경에서는 대소문자를 구분하기에 맥에서 동작하던것이 리눅스에서 동작하지 않을 수 있다.
깃의 경우 변경된 파일명을 깃에게 직접 알려주는 방식으로 해결할 수 있다
git mv fooBar.js FooBar
운영체제에 따른 차이(MacOS, 리눅스..)는 처음엔 웹팩 플러그인으로 해결했다. 웹팩을 사용하지 않는 환경에서는 파일 컨벤션을 오해의 소지가 없도록 카멜케이스에서 케밥 케이스로 변경하거나 소문자만 사용하는 방식으로 변경하는게 편하다.
npm의 패키지들을 유심히 살펴보면 모두 케밥케이스를 사용한다. 이런 이유가 있었던 것이다. (아마 대문자가 애초에 막힌 걸로 기억한다.)
7월 2일(금) 컴포넌트의 역할 분리
이 글을 보고 컴포넌트 설계 방식을 많이 참고했다고 한다.
컨테이너는 어떻게 움직이는지 / 프리젠터를 어떻게 보여지는지를 담당한다.
상태가 없는 프리젠터는 재활용이 가능하다.
FooterSaveButton을 컨테이너/프리젠터로 리팩토링하는 예시는 본문 참고
게시판 페이지 예제도 본문에 있다.
익숙해지면 처음부터 컨테이너/프리젠터로 나누겠지만 처음에는 하나의 컴포넌트로 "동작하는 버전"을 만들고 리팩토링한다.
프리젠터는 주로 외부에서 UI 구성에 필요한 상태값만 받아서 JSX를 구성한다. 필요하다면 내부에 넣을 children을 외부에서 받아서 사용한다. 이를 통해 재사용성을 높인다.
동작을 담당하는 컴포넌트(컨테이너)에서 render시 프리젠터 컴포넌트를 호출해서 사용하는 구조이다.
7월 3일(토) 깃(Git) 개념과 상황별 팁
늘 사용하기 어려운 깃, 막상 좀 알겠다 싶으면 모르는 에러가 나오는 깃을 한 번 더 알아보자..
스테이징. 변경사항 중에 저장하고 싶은 부분만 선택해서 임시 저장하는 개념
git status는 "현재 폴더의 변경 상태를 전부"보는 명령어다. 현재 트래킹 중인(add로 스테이징)한 파일도 볼 수 있다.
git commit은 스테이징 상태의 변경 내용을 저장한다.
git commit -am은 git add . git commit -m을 동시에 하는 것과 같다.
커밋을 만들지 않고 이전 커밋에 변경사항을 추가하고 싶다면 git commit --amend
를 사용하자. 깜박하고 하나 수정하거나 할 때 조을 듯
상황별 팁
7월 4일(일) 인터페이스만 사용하다가 클래스를 다시 보았다
TS를 프론트엔드 개발에 적용하면 함수 전달 인자의 타입을 강제할 수 있어서 안정성 있는 코드를 작성하는데 도움이 된다.
interface는 새로운 객체 생성, 폼으로 받은 유저 데이터 검증, XHR 호출시 페이로드에 유저타입 사용 등으로 활용할 수 있다.
하지만 어느 순간부터 인터페이스를 맞췄음에도 불구하고 코드가 눈에 잘 들어오지 않기 시작했다고 한다.
인터페이스로 객체를 만들 때에는 매번 초기값을 설정해야한다. 하지만 클래스는 생성자가 초기화 역할을 대신한다.
클래스의 장점은 관심사가 비슷한 함수를 메소드로 모을 수 있다는 점이다.
7월 5일(월) 구글 코리아 면접후기
결론적으로 구글 면접에서 탈락했지만, 용기와 행동력으로 구글 면접까지 간 경험은 값지고 대단한 것 같다. 영어도 잘하시나보다.. 부럽..
"원서 접수하는데 돈드는건 아니니까!"
구글의 코테는 어떤 느낌일까 글에 나와있ㄴㄴ GOCC india는 처음 들어보고.. 비트연산.. 트리..
구글 면접으로 유명한 창의력을 요구하는 질문이 나오지는 않았다고 한다. 단순히 문제를 빠르게 푸는게 아니라 면접관과 소통하면서 자신의 생각, 논리를 표현하는게 중요하다.
가장 맛있는 타코집 질문 예시는 본문 참조
우테캠에 합격하셔서 함께 활동하게 되었다!
7월 6일(화) HTTP 메소드의 멱등성? 그게 뭔데?
멱등성이란 수학에서 사용하는 용어로, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 뜻한다.
POST를 제외한 GET, PUT, DELETE는 모두 멱등성이 보장되어야 한다
멱등성은 요청의 효과를 보고 판단한다.
안전한 메소드
7월 7일(수) 인터넷은 어떻게 동작하는가?
모든 컴퓨터를 연결하고 어떤 일이 일어나도 연결 상태를 유지할 수 있는 방법을 찾는 방법
무선(이터넷 케이블), 유선(WiFi, Bluetooth)로 연결되어야 한다.
각 컴퓨터가 모두 연결되기보다, 라우터를 통해 좀 더 효율적으로 연결된다.
하나의 라우터보다 라우터에서 라우터로.. 무한히 확장할 수 있다.
아주 먼곳에 케이블을 연결하는건 너무 힘들지만, 이미 전화기 시설은 전세계가 연결되어 있기에 이를 이용하고자 하는데 모뎀이라는 장비가 필요하다. 모뎀은 네트워크 정보 <-> 전화 시설이 처리 가능한 정보로 상호 변경한다.
ISP가 네트워크 - 네트워크를 연결한다.
네트워크에 연결된 모든 컴퓨터는 IP 주소가 존재한다.
IP 주소를 기억하기 어려워 도메인을 사용한다.
인터넷은 '수십억 컴퓨터를 모두 연결하는 기술 인프라'이다.
웹은 그 인프라 기반 위에 구축된 서비스이다.
이메일, IRC 등도 또 다른 서비스이다.
7월 8일(목) 웹페이지, 웹사이트, 웹서버 그리고 검색엔진의 차이는 무엇일까요?
7월 9일(금) 웹 서버란 무엇일까?
이 아티클에서 웹 서버는 HTTP 서버로 국한한다.
하드웨어 측면에서, 웹 서버 소프트웨어와 관련 파일(html, css, js...)을 저장하는 컴퓨터이다. 웹 서버는 인터넷으로 연결된 다른 기기들이 웹 서버의 데이터를 주고 받을 수 있게 한다.
소프트웨어 측면에서, 웹 사용자가 어떻게 호스트 파일들에 접근하는지 관리한다.
HTTP 서버는 URL과 HTTP의 소프트웨어 일부이다.
정적 웹 서버/스택 은 HTTP 서버가 있는 컴퓨터로 구성되어 있다. 서버가 요청된 파일을 요청 브라우저에 전송하기 때문에 '정적'이라 부른다
동적 웹 서버는 정적 웹 서버 + 추가 소프트웨어(대부분 어플리케이션 서버, 데이터베이스)로 구성되어 있다. 요청된 파일을 브라우저에 전송하기 전에, 어플리케이션 서버가 업데이트 하기 때문에 '동적'이라 부른다
웹 서버는 컴포넌트 파일(HTML, CSS, JS, 이미지, 비디오, 폰트 등..)을 저장하고, 제공해야 한다. 그러기 위해
웹 서버는 HTTP를 지원한다.
"정적"은 있는 그대로를 제공하는 것이다
"동적"은 서버가 컨텐츠를 처리하거나, 데이터베이스로부터 컨텐츠를 생성하는 것을 의미한다.
7월 10일(토) 애자일을 대충 알고 있는 당신을 위하여
애자일은 프로젝트를 더 작은 반복 주기로 나누는 소프트웨어 개발 방식이다.
폭포수 모델을 사용한 업부 프로세스의 한 예.. 본문을 참조하자.
스프린트. 애자일은 전체 프로젝트를 마감 기한에 맞춰서 일정한 크기로 더 작게 나눈다. 이를 반복 주기 또는 스프린트라고 부른다.
첫 번째 반복 주기를 "반복 주기 0"이라 하는데, 이 때 스토리를 만든다. 스토리는 프로젝트에 들어갈 기능 목록, 즉 개발자가 개발해야하는 기능이라 보면 된다.
애자일은 폭포수 모델과 달리 요구 사항 분석, 아키텍쳐 수립, 설계, 구현 작업이 끊임없이 반복되어 일어난다.
애자일은 빠르게 나아가는게 아니라 우리가 얼마나 망했는지를 최대한 빨리 아는 것이다.
스프린트는 해당 기간 동안 전력 질주를 해야한다는 의미는 아니다. 평균 1~2주 기간 동안 개발팀이 충분히 해낼 수 있을 정도의 업무를 진행한다.
프로젝트를 마친 뒤 왜 망했는지 반성하고, 다음엔 어떡하면 덜 망할지 분석. 성공했다면 왜? 다음엔 또 어떻게? 마찬가지다. 이를 회고라 하고 KPT는 수 많은 애자일 회고 방법론 중 하나이다.
Try가 가장 중요하다.
7월 11일(일) [번역] 아토믹 웹 디자인 (Atomic Web Design)
아토믹 디자인은 코드스쿼드 진행 중에 들어보기만 하고, 다른 팀이 사용해보았다는 얘기만 들었다. 직접 해본적도 없고, 제대로 알아 본적도 없었으니 이번기회에 슬쩍 알아보자
아토믹 디자인은
디자인 시스템을 만드는 방법론으로, 다섯 가지 수준이 존재한다. Atoms, Molecules, Organisms, Templates, Pages
Atoms
Molecules
Organisms
Templates
Pages
7월 12일(월) AJAX의 모든 것
AJAX
formData
, serializeObject
를 사용한다. XML
XMLHttpRequest(XHR)
JSON
7월 13일(화) 모던 웹 브라우저 - 크롬 브라우저 뜯어보기
<br/>
7월 14일(수) 왜 비동기적 프로그래밍을 해야하는가?
JS는 싱글 스레드 언어이기에 한 번에 한 가지 일만 할 수 있으며, 그 일이 무겁고 오래걸리면 뒤의 일을 실행할 수 없다. 이를 Blocking 되었다고 한다.
현대 웹 페이지를 보다 유동적으로, 효율적으로 움직이기 위해 비동기 프로그래밍이 필요하다
비동기 프로그래밍을 위한 JS의 방법들
Promise, then, catch 모두 Promise를 반환한다.
async / await
7월 15일(목) 좋은 커밋을 작성하는 법
커밋 메세지를 잘 작성한다면
좋은 커밋을 작성하는 법
7월 16일(금) [Javascript] 비동기 개념 학습
7월 17일(토) [Web] HTTP 개념 학습
Application Layer
프로토콜이다.2-tier
아키텍처, 클라이언트-서버 아키텍처라고 한다.3-tier
아키텍처라고 한다. URL
Uniform Resource Locatorhttps
같은 통신 방식 Scheme
, velog.ig
같은 웹 서버의 이름, 도메인, IP Hosts
, @jjunyjjuny
같은 웹 서버 / 도메인에서 해당 리소스까지의 경로 URL-Path
로 구분된다.URI
Uniform Resource IdentifierURL
+ query
, bookmark
등을 포함한다.DNS
Domain Name System7월 18일(일) [MySQL] MySQL 사용법
최근 백엔드 개발도 해야하다보니 백엔드 지식의 부재를 체감하고 있다. 당장 필요한 지식을 습득해보자 ..
음 딱히 옮겨적을 건 없고 북마크해두고 두고두고 보자. 여러 경우에 맞는 쿼리문이 적혀있어서 도움이 되는거 같다. 각각의 키워드에 대해서는 좀 더 검색해봐야 겠지만?
7월 19일 (월) Package.json과 Package-lock.json의 차이를 아시나요?
node 환경에서 협업하다보면 모듈 버전 차이로 문제가 발생할 수 있다.
팀원끼리 사용하는 모듈 버전이 다르다면
이럴 수 있지만 효율이 떨어진다.
package-lock.json
은 node_modules
또는 package.json
이 수정될 때 자동으로 생성된다.
package-lock.json
이 존재하면 npm install시 우선적으로 package-lock.json
을 사용해서 node_modules
를 생성한다.
package.json
에 정확한 버전명을 명시하지 않은 이유는 해당 패키지의 중요한 버그 수정이 이루어질 때마다 package.json
의 버전도 바꿔줘야 하기 때문이다. package.json
의 version range
는 이런 경우를 방지하기 위해 사용해야한다.
7월 20일 (화) Get과 Post의 차이를 아시나요?
TL;DR 이라는 걸 이전에도 봤다가 까먹었는데 too long did` read. 너무 길어서 안 읽었음/읽지마
대충 요런 뜻인가보다
GET/POST의 가장 큰 차이는 서버의 상태를 바꾸는가
. 즉, 멱등성 유무라고 할 수 있다.
멱등성이란 연산을 몇 번 하든 결과가 달라지지 않는 성질
이다. 순수함수같은 개념
GET은 읽기/검색 등 정보 요청을 서버로부터 요청하기
POST는 리소스 생성/업데이트를 위해 서버에 데이터 보내기
Content-Type
으로 바디의 타입 지정7월 21일 (수) "Modal"에 관한 간단한 고찰
스크린은 두 종류만 존재한다. Modal, Non-Modal
대부분의 Modal 스크린은 쉽게 식별 가능. Main Window를 덮기 때문에
모바일은 스크린 크기가 제한적이라 모달이 모든 화면을 잡아먹어서, Non-Modal과 차이가 없어짐
가장 큰 차이점은 유저 - 스크린이어떻게 상호작용하느냐
Non-Modal의 가장 뚜렷한 시각적 구별은 네비게이션의 표시여부 앞뒤 이동
Modal은 취소, 닫기, 확인 등
모달은 사용자의 각각의 단일 작업에 집중하게 한다.
모달은 닫기
가 중요하다.
7월 22일 (목) 스크롤은 부드럽게, 글자에는 이미지를 넣어보자!
scroll-behavior
을 사용한 부드러운 스크롤
background-clip
글자에 이미지 넣기
신박한 애니메이션이다. a태그로 특정 돔 id로 이동하되, scroll-hebavior : smooth
를 사용해서 한 번에 뚝 이동하는게 아니라 transition을 적용한 것과 같은 동작을 하게 만들었다!
transparent
부모값을 상속하는 그런 느낌의 이름 같지만. 투명한
이라는 뜻의 단어일 뿐..
글자 투명, 배경에 이미지 적용, 텍스트에 이미지 적용 background-clip : text
7월 23일 (금) RESTful API를 알아봅시다
API는 Application Programming Intergace. 소프트웨어 프로그램 내부에 존재하는 기능 및 규칙의 집합
커뮤니케이션 계약이라 볼 수 있음.
웹 개발에서 개발자가 어플리케이션을 통해 웹 브라우저(어플리케이션)와 상호작용 하기 위한 코드(web API, DOM API 같은 것들), 사용자 컴퓨터내 소프트웨어/하드웨어/서드파티 웹사이트 등의 집합을 뜻함
API는
REST는
URL
을 통해 자원(Resource)
명시HTTP Mehhod
를 통해 자원에 대한 CRUD Operation
적용REST의 특징
Last-Modified
, E-Tag
를 사용한 캐싱이 가능하다.장단점. 너무 받아쓰기 같다. 본문을 다시 보자...
7월 24일 (토) deploy 브랜치 전략 활용 방법
당근마켓의 브랜치 전략
이전에는 작업 후 테스트한 코드를 develop 브랜치에 merge, 서비스 배포시 develop 브랜치를 master 브랜치에 merge 하는 방식을 사용함.
규모가 커지고 다양한 기능 개발을 동시에 진행하다보니 브랜치 전략이 필요해짐
master / develop / feature / release / hotfix 5개 브랜치로 나눔
master : stable한 코드여야한다. 바로 배포가 가능하게!
develop : release와 featuredml base가 되는 브랜치. deplay-ready 상태. develop에 들어오는 코드는 테스트가 완료되고 언제든 배포해도 되는 코드
feature : 작업 브랜치. develop을 기준으로
release : 배포가 나갈 때 생성하는 브랜치. develop으로부터 생성. 배포/모니터링이 끝나면 develop, master로 merge한다
hotfix : master에 release가 merge된 후 문제가 발생했을 경우 master를 기준으로 생성해서 문제를 해결하고 develop, matser로 merge한다
당근은 release, hotfix는 사용 안 했다.
각 feature마다 서버가 있다면 문제 없지만 보통은 다른 사람의 테스트를 기다려야하는 문제 발생
deploy 브랜치 전략. gitflow와 비슷하지만 테스트 서버 배포를 위한 전용 브랜치를 이용한다 (deplay/{month})
결국은 dev같은 feature 통합 브랜치를 하나 더 파서 거기서 테스트한다는거 같은데..
7월 25일 (일) 하루에 1000번 배포하는 조직 되기
뱅크 셀러드의 배포 시스템
Background
이전 (Old Process)
뱅크셀러드 새로운 배포 시스템
squash and merge
사용lint
검사, test
테스트, build
docker image 빌드. 이 세과정을 통과하지 못 한 commit은 merge될 수 없음개발 조직에서 배포 횟수는 비즈니스 요구를 충족시키는 역량과 비례한다.
배포는 자신감있고 자연스럽게 이루어져야한다.
7월 26일 (월) 개발자도 알면 좋은 UI 디자인
초기 디자인이란 페이지에 들어갈 기능을 모두 정의하는 것을 의미한다.
초기 디자인은 목업과 와이어 프레임으로. 아이콘 같은 구체적인 것까지 할 필요 없다
빠르게 만들고 빠르게 문제를 마주하자
폰트, 컬러, border-radius 등으로 디자인 컨셉을 잡는다
디자인 시스템으로 선택지를 어느정도 제한한다.
디자인 시스템으로 미리 지정해둘만한 요소
7월 27일 (화) git rebase를 이해하기
언제나 할 때마다 좀 햇갈리는 rebase... 복습해보자..
git remote -v
로 원격 저장소 확인
git remote add upstream ${주소}
git fetch upstream ${target branch}
git rebase upstream/${target branch}
git push origin master
이 순서가 맞지만 사실... 충돌이 안 날 수가 없지..
-i
옵션을 넣으면 interactive
모드로 rebase의 동작을 잘게 쪼개서 실행한다고 보면 된다. 되돌아갈 시점을 선택할 수 있다.
git rebase -i --root
후 돌아갈 시점의 pick을 edit으로 변경
git commit --amend -m "커밋 메세지 변경"
git rebase --continue
돌렸던 시간 원상 복구
이러고 push를 하면 에러가 발생하곤 하는데, 이는 base가 변경되었을 때 발생한다.
7월 28일 (수) HTTPS에 대해 알아야 할 것들
ssl 인증서 구매해서 서버에 설치하는 것 뿐 아니라 작동 방식을 알고 적절히 사용하자는 취지
HTTPS로 가야하는 이유
HTTP
HTTPS
TLS 핸드셰이크 프로토콜
TLS 핸드 셰이크 resumption
SSL 취약점 역사? 본문 확인
7월 29일 (목) HTTP/3는 왜 UDP를 선택한 것일까?
1, 2와 다르게 TCP가 아닌 UDP 기반 프로토콜 QUIC를 사용한다.
HTTP와 같은 프로토콜은 규약이기 때문에 언어, 프레임워크와 달리 소프트웨어 제조사 간 합을 맞추는 기간이 필요하다. 그런데 2가 나온지 4년만에 3가 나오다니?
TCP / UDP
TCP는 3 Way Handshake라서 느리다 (자세한 내용 본문)
HTTP3부터는 UDP를 사용하며 이 핸드쉐이크 과정을 날리고 다른 방법으로 신뢰성을 확보한다
HOLB(Hand Of Line Blocking)
UDP (User Datagram Protocol)
커스터마이징에 용이함
HTTP/3가 UDP를 사용해서 나아진 점
7월 30일 (금) 만화로 보는 DNS over HTTPS
DoH(DNS over HTTPS). DNS의 데이터 노출 문제를 종식시키기 위해 새롭게 제안하고 있는 기능
HTTP 요청이 클라이언트 - 서버로 지나갈 때 여러 경로를 지나는데 요청 전에 그 경로를 알 수 없고, 경로 중간에 꺼내보거나 응답 내용을 바꿀 수도 있다.
이 문제를 해결하기위해 HTTPS가 등장. 모든 메세지에 자물쇠를 건다.
자물쇠를 여는 비밀번호는 브라우저와 서버만 알고 있다.
데이터 노출은 서버와 커넥션을 맺는 단계에서 일어난다.
도메인 네임 입력시, resolver(리졸버)는 IP주소를 찾아 준다.
Root DNS에 톱레벨 도메인 묻기 / 톱레벨 도메인 네임 서버 / 해당 주소의 네임 서버 (authoritative server) /
이렇게 찾은 IP를 운영체제(OS)에 전달
OS는 기본적으로 네트워크가 알려주는 리졸버를 사용한다
DNS 요청시 방문하는 각 서버는 우리가 어떤 사이트를 찾는지 알 수 있고 그 경로에 있는 서버도 알 수 있다. 이 정보로 우리가 누군지 알 수 있다.
트래킹(tracking)과 스푸핑(spoofing)
트래킹 : DNS서버와 경로 서버(라우터)가 내 정보와 내가 요청한 사이트에 대한 정보를 수집함
스푸핑 : 우리와 DNS 사이의 누군가가 DNS의 응답을 변경하는 것. 웹사이트 방문을 막거나 스캠 웹사이트를 보여줄 수 있다.
문제 정리
TRR(Trusted Recursive Resolver)를 사용한다.
DoH를 사용함으로써 경로 상에서의 도청을 방지한다.
최소한의 데이터만 전송해서 사용자를 식별하지 못하게 한다.
TRR, DoH를 쓴다 해도 데이터 유출 위험은 있다.
7월 31일 (토) 로우 레벨로 살펴보는 Node.js 이벤트 루프
pending_queue
에 들어있는 콜백 실행8월 1일 (일) [JWT] 토큰(Token) 기반 인증에 대한 소개
토큰 기반 인증 시스템을 선택하는 이유
서버 기반 인증
토큰 기반 인증
토큰 기반 시스템 구현 방식(일반적으로)
확장성! 세션은 그 세션을 가지고 있는 서버에만 요청해야하지만 토큰은 디코딩 방식만 가지고 있으면 어느 서버든 상관없다.
쿠키보다 더 보안성 좋음
서버 확장 뿐 아니라 로그인 정보가 사용되는 분야 또한 확장 가증하다.
디바이스/도메인 상관 없이 토큰만 유효하면 되니까 cors를 모두 허용해도 된다.
jwt는 웹표준이다.
8월 2일 (월) 백엔드가 이정도는 해줘야 함 - 1. 컨텐츠의 동기와 개요
이 시리즈를 작성하기 전 필자가 과거에 어떤 식으로 개발했는지, 그렇기에 어떻게 작성해나갈 건지 안내(?)하는 글
물리 서버를 한 대만 둔 것에 대한 문제, 테스트 코드 없는 서버 운영의 문제, 협업 과정의 문제, log가 없다면 서버 에러를 인지할 수 없다, 쿼리문 등..
백엔드를 조금이라도 해봤다면 아래와 같은 내용 정도는 쉽게 진행하겠지만..
그렇지 않다면 뭐가 필요한지조차 깨달을 경로가 적다
8월 3일 (화) 프론트엔드 개발자와 UX
UX란 사용자가 원하는 것을 미리 파악하고 대응하여 사용자가 원하는 서비스를 만드는 일
UX는 디자이너에 종속된 개념이 아니라 서비스를 만드는 모든 직군에게 통용되는 개념이다
프론트엔드 개발자의 UX
사용자는 급하고, 사이트는 빨라야한다
8월 4일 (수) 클라이언트의 사용자 중심 예외 처리
예상 가능한 에러
예상 불가능한 에러
사용자가 에러 상황을 이해하고 해결 가능한 에러
사용자가 에러 상황을 알아도 해결 불가능한 에러
예상 x / 해결 o
예상 x / 해결 x
예상 o / 해결 x
예상 o / 해결 o
에러는 최대한 작은 범위에서 catch해야한다. (에러 전파 방지)
10개 중 하나만 에러가 났는데 전체가 에러 화면을 보이면 사용자 경험을 해친다
8월 5일 (목) 데이터 검증 (Data Validation)은 언제, 얼마나 해야 할까?
의견 1
의견 2
의견 3
데이터는 어디서든 검증될 수 있다.
목적과 대상 사용자에 따라서 구분하여 검증하자
브라우저 단계
API 인터페이스, 컨트롤러, 라우팅 단계
비즈니스 로직 단계
Database
8월 6일 (금) 세션 기반 인증 방식과 토큰 기반 인증(JWT)
세션 기반 인증은 토큰 기반 인증이 없던 방식이다. (서버 세션 사용)
JWT : 필요한 정보를 토큰 body에 저장해서 클라이언트가 가지고 있다가 증명서처럼 사용
header.payload.signature
로 구성access 토큰 만료시 refresh 토큰을 사용해서 재발급 받는다
JWT를 스토리지 / 쿠키 어디에 저장할까
스토리지는 XSS에 약하고 CSRF에 강하다
쿠키는 반대로 CSRF에 약하고 XSS에 강하다
CSURF로 예방이 가능하고, secure, httpOnly 옵션등으로 추가적인 보안이 가능하므로 쿠키를 사용하는게 권장된다
8월 7일 (토) 한글은 노토산스, 영문/숫자는 다른 폰트로 해주세요...👀 (feat. unicode)
어떤 원리로 font가 분리되어서 적용되는지에 대한 아티클
CSS문(CSS statement)은 At-rules / 중첩문 Nested statements(그 안에 Rulesets)로 구성된다
Rulesets은 우리가 흔히 사용하는 선택자에 의해 기술된 조건을 연결짓는 규칙집합이다
At-Rule은 @
로 시작해서 statement의 마지막에(블록 다음) ;가 오거나 다음 블록의 끝까지 계속 실별자가 뒤따른다
@charset
, @import
)@media
, @document
)@font-face
)중첩 문은 조건부 그룹 규칙의 특정 부분집합에서 사용될 수 있는 문이다
@media
는 브라우저가 돌아가는 장치가 표현된 조건과 일치하는 경우에만 동작@document
는 현재 페이지가 일부 조건과 일치하는 경우에만 적용 (아직 실험 단계)@font-face
: 사용자 정의 글꼴 지정
url()
로 글꼴 리소스를 다운로드해서 사용url()
과 local()
을 함께 사용하는게 일반적 local()
우선, 없으면 url()
본제로 돌아와서 css에 정의된 글꼴정보가 글자에 적용될 시점에, 특정 문자는 필터하면서 적용되길 바란다면
@font-face
블록 내부에서 선언@font-face
의 속성 중 unicode-range
사용unicode-range
로 숫자, 영문, 특수문자의 범위를 알아내서 해당 범위에 다른 폰트를 지정한다유니코드 : 전 세계 모든 문자를 컴퓨터에서 일관되게 표현, 다루도록 설계된 산업 표준
실제 @font-face
에서 적용하는 방법은 본문 참고
다르게 적용할 문자마다 css를 적용하는게 아닌 동일한 font-family
이름으로 하되 url
을 달리할 폰트로 바꾸고 unicode-range
를 적용하는 또 하나의 @font-face
를 만들면 된다.
8월 8일 (일) 브라우저 쿠키와 SameSite 속성
Set-Cookie
헤더가 포함되면 normal
이라는 이름의 쿠키에 yes
라는 값이 저장된다.Domain
속성에 해당 쿠키가 유효한 사이트를 지정할 수 있다. 지정하지 않으면 기본적으로 쿠키를 보낸 서버의 도메인으로 설정된다.First-party cookie
와 Third-party cookie
로 나눈다.Referer
헤더와 쿠키에 설정된 도메인이 다른 쿠키None
, Lax
, Strict
세 종류의 쿠키 정책이 있다.None
은 SameSite
쿠키 이전과 동일하다. 서드 파티 쿠키도 전송함. Lax
는 중간 보안 정책으로 대체로 서드 파티 쿠키는 전송되지 않지만 몇 가지 예외적인 요청에는 전송된다.Strict
는 가장 보수적인 정책으로 Cross-site 요청에는 서드 파티 쿠키를 전송하지 않고, 오직 퍼스트 파티 쿠키만 전송한다.a
링크 태그 클릭window.location.replace
등 자동으로 이뤄지는 이동302
리다이랙트Samesite
속성으로 None
을 사용하려면 해당 쿠키는 반드시 Secure
쿠키여야 한다. 즉 HTTPS
가 적용된 요청이어야 한다. 8월 9일 (월) 실시간으로 깃허브 알림 받기, Gitify 2주간 사용기
깃허브에서 풀리퀘 댓글이나 멘션 언급, 코드리뷰 추가 커밋 등의 실시간 알림을 해주는 오픈소스 프로그램에 관한 이야기
가볍게 읽었는데 참여한 프로젝트가 적다면 괜찮을거 같다. 프로젝트마다 설정할 수도 있고.. 아니면 오히려 퇴근후에.. 알림울리면 불-편 하려나..?
깃허브 모바일에서도 알림이 가능하다는데 아직 사용 안 해보았다.
8월 10일 (화) 5년차 프론트엔드 개발자 이직 후기
경력 이직 후기이긴 하지만, 벨로그 상단에 아주 눈에 띄게 있어서 읽어보았다. 다양한 회사 면접 후기와 질문들을 추려서 작성해주셨다.
나는 약 한달 후에 전환 면접을 볼텐데 면접 경험이 없어서 걱정이 된다..
기술질문에서 트러블 슈팅 경험 외에는 다 어느정도는? 대답할 수있는??(정말?) 질문이다. 즉 와 이런걸 물어봐? 같은 내용은 없지만 어떻게 대답하느냐가 중요하겠지?
면접은 실력도 중요하지만 타이밍도 중요하다
8월 11일 (수) [면접]백엔드와 밀접한 네트워크 용어 정리
자세한 글은 아니라서.. 오늘은 가볍게 읽는 것으로 !
8월 12일 (목) 짧게 써보는 웹 프론트엔드의 역사
HTML / CSS / PHP,ASP,JSP / ajax(XMLHttpRequest) / jQuery
angular.js 상태기반 양방향 바인딩! 그려져야할 모양을 우선 선언해두고 데이터만 바꿔주면 된다!
데이터가 변경되었는지 어떻게 알아내는가가 react, vue, angluar, svelte간의 결정적 차이를 만들어낸다.
Angular는 막무가내로 주기적으로 계속 확인한다
React. 컴포넌트 단위 개발!
Angular
Vue
Svelte
8월 13일 (금) [CS] 운영 체제 개념 학습
운영체제 : 시스템 자원, 응용 프로그램을 관리하며 하드웨어가 원활히 작동하도록 시키는 주체
운영체제는 응용 프로그램이 실행되면 시스템 자원을 활용할 수 있는 권한/사용자를 관리한다. 모든 사용자가 시스템 자원에 접근하면 문제가 발생하니까
권한을 받은 응용 프로그램은 운영체제가 제공하는 기능, 시스템 콜(System Call) 을 사용할 수 있다.
시스템 콜은 응용 프로그램이 시스템 자원을 사용할 수 있도록 운영체제가 제공하는 인터페이스이다.(API)
프로세스 : 운영체제에서 실행 중인 하나의 어플리케이션(프로그램)
스레드 : 프로세스 내에 존재하며 하나의 작업을 실행하기 위해 순차적으로 실행한 코드의 이어짐
멀리 프로세스 / 멀티 스레드
시분할
8월 14일 (토) [week2] CSR vs SSR 누가 더 좋아?
CSR : 최초 한 번 서버에서 필요한 정적 데이터를 모두 받아서 페이지를 로딩하고 이후에는 JS를 이용해 추가 데이터를 받아서 클라이언트 단에서 렌더링하는 방식
SPA : CSR방식으로 페이지 Reload
없이 서버로부터 필요한 데이터만 받아와서 화면을 갱신한다.
SSR : 서버에서 필요한 데이터를 모아 HTML파일을 만들어서 동적 제어 소스코드(JS)와 함께 클라이언트에 제공
8월 15일 (일) 애니메이션에서 불필요한 속성 하나가 브라우저 렌더링 성능에 끼치는 영향
크롬 개발자 도구 perfomance에서 Start profiling and reload page
를 통해 성능을 측정한다.
Loading / Scripting / Rendering / Painting 시간을 측정한다
Idle, System 시간은 제외
애니메이션 갯수를 대폭 늘려서 실험한 결과 오히려 Rendering 시간이 늘어났다는데 그 이유에 대해서는 언급되지 않았다
그럼에도 약 2~30%의 성능 개선을 이룸. (border-radius 속성을 없앤 것만으로)
LightHouse로 performance report 받기.
layout, paint, composition을 다시 트리거하는 CSS 속성을 주의하자
8월 16일 (월) [TIL] git merge vs git rebase
merge는 3-way-merge로 각각 다른 브랜치를 병합한다.
3-way-merge는 각 브랜치의 마지막 커밋 2개 / 베이스의 커밋을 이용해서 병합하는 방법이다
만일 base가 없다면 비교 대상이 없어서 커밋을 결정할 수 없다.
git rebase -i
에서 -i 명령어는 필요한 커밋만 남겨서 새로운 커밋을 만들 수 있는 명령어다
-i 명령어로 실행시 vi 편집기 상단에 있을 수록 오래된 커밋이다.
pick을 s로 바꿔주면 스쿼시 커밋이 된다.
오래된 커밋을 중심으로 새로운 커밋을 만들어야한다. 중간의 커밋부터 하면 이전 커밋이 무시되어 그 이력이 소실된다
8월 17일 (화) [리액트 문서 읽기 1] - 엘리먼트와 렌더링
리액트 엘리먼트는 리액트 앱의 가장 작은 단위
엘리먼트는 type, props, children을 받는다.
엘리먼트는 ReactDOM.render에 의해 실제로 렌더링된다.
diffing 알고리즘
8월 18일 (수) 썸네일 메이커(Thumbnail Maker) 만들기 | Toy Project
선택지를 줄여 사용자의 고민을 덜어주는 것. 좋다.
HTML2CANVAS - HTML내 특정 DOM 요소의 영역 캡쳐, 이미지 포맷으로 출력, 저장하는 라이브러리
목표를 정하고 필요한 기능을 정의해서 진행한 모습이 좋다.
CORS 문제나 의견을 받아 지속적으로 개선하는 모습도! 개인 프로젝트로 간단하지만 굳굳..
8월 19일 (목) [week1] Web Storage? 무엇을 저장해?
쿠키의 단점. 매 HTTP 요청마다 쿠키를 담아 보내고 받는 것은 상당한 트래픽을 발생시킴 / 보안 이슈
이를 해결하기 위해 세션 등장
쿠키의 문제점 보완 및 사용자 인증 가능
web storage의 용량은 약 5mb! 쿠키는 4kb ...
web storage는 key-value / 쿠키는 string
그러나 web storage는 보안 문제, 과도한 지속성 등의 문제로 지양하게 됨
Service worker가 제공하는 cache storage API / indexedDB 등의 대안!
사실 나는 http only 쿠키를 주로 사용한다.
8월 20일 (금) 뱅크샐러드는 어떻게 레거시 서비스를 박살 내는가
빠른 성장에 집중해서 미진한 복잡도 제어 대처
핵심 비즈니스 로직이 거대한 모놀리식(monolithic) 서버가 됨. 추가/수정하기 어려움
더 심각한 문제는 이 레거시 서비스의 비즈니스 로직을 정확히 하는 사람이 없다는 것
이 거대한 레거시 서비스를 분해(decomposition)하는 방법 채택
내가 확실히 알고 있는 무언가로부터 시작 우리 조직
콘웨이의 법칙. 소프트웨어의 구조는 이 소프르웨어를 만들어낸 조직의 커뮤니케니션 구조를 따른다.
뱅크샐러드는 '스쿼드'체계로 움직임.
프로젝트의 복잡도 제어 문제 단순화(레거시-신규 응답 일치 측정) / 목표가 아닌 것을 분명히해서 원칙에 집중 / 매일 필요하다면 두시간에 한 번씩 만나 자주 상황 공유
섀도잉. 같은 요청에 대해 기존 서비스와 새로운 서비스의 응답이 일치하는지 비교하는 방법 => 키바나(kibaba) 사용. 사람 대신 기계에게 비교를 맡긴다
테크 스펙 문서를 분명하게 작성해서 해야할 일 / 하지 않아도 될 일을 명확히 구분
장애없이 레거시 서비스를 빠르게 분해하는 것이 목표
매일 15씩 스탠드업 미팅. 어제 한 일 / 오늘 할 일 / 일처리에 겪는 어려움 등
8월 21일 (토) 주소 인식을 위한 삽질의 기록
안전을 위해선 무엇이든 한다! 그게 삽질이라도
당근 마켓은 중고거래 사기의 발생을 방지하기 위해 택배거래보다 직거래를 권장하며, 직거래 또한 공공장소에서 하길 권한다. 이 때문에 채팅 중 주소와 관련된 채팅을 인식해서 관련 안내메세지를 띄우는게 중요하다고 판단하는 듯 하다
정규식을 도입하면 간단하지만, 결국 엣지케이스가 발생한다.
도로명 주소 관련 자체 데이터도 없고, 오픈 API도 별다른게 없었다. 정부 도로명주소 사이트에서 하나하나 다운 받아서 합치는 수작업을 거침.
구글 스프레드 시트로 옮기고 csv로 받아서 스크립트로 검증
아직도 해야할 일이 많다!
8월 22일 (일) 프로세스와 스레드의 차이
파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 상태
프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위. 프로그램이 메모리에 올라가 있는 상태
스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위. 프로세스에서 자원을 서로 공유한다.
운영체제 관점에서는 프로세스가 최소 작업 단위이며, CPU 입장에서는 스레드가 최소 작업 단위이다.
멀티테스킹은 하나의 운영체제, 여러 프로세스 / 멀티스레드는 하나의 프로세스, 여러 스레드
멀티스레드에서 가장 중요하게 고려할 사항은 바로 동기화이다. 자원을 공유하다보니 발생할 수 있는 문제
8월 23일 (월) 프론트엔드와 백엔드가 소통하는 엔드포인트, RESTful API
사용자가 엔드포인트와 메소드만 봐도 API에게 기대하는 동작/서버에서 실제 수행하는 동작이 명확하게 일치해야한다.
클라이언트-서버가 API 통신을 통해 주고 받는 것들은 리소스 그 자체가 아니라 서버가 데이터베이스에 저장된 원본 데이터의 현재 상태를 JSON으로 표현한 것이다. REST의 REpresentational state!
원본 리소스는 데이터베이스에 하나의 row로 존재하지만, 이것 자체를 전달해주는게 아닌 표현데이터를 전달해 주는 것이다!
URI에 복수형을 쓰는 이유는 해당 리소스가 특정한 하나의 객체가 아니기 때문이다. user(x) users(o)
결국 우리가 고민해야 할 문제는 특정 유저의 프로필 사진이라는 리소스를 포함하는 상위 계층 리소스가 “유저가 더 명확하냐”, “프로필 사진이 더 명확하냐”인 것이다.
URI에는 행위가 표현되면 안 된다. HTTP Method로 행위를 표현하자
PUT은 수정으로 오해하기도 하지만 실제로는 해당 리소스를 요청 바디에 담긴 것으로 대체하는 것이다.
일부 수정은 PATCH로한다.
하지만 진짜 중요한 차이는 PUT은 멱등성을 보장하지만 PATCH는 멱등성을 보장하지 않을 수도 있다는 것이다
멱등성이란 어떤 대상에 같은 연산을 해도 결과가 달라지지 않는 성질이다.
엔드포인트만 봐도 어떤 동작을 하는 API인지 바로 이해할 수 있을 정도로 명확한 API가 가장 좋은 API라고 생각한다.
8월 24일 (화) 주니어, 미드레벨과 시니어 개발자의 차이점
디자인패턴/아키텍처/테스트자동화/성능/보안 등.. 명백하게 시니어가 더 많이 안다.
코드는 컴퓨터와 커뮤니케이션하는 것같지만, 사실은 앞으로 작업하게 될 다른 개발자들이 이해할 수 있는 코드여야한다. 이전 코드를 본적없는 사람이 새로운 기능 추가 / 버그 수정이 가능해야 함!
주니어는 코드를 자주 동작시킨다. 동작하는 소프트웨어 === 좋은 소프트웨어라고 여긴다.
주니어는 간단한 코드보다 멋진 코드를 작성한다. 복잡한 추상화..
시니어는 유지보수/확장성을 염두한다.
주니어는 경험이 없기에 미드레벨이 되기 위해서는 전체 개발 과정을 최소한 두 번 반복해야한다
디버깅/모범사례를 통한 아키텍처,성능,보안에 대해서 공부해야한다
시니어는 무엇을 자르고, 어떤 것은 자르면 안 되는지 알고 있다.. 아무도 모르는 작업을 할 수 있어야 한다.
8월 25일 (수) 지라를 활용해 결혼 준비하며 배운 것
결혼을 ..? 뭐로 관리한다고..?
지라를 사용할 때 가장 먼저 해야하는 일은 티켓을 만드는 것
가급적 미리 한 번에 만들어서 모두 백로그로 만들어두는게 이상적
다만 진행하다보면 예측하지 못 한 이슈가 발생. 이 예측이 가장 중요하고 어렵다
지라는 의존성(무슨 일이 먼저 수행되어야하는지, 태스크 간 관계)을 표시/시각화하는 데 탁월하다.
지라 티켓은 담당자와 협업자 항목이 있다.
정기적으로 멈춰서 우리가 맞는 방향으로 가고 있는지 확인해야한다.
8월 26일 (목) 새 버전에 맞게 git checkout 대신 switch/restore 사용하기
switch
, restore
가 checkout
을 대신하면서 git --help
에도 checkout
이 나오지 않는다!
checkout
이 대체된 이유는 하나의 명령어임에도 기능이 많아서이다
switch
: 브랜치를 변경하기만 함. 브랜치 생성/이동을 동시에 하는 옵션은 -c
이다
restore
: 워킹 트리의 파일을 복원한다.
git checkout -- {filename}
대신 git restore {filename}
git add
로 stage에 넣은 내용을 빼려면 git reset HEAD {filename}
=> git restore --staged {filename}
8월 27일 (금) 우리는 코드 리뷰를 잘하고 있을까요?
개발자 많아짐 => 커뮤니케이션 비용 증가 => 생산성 저하. 릴리즈를 거듭할 수록 소프트웨어는 거대해진다.
거대한 소프트웨어는 아키텍처/코드/설계가 좋아야 생산성이 유지된다.
코드리뷰는 새로운 기능이 버그 없이 의도대로 동작하는가 / 아키텍처를 잘 따른는가 / 다른 사람이 읽는데 문제 없는가 / 올바르게 설계 되었는가
피드백을 주고 받으며 팀 전체 성장
코드리뷰 기법
코드리뷰는 문화다.
8월 28일 (토) V8 엔진은 어떻게 내 코드를 실행하는 걸까?
V8 작동 원리
parser
에서 분석 후 AST(Abstract Syntax Tree)
로 변환Ignition
인터프리터로 전송해서 JS를 바이트코드
로 변환바이트 코드
로 변환함으로써 다시 파싱할 필요 없고, 코드양 줄고, 코드 실행 메모리도 절약한다 TurboFan
으로 보내져서 최적화
된 코드로 다시 컴파일 된다. 사용이 덜 되면 다시 해제되기도 함Parsing. 컴퓨터가 분석하기 쉬운 형태인 추상 구문 트리(AST)로 변경하는 작업
Ignition. 고급 언어 소스코드를 가상머신이 쉽게 읽을 수 있도록 중간 코드로 컴파일한다
레지스터(Register). CPU가 가지고 있는 고속 메모리
누산기(Accumulator) 계산한 중간 결과를 저장하는 레지스터
TurboFan. 최적화 담당
8월 29일 (일) prettier 2.0에서 달라진 옵션 살펴보기
이제 Node 10버전 이전에서 지원 안 됨.
.prettirerc 파일이 overried 가능해짐
trailingComma default가 none => es5
arrowparens defualt가 avoid => always (화살표 함수 단일 파라미터에 괄호를 붙일지 말지)
endOfLine defualt auto => if
prettier.geetSupportInfo의 version 파라미터 삭제
options/option 제거
prettier.util API 추가
search 결과 캐싱
8월 30일 (월) 어서 와, SSR은 처음이지? - 도입 편
네이버 블로그 모바일 서비스가 어떻게 Node.js 기반 SSR로 전환을 결정했는지.
SSR은 모든 데이터가 매핑된 서비스 페이지를 클라이언트에 바로 보여줄 수 있다.
SEO도 장점!
SPA로 전환하면서 프론트/백 영역 구분이 필요했다. angular 사용
FULL STACK을 지향했으나 프론트의 생태계 빠르게 변화하면서 어려워졌다
네이버 블로그는 사용자가 방문하는 블로그 세션 / 네이버 검색, 메인을 통해 노출되는 블로그 글 영역으로 구분 됨
CSR만 지원하는 angular로는 콘텐츠를 빠르게 소비하는 사용자 요구 사항을 충족시킬수 없었다. 네트워크 상황이 좋지 않다면 사용자는 글을 보기 전 상당 시간 흰 화면을 봐야할 수도 있다
CSR의 문제를 해결할 수 있는 렌더링 기법도 있지만 React 기반 SSR을 하는걸 채택.
8월 31일 (화) 어서 와, SSR은 처음이지? - 개발 편
레거시를 한 번에 다른 환경으로 옮겨 오픈하는 건 개발 기간도 오래 걸리고, 리스크 관리 측면에서도 위험하다. 특히 24시간 사용되는 서비스라면 더욱
점진적으로 오픈,확인,경험을 쌓는 방법.
점진적 배포를 위한 방법 => URL 단위의 배포 => reverse proxy 구조
사용자의 요청이 프록시 서버 => 웹서버 => 처리한 응답을 다시 프록시 서버를 통해 클라이언트로 전달
reverse proxy가 Node.js SSR로 전환이 완료된 페이지의 요청인지, 아닌지 구분해서 서빙한다
URL 단위로 개발하려면 URL이 존재하지 않는 공통 영역에 대한 준비를 먼저 해야한다. 예를 들어 상단 메뉴나 헤더 등등.. URL과 상관없는 공통 컴포넌트 같은 것들
Node.js기반 SSR 환경 구성 방법
라이브러리, 프레임워크는 개발 생산성 향상을 위해 사용한다.
NodeJS는 단일 스레드로 조회성 서비스에 훌륭한 성능/안정성을 자랑한다
inkedin은 Ruby on Rails를 Node.js로 전환함으로써 30대를 운영하던 서버를 3대로 줄일 수 있었고, PayPal은 Java를 Node.js로 전환함으로써 기존보다 35% 이상 평균 응답 속도를 줄일 수 있었다.
성능 테스트는 어플리케이션과 서버 환경의 최적의 환경을 찾는 것과 최적 환경에서 어느정도 부하를 견딜 수 있는지 시스템의 가용량을 확인이다.