Akan.js는 기술적인 코드를 최소화하고, 비즈니스 로직을 구현하는 데 집중할 수 있도록 도와줍니다.
또한, 애플리케이션을 구축하기 위한 여러 편의기능을 내장하고 있고, 설치가능한 라이브러리들을 제공함으로써 비즈니스 개발의 모범 사례를 제공합니다.
워크스페이스 (모노레포)
Akan.js에서는 하나의 조직(팀)이 하나의 레포지토리(workspace) 위에서 여러 앱을 개발하는 구조로 이루어져 있습니다. 하나의 workspace는 여러 앱(app)과 공통 라이브러리(lib)를 가지고 있습니다.
앱(apps): 앱은 독립적으로 배포될 수 있는 하나의 애플리케이션입니다. 웹 앱, 모바일 앱, 서버를 모두 포함하여 모든 플랫폼에 배포될 수 있습니다.
공통 라이브러리(libs): 여러 앱들이 사용할 수 있는 공통의 기능들을 제공합니다. 예를 들면, 로그인, 결제, 알림, 채팅 등은 일반적으로 다양한 앱에서 사용되는 기능들입니다. 이러한 기능들을 공통 라이브러리로 제공하면, 개발자들은 이러한 기능들을 재사용하여 개발 시간을 줄일 수 있습니다.
처음 `akan create-workspace`를 진행하면, 기본적으로 shared, util 라이브러리가 설치되고, 이는 공통 라이브러리로서 모든 앱에서 사용할 수 있습니다.
생성한 내 애플리케이션(e.g. myapp)에서 서버 로직, 도메인 모듈, 클라이언트 로직, 컴포넌트 등의 공통 라이브러리를 사용할 수 있습니다. 예를 들면, shared 라이브러리에서는 관리자페이지와 파일 업로드 도구 등을 제공합니다.
80:20 규칙
건강하게 유지되는 워크스페이스는 약 80%의 코드가 공통 라이브러리로 공유되고, 20%의 코드가 각 앱에 특화되어 운영되는 구조를 권장합니다.
하지만 규칙을 지키려고 노력하지 않아도 됩니다. 당신이 마음을 담아 워크스페이스를 유지보수 하는 과정에서 자연스럽게 비율이 맞추어질 것입니다.
워크스페이스 파일 구조
서버, 클라이언트, 그리고 공통의 코드들을 효율적으로 배치하기 위해 apps와 libs 구조는 다음과 같은 동일한 구조를 가집니다.
서버는 도메인 기반으로 묶여 최종적으로 main.ts 파일에서 실행되는 Node.js 어플리케이션으로 구현되며, 클라이언트는 Next.js app router 방식의 파일 기반 라우팅으로 구현됩니다.
서버와 클라이언트를 구동하기 위해서 각각 server.ts와 client.ts 파일에 모듈화된 코드들을 모아 하나의 파일(barrel file)로 구현합니다.
이를 위해 서버 파일, 클라이언트 파일, 공통 파일을 구분하여 파일 규칙을 가져가며, 이를 개략적으로 표현하면 다음과 같습니다.
위 그림과 같이 파일 규칙에 맞추어 서버, 클라이언트, 공통파일을 잘 배치하여 확장가능하고 재사용가능한 구조를 구현할 수 있습니다. 지금 모든 규칙을 이해할 필요는 없습니다. 앞으로 나올 실습에 맞추어 코드를 작성하면서 하나씩 이해해보도록 합시다. 가장 중요한 것은 내가 구현하고자 하는 코드가 서버, 클라이언트, 공통파일 중 어디에 위치하는지를 파악하는 것입니다.
예를 들면, 패스워드 기반 로그인 기능을 구현한다고 가정합시다. 아이디와 패스워드를 입력받는 컴포넌트는 클라이언트 기능입니다. 이를 암호화해서 저장하는 기능은 서버 기능이며, 비밀번호가 8자가 넘는지 체크하는 것은 양쪽 모두 필요한 공통 기능입니다.