들어가며

Typescript로 서버/클라이언트 모두를 개발하다보면 필연적으로 비슷한 interface 파일을 공유하게 된다.

// server/dto/user.ts
interface GetUserResponse {
  id: string
  name: string
  phone: string
  ...
}

// client/dto/user.ts
interface GetUserResponse {
  id: string
  name: string
  phone: string
  ...
} 

만약 프로젝트가 monorepo를 사용하고 있어 클라이언트와 서버가 같은 레포지토리 아래에서 다른 패키지로 분리되어 있다면 lerna와 같은 툴을 사용할 수도 있다.

하지만 lerna와 같은 툴은 어느 정도 러닝커브가 있으며 그게 어려워 그냥 복사 붙여넣기를 하고 있는 내 상황에는 다른 해법이 필요했다.

실험

git hook을 이용하면 특정 경로에 해당되는 파일이 변화될 때마다 목표 경로에 복사한 뒤에 add를 할 수 있지 않을까 하는 생각이 들었고, 레포지토리에 해당 코드를 올렸다.

아직 import 경로가 서로 다르다든가 하는 상황에 대해서는 고려해보지 못했다. (클라이언트/서버 디렉토리 구조가 달라 import 경로가 다를 경우 파일 내용을 추가적으로 변환할 필요가 있을 것 같다.)

하지만 아직 실험에 가까운 내용이고 얼마든지 프로젝트 내용에 따라 스크립트를 바꿀 수 있기 때문에 큰 문제는 되지 않을 것 같다.

마무리

내가 좋아하는 책 실용주의 프로그래머의 한 구절을 가져와봤다.

보통은 약간의 창의력만 있으면 중복의 필요를 제거할 수 있다. 흔히 간단한 필터나 코드 생성기를 작성하는 것이 해답이다.
... 이 책의 발췌된 코드들은 우리가 텍스트를 포맷할 때마다 전처리기에 의해 자동으로 삽입된다. 요령은 그 과정을 능동적으로 하는 것이다. 이런 것이 한 번하고 마는 변환이 되면 안 된다.
<실용주의 프로그래머 68p>