핵심요약:
- Django App은 단순한 폴더 분리가 아님
- 배포 단위라기보다는 비즈니스 도메인 분리 단위
- DRF에서는 API 기능별 모듈처럼 동작해서 장점이 명확함
- 일반 Django 웹앱에서는 처음엔 필요성이 덜 느껴질 수 있음
- 하지만 프로젝트가 커질수록 모델, Admin, 테스트, 마이그레이션 관리에서 차이가 커짐
- 잘 만든 App은 나중에 다른 프로젝트로 옮길 수 있는 재사용 가능한 자산이 됨

Django 프로젝트는 하나의 서버로 배포되더라도 startapp으로 여러 앱을 나눌 수 있음. DRF 기반 Headless API 서버에서는 이 구조가 특히 자연스럽지만, 템플릿 기반 Django 웹앱에서도 앱 분리는 여전히 의미가 있음.

Django 프로젝트 구조 개념도

DRF에서 App 분리가 잘 맞는 이유

  • API 경계가 명확함

  • accounts

  • posts
  • billing
  • notifications

  • 각 앱이 독립적인 API 묶음처럼 동작

  • models

  • serializers
  • views / viewsets
  • permissions
  • urls
  • tests

  • 하나의 DRF 서버 안에서 여러 기능을 표준적인 방식으로 확장 가능

  • 서로 다른 앱이 같은 프로젝트 안에 있어서 예상치 못한 시너지도 생김

  • 글 발행 → 알림 생성

  • 결제 상태 → 사용자 권한 변경
  • 사용자 설정 → 콘텐츠 노출 방식 변경

일반 Django 웹앱에서 생기는 의문

템플릿 기반 Django 웹앱에서는 앱을 나눠도 결국:

  • 같은 서버에서 실행됨
  • 같은 DB를 사용함
  • 같은 settings를 공유함
  • 같은 배포 단위로 묶임
  • 템플릿 흐름도 서로 섞이기 쉬움

그래서 작은 웹앱에서는 “굳이 앱을 나눠야 하나?”라는 생각이 들 수 있음.

그래도 App을 나누는 이유

  • 모델이 너무 커지는 것을 막음
  • Admin 화면이 도메인별로 정리됨
  • migrations 이력이 앱별로 나뉨
  • 특정 앱만 테스트하기 쉬움
  • import 구조를 의식하게 되어 스파게티 코드 방지에 도움
  • 나중에 기능을 분리하거나 API화할 때 경계가 이미 생겨 있음

App은 재사용 가능한 부품이 될 수 있음

Django의 앱 구조는 기능을 Plug-and-Play 가능한 부품처럼 만들 수 있게 해줌.

프로젝트 내부에서 만든 앱이라도 구조를 잘 잡으면, 나중에 다른 프로젝트로 옮기기 쉬움.

예를 들어:

  • 알림 기능 → notifications
  • 태그 기능 → tags
  • 결제 기능 → billing

이런 앱을 독립적으로 만들어두면, 다음 프로젝트에서 다음처럼 재사용할 수 있음.

  • 앱 폴더 복사
  • INSTALLED_APPS에 추가
  • 필요한 URL 연결
  • migrations 실행
  • 템플릿 또는 설정만 프로젝트에 맞게 조정

Django 생태계의 유명한 라이브러리들도 이런 방식으로 제공됨.

  • django-allauth : 회원가입, 로그인, 소셜 로그인 기능을 앱 형태로 제공

  • django-taggit : 태그 기능을 재사용 가능한 앱으로 제공

  • django-tailwind : Django 프로젝트 안에서 Tailwind 개발 환경을 앱 형태로 통합

즉, Django App은 단순히 “내 프로젝트 안의 폴더”가 아니라, 잘 설계하면 다른 프로젝트에서도 다시 쓸 수 있는 기능 자산이 될 수 있음.

좋은 분리 기준

앱을 나눌 만한 신호:

  • 독립적인 데이터 모델이 있음
  • 별도의 Admin 그룹이 필요함
  • 자체 비즈니스 로직이 있음
  • 테스트를 따로 돌리고 싶음
  • 나중에 API 또는 별도 서비스로 분리될 가능성이 있음
  • 기능 이름이 서비스 도메인으로 설명됨
  • 다른 프로젝트에서도 다시 쓸 가능성이 있음

예:

  • accounts
  • billing
  • notifications
  • support
  • analytics

결론

Django 프로젝트에서 App 의 구분은

프로젝트가 커졌을 때 사람이 이해할 수 있는 단위로 복잡도를 접어두는 구조

그리고 한 걸음 더 나아가면:

반복해서 사용할 수 있는 기능을 자산화하는 Django식 모듈 시스템

DRF에서는 이 장점이 API 경계와 잘 맞아서 바로 드러나고, 일반 Django 웹앱에서는 프로젝트가 커지거나 여러 프로젝트를 만들기 시작할 때 그 가치가 드러나는 경향이 있음.