본문 바로가기

개발

프로그래밍 폴더 구조에 대한 생각정리

반응형

코딩을 할 때 가장 고민을 많이 했던 부분이 바로 폴더 구조이다. 어떤 폴더들이 있어야 할지 그리고 해당 폴더들에는 어떤 파일들이 들어가야 할지가 정리가 잘 되지 않았다. 예를 들면 utils폴더와 libs폴더, core폴더의 차이점들은 뭔지, 현재 작업하고 있는 파일들은 utils로 봐야 할지 core로 넣어야 할지 등이 굉장히 애매했다. 얼마 전 팀원들이랑 관련해서 이야기를 나눴는데 역시 모두 다 해당 부분에 대해서 고민을 하고 있었다.

많이 고민해보고 여러 오픈소스들을 참고하면서 나름의 정리를 하게 되었고 해당 부분을 기록한다.

1. 정해진 정답은 없다.

잘나가는 오픈소스들도 기준이 달랐다. utils.py나 utils.js처럼 utils를 파일로만 관리하는 곳도 있고, utils를 폴더로 관리하면서 `core`와 분리하는 곳도 있다. Vue.js같은 경우는 shared 폴더 안에 `utils.js`를 관리한다. Axios는 utils.js 외에 helpers라는 폴더를 가지고 있다. Django의 경우 core나 utils 폴더 외에 middleware, urls, contrib 등의 폴더가 따로 있다. 폴더를 따로 두지 않고 프로젝트 내에서 파일로만 관리하는 오픈소스 프로젝트도 있다.

2. 정답은 없지만 각 폴더/파일에는 명확한 기준이 있어야한다. 🎬

위에서 언급한 것처럼 정답은 없다. 하지만 '명확한' 기준이 필요하고, 이를 프로젝트나 각 폴더의 `README.md`에 기록해두면 좋다. Axios가 이것을 굉장히 잘하고 있다. 아래는 Axios의 core와 utils폴더의 README.md이다.

axios // core

The modules found in core/ should be modules that are specific to the domain logic of axios. <생략>
axios의 도메인 로직에 특화된 모듈들이 들어가는 곳
axios // helpers

The modules found in helpers/ should be generic modules that are not specific to the domain logic of axios. These modules could theoretically be published to npm on their own and consumed by other modules or apps. <생략>
axios의 도메인 로직에 특화되지 않은 일반 모듈이 들어가는 곳. 이론적으로 npm에 배포되어서 다른 앱이나 모듈에서 활용 가능

3. 가능한 얕게 그리고 쉽게 시작하자. 🐟

옛날에는 폴더 구조가 복잡하면 괜히 잘해보이는 느낌을 받았다. 프로젝트가 크지도 않은데 일단 폴더부터 깊게 나눠놓고 시작하는 경우가 많았다. 하지만, 이렇게 처음부터 폴더 구조를 깊게 설계하니 다음과 같은 문제가 있었다.

  1. 파일을 찾기가 어렵다.
  2. 내가 설계한 폴더 구조에 문제가 있음을 알았지만, 이미 너무 복잡해져서 수정하기가 어렵다.

프로그래밍의 모든 영역이 그렇지만 단순할수록 읽기 쉽고 수정하기 쉽다. 프로젝트 구조 역시 마찬가지이다. 우선은 폴더를 나누기 전에 파일로 시작하는 것이 좋다. 즉, utils폴더를 만들기 전에 utils.py나 utils.js를 만드는 것이다. 프로젝트가 커지면서 하나의 파일이 너무 길어져서 가독성이 떨어진다면 그 때, utils폴더를 만드는 것이다.

😀 나의 기준 😀

마지막으로, axios처럼 내가 고민하고 생각한 기준을 정리하고 글을 끝마친다.

  • 앱(도메인)과 관련되지 않은 모듈들은 utils로 관리한다. 초기에는 파일 사이즈가 커지면 폴더 안의 파일구조로 변경한다.
  • 앱(도메인)과 관련된(특화된) 모듈들은 초기에는 별도로 파일로 관리한다. 사이즈가 커지면 폴더 안의 파일 구조로 변경한다. 예를 들어, crawlers.py로 시작해서 사이즈가 커지면 crawlers/__init__.py, crawlers/dart.py, crawlers/krx.py 등으로 분리한다.
  • 앱(도메인)에 특화되어 있지만 중요도가 떨어지는 모듈은 core폴더로 관리한다. 단, 프로젝트 사이즈가 충분히 커지면 고려한다.

 

참고자료

 

encode/django-rest-framework

Web APIs for Django. 🎸. Contribute to encode/django-rest-framework development by creating an account on GitHub.

github.com

 

axios/axios

Promise based HTTP client for the browser and node.js - axios/axios

github.com

 

tiangolo/fastapi

FastAPI framework, high performance, easy to learn, fast to code, ready for production - tiangolo/fastapi

github.com

 

django/django

The Web framework for perfectionists with deadlines. - django/django

github.com

 

quantopian/zipline

Zipline, a Pythonic Algorithmic Trading Library. Contribute to quantopian/zipline development by creating an account on GitHub.

github.com

 

반응형