죄송합니다...
오늘은~
한 게 별로 없군요!!!
Astro를 써보는 게 어떻냐는 의견을 받았습니다. Astro가 뭔데요?
Astro는 아일랜드 아키텍처를 활용한 멀티 프레임워크 정적 사이트 빌더(SSG)입니다. 대체 어떻게 띄어쓰기를 한 번 할 때마다 모르는 말이 나올 수가 있죠?
쉽게 설명하자면 웹 페이지가 하나의 거대한 사이트가 아닌, '대체 가능하며 독립적인 덩어리(component)로 분리된 하나의 거대한 바다'로, 동적인 컴포넌트들은 '바다 위에 떠 있는 섬들' 바꾸어 생각하는 패러다임이다.
라고 합니다...
이러한 아이디어를 적용하면 동적인 부분을 제외한 나머지 부분(바다 영역)은 순수 HTML로 대체할 수 있고, 각각의 섬(컴포넌트)들은 느리게(lazy), 또는 다양하게(polyglot) 불러올 수 있습니다. 음...
서버가 전달해주는 HTML은 SPA처럼 동적이지는 않아도 페이지의 핵심 데이터만은 가진 상태로 전달됩니다. 제가 흔히 쓰던 SPA 프레임워크는 우선 라이브러리와 js 전체를 로딩한 후 컨텐츠를 비동기로 불러오는 식이었다면, 아일랜드 아키텍처는 이미 컨텐츠가 HTML에 정적으로 포함된 채로 전달되며, 여기에 추가적으로 브라우저가 컴포넌트들을 개별적으로 불러옵니다.
SPA => js가 데이터를 불러와 html을 렌더링해 끼워넣음
아일랜드 아키텍처 => 필요한 데이터가 html에 들어있고, 여기서 필요에 따라 컴포넌트를 불러옴
(아닐 수도 있습니다! 왜냐면 도저히 이해가 안가서 나무위키를 보고 있거든요! 세상에!)
아스트로의 파격적인 특징! React, Vue, Svelte, Preact, Lit등 수많은 웹 프레임워크의 컴포넌트를 모두 지원! 심지어 한 페이지에 이것들을 섞어서 사용하는 것도 가능! 세상에!
=> 이 역시 아일랜드 아키텍처를 사용함으로써 얻는 장점! 각 컴포넌트가 서로 독립적이다
웹 페이지를 미리 모두 만들어놓고, 요청이 들어오면 만들어놓은 웹페이지를 그대로 응답만 해준다! 서버와 클라이언트 측 모두 렌더링을 위해 할 일이 별로 없기 때문에, SSG로 생성된 웹사이트는 속도가 엄청 빠릅니다. 누가 접속하든 항상 동일한 내용을 보여주는 소규모 웹사이트 (예 : 포트폴리오, 제품 카탈로그, 개인 블로그 등)를 만드는데 최적화된 방법입니다!
SPA로 생성된 웹사이트는 동적으로 페이지를 만들어내지만, SSG는 미리 만들어놓은 여러 웹페이지로 이루어져 있기 때문에 (MPA) 검색엔진이 크롤링하기 매우 좋아서 SEO에 유리합니다!
잘 알려진 SSG로는 Gatsby, Hugo, Jekyll, Hexo +Astro 등이 있다고 하네요
그것은 제가 포트폴리오 만드는 데 너무 시간을 많이 쓰고 있기 때문이지요...
스승님의 의견으로는,
포트폴리오는 필요하긴 하지만, 포트폴리오 자체에 프로젝트로써의 가치는 별로 없다. 내 프로젝트에 넣으려면 '문제를 해결한 경험'이 많아야 하는데, 해결해야 하는 문제라는 건 현실적인 비즈니스가 있을 때 비로소 생긴다. (=포트폴리오는 내가 뭘 했고 어떤사람이고를 단순히 '보여주는' 취지이기 때문에 별 다른 기능이 없고, 이렇다 할 문제가 발생하지 않는다. 따라서 포트폴리오는 빠르게 만들어버리고, 실질적인 비즈니스와 그에 따른 여러 기능 요구사항을 가진 프로젝트를 시작하는 게 좋다. 근데 왜 인프런 강의 요즘 안보는거같냐? 코어자바스크립트 어디까지 읽었냐?
라고 하십니다. 아스트로는 빌트 인 테마도 제공하기 때문에, 제가 만들고 있는 포트폴리오 같은 것들을 빠르게 만들어내기에는 최적이라고 할 수 있습니다. 자체적으로 View Transitions API라는 애니메이션 기능도 제공하기 때문에, 혼자서 애니메이션 공부하고 낑낑대면서 만드는 것 보다 훨씬 빠르기도 하구요.
그러나... 뭔가 내키지가 않습니다. 내키지 않는 이유를 좀 정리해보려고 합니다.
그럼에도 불구하고... 포트폴리오 구현이 끝나면 Astro로 마이그레이션을 해보려고 합니다. 이유는 다음과 같습니다.
아무튼 Astro는 보류하기로 했습니다
애니메이션 라이브러리 프레이머-모션을 배우고 있습니다.
별 건 아니고... Nav에 애니메이션 적용하고, docs에서 제공하는 코드를 활용해서 메뉴 버튼을 움직이는 햄버거 버튼으로 만들어보았습니다.
기존의 Nav는 메인 페이지에 상시 띄워두는 형태로 뼈대만 만들어져 있었는데요, 이걸 수정해서 아래와 같은 조건으로 만들어 보았습니다.
그리고 진행 중에 겪은 문제는 다음과 같습니다.
AnimatePresence allows components to animate out when they're removed from the React tree. (Framer-motion 공식문서)
그래서 App에 Nav를 적용한 부분을 아래와 같이 바꿔주었습니다.
<AnimatePresence>
{isOpen && <Nav key="nav" />}
</AnimatePresence>
네녀석 또 블로그를 쓰다 말았구나