Deno Fresh로 사내 API 모니터링 페이지 만들어보기 2일차
Table of contents
No headings in the article.
모종의 이유로 당분간 API 모니터링을 하게 됨
모니터링 로직을 자동화하면 좋기는 한데, 간혹 어떤 값이 들어있는지 직접 확인해야 하는 경우도 있음
- 특히 증권 데이터처럼 수시로 변하는 데이터라면 단순히 프로퍼티와 타입이 제대로 들어가 있는지 확인하는 것만으로는 좀 부족함
어차피 사내 프로젝트여서 재미있을 것 같은 기술스택,
Deno Fresh
로 만들고 있음- 사실 누구도 시킨게 아닌..그냥 매번 url 찾아 들어가기 귀찮아서 만드는 중..
이제 2일차이긴 하지만 잠깐 만져보면서 느낀 점은
- Next.js를 대충이라도 써봤다면, 거의 유사한 방식으로 개발할 수 있어서 허들이 낮은 듯
장점
- 원래 빠르다는 건 (여러 유투브 영상들 보면서) 알고 있었는데, Deno가 Native로 TypeScript를 지원해서 그런지 정말 빠른듯
- 터미널에서
deno task run
치자마자 거의 바로 돌아가는 듯.. - tsconfig나 기타 컴파일/빌드 설정이 크게 필요가 없기 때문에 초기 프로젝트 설정도 빠름
- 기본 스타일링 툴로 TailwindCSS의 mini 버전(?)인 twind를 사용함
- 사용해보기 전엔 이게 과연 최신 TailwindCSS 스택과 호환이 잘될까 걱정이 됐는데, 아직까지 복잡한 스타일링이 없어서 그럴지 모르겠지만 딱히 걸리는건 없음
- vscode extension도 따로 있고, suggestion이 더 잘 되는 것 같은 느낌..
- 생각보다 편리한 Preact
- 컴포넌트 반복문 돌릴때 key 지정 안해줘도 됨
- HTML 태그 속성들을 원래 것 거의 그대로 사용할 수 있음
- 스타일 class 지정할 때 그냥
class
속성으로 지정하면됨. React처럼className="..."
안해도 됨
- 스타일 class 지정할 때 그냥
- Deno Deploy로 배포도 편하고 빠름
- 빌드 시간이 거의 안들기 때문에, release 브랜치 올리자마자 몇초 정도면 배포 끝나는 듯
- SSR, API Call도 역시 빠름
- 사실 Deno Deploy를 제대로 써보고 싶어서 Fresh를 선택한 거라 봐도 무방함..ㅎㅎ
단점
- 아직 성숙한(?) 툴은 아니어서인지 몇 가지 아쉬운 점이 없을 수는 없는 듯
- Webpack, Vite 등 Node.js 빌드툴들에서 대부분 기본적으로 지원하는 hot-reloading이 아직은 잘 안되는 듯
- 물론 개발 중 뭔가 변경하면 메모리 상에선 바로 변경이 되는 것 같은데,
- 브라우저에선 새로고침을 한번씩 해줘야 함. 이제 살짝 귀찮을 때가 있다
뭔가 어색한 Island Architecture..
- Client에서 상태에 따라 변하는 동적인 컴포넌트를 만들려면
islands
폴더 내에서 컴포넌트를 선언해줘야함 - 여기선 컴포넌트 props로 children을 사용할 수 없음
- github.com/denoland/fresh/issues/395
- Deno Fresh 만든 사람이 안된대요
- 애초에 islands 컴포넌트에는 원시값, 객체 아니면 props로 넘어가질 않음
- 당연히 함수인 setState 같은것도 undefined 상태로 넘어감
- children을 못쓰다보니..컴포넌트를 좀만 복잡(?)하게 짜려고 해도 다른 방법을 찾아봐야 함
- github.com/denoland/fresh/issues/395
subdirectory를 만들 수도 없음
- 어느 정도 사이즈가 있는 컴포넌트를 만들려면 파일 하나에 만들어줘야 함
- 파일분리를 하려고 하위 폴더 만드는 순간 빌드 실패..
- 자식 컴포넌트들은 모두 components 디렉토리에서 가져오든가, 아님 island component 선언하는 파일 안에서 모두 처리해야 함..
routes
디렉토리 밑에 있는 페이지 컴포넌트들 (Next.js에서 pages에 해당)에선 hooks 사용 안됨- 이게 제일 불편한 듯..
- Client에서 상태에 따라 변하는 동적인 컴포넌트를 만들려면
import할 때 index.ts 자동추론이 안됨
import문에서 반드시 파일명과 확장자까지 정확하게 명시해줘야 함
// DON'T import { /** ... */ } from '../constants/apis' // DO import { /** ... */ } from '../constants/apis/index.ts'
- 이글을 쓰면서 알게된 사실이긴 한데, Deno는 index.ts/js를 해당 폴더의 엔트리로 자동 추론하지 않음
- Rust 컨벤션을 따라, 엔트리 파일명을
mod.ts
로 하는걸 추천하는데, 이것 역시 자동 추론을 해주진 않음