프론트엔드 개발을 공부하면서 문득 서버와 DB 없이 프론트에서 온전한 서비스를 구현하는 방법이 없을까 하는 생각을 하게 되었습니다.
서버와 DB를 대체할 수 있는 것들을 고민하다가 MSW 와 로컬 스토리지를 이용하는 방법이 떠올랐고 구현하여 프로젝트를 제작해 봤습니다.
출처 : https://zero-base.co.kr/event/media_school_FE_architecture

일반적으로 웹 사이트의 흐름은 위 그림과 같습니다.
기본적으로 웹 사이트는 이런 흐름을 가지고 있습니다. 클라이언트와 서버의 관계로 말이죠. 또한 프론트사이드는 단순히 요청을 보내는 일 밖에는 할 수 없습니다. 응답에 의해 받아들인 데이터를 가공하는 건 나중 일입니다.
백엔드 서버 없이 프론트엔드 개발만으로 데이터를 읽고 쓰고 삭제하고 수정하는 온전한 아키텍처를 가진 프로젝트를 만들어낼 수 없을까요?
일반적인 웹의 흐름에서 벗어난다면 프론트엔드 개발만으로 비슷한 아키텍처를 구현해 낼 수 있습니다. 다만 데이터베이스의 역할을 하는것이 로컬스토리지가 되기때문에 많은 데이터를 저장 할 수 없습니다.
MSW 라이브러리를 사용해 아래 그림과 같은 아키텍처로 온전한 통신을 하는 것처럼 보여지는 프로젝트를 만들어보았습니다.

그림에 서비스 워커와 MSW 가 따로 분리되어 있는데 클라이언트 - 서버 구조를 표현하기 위해 인위적으로 그린 것으로 헷갈리시면 안 됩니다. 위 그림은 모두 브라우저 내부에서 한정적으로 사용 가능한 아키텍처를 표현한 것입니다.
브라우저에 내장되어 있는 서비스 워커를 이용하여 요청을 가로채고 응답할 수 있게 해주는 라이브러리입니다.
위와 같은 아키텍처로 NEXT.JS APP Router 를 이용하여 프로젝트 제작에 착수했으나.. MSW 와 NEXT.JS 최신 버전 간 이슈가 있었습니다.
MSW의 NextJs 14 AppRouter의 import 지원 이슈로 브라우저의 서비스 워커를 제대로 실행할 수 없었습니다.
관련 이슈 : https://github.com/mswjs/msw/issues/1644
Require 비동기 임포팅을 이용하여 MSW 가 서비스 워커에 접근할 때까지 대기하는 방식으로 해결했습니다.
보다 일반적인 방법은 서버 컴포넌트에서 요청했을 땐 express 로 작동시킨 서버가, 브라우저에서 요청했을 땐 서비스 워커가 작동하여 클라이언트와 서버에서 둘다 가로채는 방법입니다.
이 프로젝트는 DB 대용으로 로컬스토리지를 사용했습니다. 로컬스토리지는 사용자가 제거하지 않는이상 반 영구정으로 데이터를 저장해 둘 수 있기 때문입니다.
위와 같은 이슈 때문에 브라우저의 Service Worker를 사용하는 측면이 간단하고, 접근성이 좋기에 기술적으로 채택하였습니다.