2022-12 
๋งํฌ & ์ฝ์๊ฑฐ๋ฆฌ
Complete rewrite of ESLint
2013๋ ์ฒ์ ์ถ์๋์๋ ESLint๋ ์ด์ ๊ณง 10๋ ์ ์๋๊ณ ์๋ค. 2013๋ ๊ฐ๋ฐ๋์๋ ๊ธฐ๋ณธ ์ฝ์ด๋ฅผ ํ์ฉํด ์๋ก์ด ๋ณํ๋ค์ ์ ์ง์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์ ์ฉํด ์์ง๋ง, ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ํฅํ 10๋ ์ ๋ํ ๋ฐฉํฅ์ฑ์๋ ๋ง์ง ์๋๋ค๋ ๊ฒ์ ์ธ์ํ๊ณ ์ด๋ฅผ ์ํด ์ ์ฒด์ ์ผ๋ก ์ฝ๋๋ฅผ ๋ชจ๋ ์ฌ ์์ฑํ๊ณ ์ ํ๋ ๊ณํ๊ณผ ํจ๊ป, ์ด์ ๋ฌ์ฑ์ ์ํด 10๊ฐ์ง ๋ชฉํ๋ฅผ ๊ณต๊ฐํ๋ค.
Supper Club ร Ryan Dahl and Deno
Node.js์ Deno ๊ฐ๋ฐ์์ธ Ryan Dahl์ ํ์บ์คํธ ์ธํฐ๋ทฐ ๋ด์ฉ์ผ๋ก, Node์ Deno์ ๋ํ ์ ๋ฐ์ ์ธ ์๊ฐ์ ๋ค์ด๋ณผ ์ ์๋ค. ๋ํ ์ ์์ง๊น์ง๋ JavaScript์ ๋ฒ ํ ํ๋์ง, ๊ฐ๋ฐ์๋ค์ด Rust๋ฅผ ๋ฐฐ์์ผ ํ ์ง ๋ฑ์ ๋ํ ์น ์ ๋ฐ์ ๋ํ ์๊ฒฌ๋ค์ ๋ํด์๋ ๋ค์ด๋ณผ ์ ์๋ค.
๋ค์์ ์ฃผ์ ๋ค์ ๋ํ Ryan Dahl์ ๋ต๋ณ์ด ๊ถ๊ธํ๋ค๋ฉด, ์ง์ ๋ค์ด๋ณด๊ธธ ์ถ์ฒํ๋ค.
- Why are you still betting on JavaScript for the web?
- Should developers be learning Rust?
- Will libraries that work on npm eventually work in Deno?
- Client side vs server side rendering
performance.now() 2022
์ง๋ 11์ 2~3์ผ ์์คํ ๋ฅด๋ด์์ ์น ์ฑ๋ฅ ์ฃผ์ ์ ํฌ์ปค์ฑ ํ ์ฝํผ๋ฐ์ค๋ก, ์ด 14๊ฐ์ ์ธ์ ์ ํตํด ๋ค์ํ ์ฑ๋ฅ ๊ด์ ์ ๊ฒฝํ์ ๋ค์ด๋ณผ ์ ์๋ค.
if(kakao)dev2022
๋งค๋ Kakao์์ ์งํํ๋ ๊ฐ๋ฐ์ ์ฝํผ๋ฐ์ค์ด๋ค. ์ฌํด๋ 12์ 7์ผ ~ 12์ 9์ผ 3์ผ๊ฐ ์จ๋ผ์ธ์ผ๋ก ์งํ๋๋ค. Day 1.์๋ ์ง๋ 10์ 15์ผ ํ๊ต IDC ํ์ฌ ์ฌ๊ณ ๋ก ์ธํด ๋ฐ์ํ ์ฅ์ ์ ๋ํ ๊ณต์ ๋ฅผ ์งํํ๊ณ , Day 2. ~ 3.์๋ ๊ธฐ์ ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ์ฃผ๋ก ๋ค๋ฃฌ๋ค๊ณ ํ๋ค.
๊ธฐ์ ๊ณต์ ์ค Front-end ๊ด๋ จ ์ธ์ ์ ์ด 11๊ฐ๋ก ๋ค์๊ณผ ๊ฐ๋ค:
- MFA ๋๊ตฌ๋ ๋: ๊ณตํต ํ๋ซํผ ํํธ์ MFA ๋์ ๊ธฐ
- ์น ๋ฐ์์ฑ ๊ฐ์ ํ๊ธฐ
- ๋ธ๋ฐ์น FE ์ฌํ์์์
- ๋์ ๋ณด์ด์ง ์๋ ๊ฐ์ : My๊ตฌ๋ ์ Redux์์ React-Query ์ ํ ๊ฒฝํ ๊ณต์
- ๊ด๊ณ ์น SDK ๊ฐํธ๊ธฐ with Preact
- ์ฌ์งํธ์ง๊ธฐ! ์ด๊ฒDOM ์ ์ฉํด๋ณผGL?
- ์ฌ์ธํ ISFP์ ์ฝ๋ ๊ฐ๋ ์ฑ ๊ฐ์ ๊ฒฝํ
- ๋ณต์กํ ์ํ๊ด๋ฆฌ๋๊ตฌ Svelte์ค๋ฝ๊ฒ ๋ง๋ค๊ธฐ
- ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ค๋ฌด์ ์ธ๋งํ ๊น?
- ์นด์นด์คํ์ด ํ๋ก ํธ์๋ ๊ฐ๋ฐํ์ Client Side Rendering ํ๊ฒฝ ๊ณ ๋ํ
- Sentry๋ฅผ ์ด์ฉํ ์๋ฌ ์ถ์ ๊ธฐ, React์ ์ ์ธ์ ์๋ฌ ์ฒ๋ฆฌ
๋์์ธ ํจํด๋ค
๋์์ธ ํจํด๋ค์ ์๊ฐํ๋ ์ฌ์ดํธ์ด๋ค. ๋์์ธ ํจํด ๋ชฉ๋ก๋ฟ๋ง ์๋๋ผ, ํจํด์ ์ด์ , ๋ถ๋ฅ, ์ญ์ฌ ๋ฑ๋ ์งง๊ฒ๋๋ง ๋ค๋ฃจ๊ณ ์๋ค. ๋ํ ์ธ์ด๋ณ๋ก ์์ฑ๋ ์์ ์ฝ๋๋ ์ ๊ณตํ์ฌ ์ดํด๋ฅผ ๋๋๋ค.
์ถํ ๋ฆฌํฉํฐ๋ง, SOLID ์์น ๋ฑ์ ๋ด์ฉ๋ ๋ค๋ฃฐ ์์ ์ด๋ผ๊ณ ํ๋ค.
How React Uses Closures to Avoid Bugs
React class component์์ this.props
์ฐธ์กฐ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ํ ๊ธ์ด๋ค.
๋ฌธ์ ๋ class component๊ฐ re-render(update) ๋ ๋, ์งํ ์ค์ด๋ async handler ๋ฑ์์ ์ฐธ์กฐํ๋ this.props
๋ ๋ณํ๋ค๋ ๊ฒ์ด๋ค.
์ด์ ๋ํ ์์ธ์ ๋ค์์ผ๋ก ์์ฝํ ์ ์๋ค:
- class component๋ instance๋ก์ ๊ด๋ฆฌ๋๋ค.
- React updating phase์์๋ instance๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ณ ์ ์ง๋๋ค.
- ๋ฐ๋ผ์ ์๋ฅผ ๋ค์ด, ๋น๋๊ธฐ์ธ ํด๋ฆญ ํธ๋ค๋ฌ์์
this.props
์ ๊ทผ ์, ํด๋ฆญ ์์ ์ด ์๋, ๋น๋๊ธฐ ์ดํ ์์ ์this.props
๋ฅผ ์ ๊ทผํ์ฌ ์ฌ์ฉํ๊ฒ ๋ ์ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋น๋๊ธฐ ํธ์ถ ์ ์ this.props
๋ฅผ ์กฐ๊ธฐ์ ํด์ฒดํ์ฌ ์ฌ์ฉํ์ฌ์ผ ํ๋ค:
handleLikeClick = async () => {
const {post} = this.props;
const {user, toggleLike} = this.context;
if (!(await canLike(post, user))) return;
toggleLike(post);
};
ํ์ง๋ง, ์ด ๊ฐ์ ๋ฌธ์ ๋ function component์์ ๋ฐ์ํ์ง ์๋๋ค. ๊ทธ ์ด์ ๋ function component๋ props๋ฅผ closure๋ก์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ธ๋ฐ, ์ด์ ๋ํ ์ด์ผ๊ธฐ๋ ๋ณธ ๊ธ์์ ์ดํด๋ณผ ์ ์๋ค.
TechBlogPosts
IT ๊ธฐ์ ๋ธ๋ก๊ทธ๋ค์ ์ค์๊ฐ์ผ๋ก ๊ธ์ด์ ๋ณด์ฌ์ฃผ๋ ์ฌ์ดํธ์ด๋ค. ๋ผ์ธ, ๋ค์ด๋ฒ, ์นด์นด์ค ๋ฑ ๊ตญ๋ด IT ํ์ฌ ๋ธ๋ก๊ทธ๋ฟ๋ง ์๋๋ผ, ๊ตฌ๊ธ, MS ๋ฑ์ ๋ธ๋ก๊ทธ ๊ธ๋ ๋ค๋ฃจ๊ณ ์๋ค. ๊ธฐ์ ๋ถ์ผ๋ณ๋ก ๊ธ์ด ๋ถ๋ฅ๋์ด ์์ง ์๋ค๋ ๊ฑด ์์ฝ๋ค.
[๋ฒ์ญ] React์ SOLID ์์น ์ ์ฉํ๊ธฐ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์์น์ธ SOLID๋ฅผ React ์ปดํฌ๋ํธ ๊ฐ๋ฐ์ ์ ์ฉํด ๋ณด๋ ๊ธ์ด๋ค. L(๋ฆฌ์ค์ฝํ ์นํ ์์น)์ ์ ์ธํ S, O, I, D ๊ฐ๊ฐ์ ์์น๋ค์ ์งํค์ง ์์ ๊ฐ๋จํ ์์๋ฅผ ์ ์ํ๊ณ ์ด๋ป๊ฒ ๋ฆฌํฉํ ๋งํ ์ ์๋์ง ์ค๋ช ํ๋ค.
How to Use Google Sheets as a Database with React and Serverless
Google Sheets๋ ๋ค๋ค ๋ง์ด ๋ค์ด๋ณด๊ณ ์จ๋ณด์์ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ Google Sheets๊ฐ ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก์์ ์ญํ ๋ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์๋๊ฐ? ์ด๋ Google Sheets์์ ์ ๊ณตํ๋ API๋ฅผ ํตํด ๊ฐ๋ฅํ๋ฐ, ์ด์ ๋ํด ๋ณธ ๊ธ์์ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์๋์ง ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๋ค.
The Wet Codebase - Dan Abramov
Redux ์ React ๊ฐ๋ฐ์๋ก ์ ๋ช ํ Dan Abramov ๊ฐ 2019๋ deconstructconf์์ ๋ฐํํ ๋ด์ฉ์ด๋ค. ๊ฝค ์ค๋๋ ์์์ด์ง๋ง ๋ณ์น ์๋ ์ํํธ์จ์ด์ ์ผ๋ฐ์ ํน์ฑ์ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ์ ํจํ ๋ด์ฉ๋ค์ด๋ค.
๊ฐ์ ์ฝ๋๊ฐ ์ค๋ณต๋๋ ๊ณตํต ์ฝ๋๋ก ๋ถ๋ฆฌํ๋ ๊ฒ ์ข์ ๋ณด์
๋๋ค.
๋ผ๊ณ ๋งํ๋ ๊ฒ์ ์ฝ์ง๋ง ์ด์ ๋ํด์ ์ฌ๊ธฐ์๋ ๊ทธ๋ฅ copy and paste ํ์ฃ
๋ผ๊ณ ๋งํ๊ธฐ๋ ์ด๋ ต๋ค. DRY ์์น์ ์ฅ๋จ์ ๋ํด์ ๋ค์ ํ๋ฒ ์๊ฐํด ๋ณด๊ณ , ์ํฉ์ ๋ฐ๋ผ์ ์ฌ๊ธฐ์๋ ๊ทธ๋ฅ copy and paste ํ์ฃ
๋ผ๊ณ ๋งํ ์ ์๋ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ณด๋ ๊ฑด ์ด๋จ๊น?
FE Conf
์ง๋ 10์ 8์ผ ์งํ๋ ๊ตญ๋ด ํ๋ฐํธ์๋ ์ปจํผ๋ฐ์ค ํ์ฌ์ธ FE Conf์ ๋ฐํ ๋ด์ฉ๋ค์ด ์ ํ๋ธ์ ๊ณต๊ฐ๋์๋ค.
- ํ ์คํธ ์๋ํฐ? ๊ทธ๊ฒ ๋ญ ๋ง๋๋ ๊ฑด๋ฐ?
- ๋ด import ๋ฌธ์ด ๊ทธ๋ ๊ฒ ์ด์ํ๋์?
- ๋์์ธ ์์คํ , ํํ๋ฅผ ๋์ด์
- ์ผ๋ฐฑ๊ฐ ํจํค์ง ๋ชจ๋ ธ๋ ํฌ ์ฐ์ํ๊ฒ ์ด์ํ๊ธฐ
์ด์ธ์๋ ์ฌ๋ฌ ํฅ๋ฏธ๋ก์ด ์ฃผ์ ๋ค์ด ๋ฐํ๋์๋ค.
State Of JS
์ ๋ช ํ๋ฐํธ์๋ ํธ๋ ๋ ์ค๋ฌธ์ธ State Of JS์ 2022 ์ค๋ฌธ์ด ์์๋์๋ค.
์ค๋ฌธ์ ์ฐธ์ฌํด ํต๊ณ์ ๊ธฐ์ฌํ๋ค๋ ์์๋ ์์ง๋ง ์ค๋ฌธ์ ํตํด์ ์๋ก์ด ํธ๋ ๋์ ๊ธฐ์ ์ ์ ํ ์ ์๋ค๋ ์์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ฉ ์ฐธ์ฌํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
์ธ์ด, ๋ธ๋ผ์ฐ์ API, ํ๋ฐํธ์๋ ํ๋ ์์ํฌ, Rendering Frameworks, ํ ์คํ , ๋ชจ๋ฐ์ผ & ๋ฐ์คํฌํฑ, ๋น๋ ๋๊ตฌ ๋ฑ์ ํญ๋ชฉ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
ํํ ๋ฆฌ์ผ
Node.js visualized
๋จ์ผ ์ค๋ ๋๋ก ์คํ๋๋ค๋ ๊ฒ์ ํ ๋ฒ์ ํ ๊ฐ์ง ์ผ๋ง์ ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ์์ฐจ์ ์์ ์ผ๋ก ์ด์ ์ ์์ ์ด ๋๋๋ฉด ๋ค์ ์์ ์ด ์ด์ด์ ์งํ๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด ์ด๋ค ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ง์์ ๋ํ ์์ฒญ์ ์ฒ๋ฆฌ๊ฐ ์ค๋ ์๊ฐ ์์๋์์ ๋, ๋ ๋ง์ ์์ ์ด ์ค๋ ๋์์ ์ํ๋์ง ๋ชปํ๋๋ก ์ฐจ๋จ๋๋ ๊ฒ์ ํจ์จ์ ์ด์ง ์์ ๊ฒ์ด๋ค. ๋คํํ๋ Node.js๋ ์ด๋ฒคํธ ๋ฃจํ ์ฒ๋ฆฌ๋ฅผ ์ํด C++๋ก ์์ฑ๋ Libuv๋ฅผ ํ์ฉํ๋ฉฐ, ๋คํธ์ํฌ ์์ฒญ, DNS ํ์ธ, ํ์ผ ์์คํ ์์ ๋ฑ์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ค.
์ด ๊ธ์ ์ด์ ๋ํ ๊ณผ์ ์ ์๊ฐํํ๊ณ ๋จ๊ณ๋ณ๋ก ์ดํดํ ์ ์๋๋ก ๋์์ค๋ค.
์ฝ๋์ ๋๊ตฌ
Solid Start
SolidJS meta framework์ธ Solid Start ๋ฒ ํ๋ฒ์ ์ด ์ง๋ 11/10์ผ ๊ณต๊ฐ๋์๋ค. (React์ Next.js์ ๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.) ํ๋ก์ ํธ ํ ํ๋ฆฟ์ ํตํด ์ํ๋ ๊ตฌ์ฑ์ ์ด๊ธฐ ์ ์ ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ์๊ณ , ์ค์ฒฉ ํ์ผ์์คํ ๋ผ์ฐํ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ์ง์ํ๋ค.
CAF
YDKJS์ ์ ์ getify๊ฐ ๋ง๋ CAF(Cancelable Async Flows)๋ผ๋ ์ด๋ฆ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Generator function(function*
)์ async function์ฒ๋ผ ์ ์ดํ ์ ์๋๋ก ํ๊ณ , cancellation ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๊ณ ํ๋ค.
์๋ฅผ ๋ค์ด ์ด๋ฐ ๊ฒ์ด ๊ฐ๋ฅํ๋ค:
// two๋ผ๋ ์ด๋ฆ์ generator function์ ๋ฉํ(CAF)ํ์ฌ async์ฒ๋ผ ๋ค๋ฃฐ ์ ์๊ฒ ๋๋ค.
var two = CAF( function *two(signal,v){
yield delay( 100 );
return v * 2;
});
// CAF์์ ์ ๊ณตํ๋ token์ ๋ฃ์ด์ฃผ์ด ์ฌ์ฉํ๋ค.
var token = new CAF.cancelToken();
two( token.signal, 21 )
.then( console.log, console.error );
// ์ด๋ ๊ฒ cancellation๋ ๊ฐ๋ฅํ๋ค.
two( token, 21 )
.then( console.log, console.error ); // Took too long!
token.abort( "Took too long!" );
signal์ด๋ ํํ์์ ์๊ฐํด ๋ณผ ์ ์๋ฏ์ด ๋ด๋ถ์ ์ผ๋ก AbortController๋ฅผ ์ฌ์ฉํ๋ค.
๋ํ Nested์๋ ๋์์ด ๊ฐ๋ฅํ๋ค๋ ํน์ง์ด ์๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ token.abort()
์ ์ ์ฒด๊ฐ abort ๋๊ฒ ๋๋ค. ์ฆ ํจ์๊ฐ ์คํ ๋์ค ๋ฉ์ถ๊ฒ ๋๋ค:
var token = new CAF.cancelToken();
var one = CAF( function *one(signal,v){
return yield two( signal, v );
} );
var two = CAF( function *two(signal,v){
return yield three( signal, v );
} );
var three = CAF( function *three(signal,v){
return yield ajax( `http://some.tld/?v=${v}` );
} );
one( token.signal, 42 );
// 5์ด๋ฅผ ์ด๊ณผํ ๊ฒฝ์ฐ abortํ๋ค.
setTimeout( function onElapsed(){
token.abort( "Request took too long!" );
}, 5000 );
typescript-strict-plugin
typescript compile option ์ค strict ์ต์ ์ ๋ ์ํ๋ก ๊ฑฐ๋ํด์ง ํ๋ก์ ํธ์์ ์ค๊ฐ์ strict ์ต์ ์ ํค๋ ๊ฒ์ ํ๋ค๊ณ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ผ์ด๋ค. typescript-strict-plugin์ strict ์ต์ ์ ์ ์ง์ ์ผ๋ก ๋์ ํ ์ ์๋๋ก ๋์์ค๋ค. v2์ v1์ ์ ๊ทผ ๋ฐฉ์์ด ์์ดํ ๋ถ๋ถ์ด ์๋๋ฐ ์ทจํฅ์ ๋ฐ๋ผ์ ์ ํํ๋ฉด ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
v2: // @ts-strict-ignore
์ฃผ์์ ํ์ผ ๋งจ ์์ ๋์์ผ๋ก์จ strict ์ต์
์ ํด๋น ํ์ผ์์๋ง ๋ ์ ์๊ฒ ํด์ค๋ค.
v1: // @ts-strcit
์ฃผ์์ ํ์ผ ๋งจ ์์ ๋์์ผ๋ก์จ strict ์ต์
์ ํด๋น ํ์ผ์์๋ง ํฌ ์ ์๊ฒ ํด์ค๋ค.
strict ์ต์ ์ ์ํด๋์ ์ฝ๋์์ ๊ฐํ๊ฒ ํ์ ์ ์ ์ํ ์ ์๊ณ ์ถํ์ ์ผ์ด๋ ์ ์๋ ํ์ ์ ์์ ๋ํ ์ค๋ฅ ๋์ํ ์ ์๊ณ ์์ ํ๊ฒ ์ฝ๋ฉ์ ํ ์ ์๊ฒ ํ๋ค.