일반적으로 state를 가질 수 없다. 다른 workers간에 공유하고 싶은 데이터의 한 종류 durable objects없이는 불가능해.
해당 코드는 cloudflare의 지역에 복사되어 퍼짐. 근데 한국의 cloudflare접속자와, 독일의 cloudflare접속자 들이 해당 웹사이트 접속하면 해당 지역의 코드가 각각 실행됨. 다른 컴퓨터에서 실행되기 때문에 state를 유지하지 못함 cloudflare workers에 있는 state가 다른 지역으로 복제 되지 않기 때문. 그냥 cloudflare 한정된 얘기임 리턴하면 코드가 죽음.
KV database에 저장하면 해결되긴 함.
모든 사람이 한 방의 채팅방에 연결 되어있다면? worker코드의 모든 실행들 간에 공유되는 state를 저장 할 수 있는 무언가가 필요 함. 그게 durable object.
durable object와 javascript 클래스를 작성하면, 그 자바스크립트 클래스가 cloudflare에 의해 기억 됨! 이 클래스가 cloudflare메모리로 가게 되고 모든 worker들이 접근 가능하게 되겠지.
carrot market에서 채팅을 할 수 없었던 이유는 next.js에서 실행되는 모든 함수들이 우리가 컴퓨터에 접근 권한이 없는 serverless환경에서 실행되기 때문. 그 환경에서 state는 지속 될 수가 없어. 항상 새 state가 되는거지. durable object는 채팅에 연결된 모든 사람을 유지 시키는 것.
방문자 카운팅 하는 법 홈 경로로 오면 html파일을 주고, 그 안에 있는 src가 /visit?page=lalala인 이미지를 렌더링 하기 위해 브라우저는 src를 찾아서 request를 하게 되는데 그러면 해당 url(/visit)에서는 DB로 request hit을 했다고 알려준다.
이메일 읽었는지 판단하는 원리 이런 식으로 상대가 메일을 봤는지 안봤는지 확인 할 수 있다. 보이지 않는 이미지 태그를 심어서 메일을 보내면 메일을 읽었을 때 브라우저가 해당 url을 hit하게 됨. 그럼 서버에서는 email이 열렸는지 알 수 있음.
서버쪾에서 렌더링을 하니까, 유저쪽에서 처리해야 하는 일은 적어짐. 큰 javascript 들 import할일이 적게 됨. 즉 서버컴포넌트 사용하면 서버에서 렌더링이 이뤄지고 결과물만 프론트로 스트림 됨
코인 list를 주는 API를 콜하고, 불려진 코인의 가격을 알아오는 API를 또 각 코인마다 부를 경우를 예를 들어보자.
CoinsServer라는 서버컴포넌트는 그 안에서 List컴포넌트를 불러온다. 여기서 일단 1차 로딩이 되면 List 컴포넌트 안의 Coin 컴포넌트에서 각 코인의 id를 사용해 가격을 불러오는 수십번의 api콜을 한다. 그리고 각 코인들은 로딩이 되는 순서대로 `Coin ${Coin.name} is loading`에서 각자의 가격을 보여주게 된다.