[리팩토링] 폴더 구조의 변경

2022. 11. 15. 17:30·포트폴리오/JJINCAFE IN SEOUL

들어가며

처음 개인 프로젝트를 진행했을 당시 Express 프레임워크는 자유도가 너무 높아 디렉토리 구조에 대한 엄격한 룰이 존재하지 않아 어떻게 구조를 정해야 할 지 정말 막막했습니다.

당시 프로젝트 디렉토리 구조는 같은 이름을 가지는 파일들(*.router.js, *.controller.js) 끼리 하나의 디렉토리 안에 저장하는 형태였습니다. 예시) 라우터들은 routers 디렉토리 하위에 저장, 컨트롤러는 controllers 디렉토리 하위에 저장

 

한편, 개인 프로젝트 이후 회사 실무 프로젝트에서 NestJS 프레임워크를 사용하며 Nest 의 디렉토리 구조는 유지 보수 및 확장성 측면에서 괜찮은 구조라는 생각이 들었습니다.

참고) NestJS 는 비슷한 기능을 하는 컨트롤러, 서비스 등을 묶어 각 도메인 별로 명확하게 구분지어 관리합니다.

곧바로 저는 제 개인 프로젝트 구조를 Nest 의 디렉토리 구조처럼 Module 단위의 디렉토리 구조로 변경했습니다.

기존 프로젝트 디렉토리 구조   

> 같은 역할(router, controller) 을 수행하는 파일들끼리 하나의 디렉토리 안에 저장하는 형태였습니다.

├── public
│   └── cafe_info_in_seoul : 공공 API를 호출하여 받아온 서울시 내 카페 JSON 데이터가 저장되어 있음.
│  
├── src
│   ├── app.js : 중간에 거치는 각종 미들웨어 설정
│   ├── bin
│   │    └── www.js : 서버를 실행하는 스크립트   
│   ├── config : DB, 로거, Multer 미들웨어 등 각종 설정 파일이 저장되어 있음.
│   ├── controllers : 라우터 별 비즈니스 로직을 처리하는 컨트롤러들이 모여 있음.
│   ├── lib  
│   │    ├── errors : 정의한 커스텀 에러 클래스들이 모여 있음.
│   │    ├── middlewares : 라우터로 들어오는 데이터를 검증하는 데 사용되는 커스텀 미들웨어들이 모여 있음. 
│   │    ├── statusCodes : 상수화한 상태 코드 데이터들이 모여 있음.
│   │    ├── constants.js : 세션 쿠키, 자동 로그인 시 생성되는 쿠키 설정 데이터들이 모여 있음.
│   │    └── util.js : 자주 사용되는 유틸 함수들이 모여 있음.
│   │
│   └── routes : 주소별 라우터들이 모여 있음.
│
└── uploads : 사용자 프로필 이미지, 카페 썸네일 이미지가 저장됨.

변경된 디렉토리 구조

> 비슷한 기능을 하는 라우터, 컨트롤러, 서비스 등을 묶어 modules 디렉토리 하위에서 관리

예시) modules 의 하위 디렉토리 auth 디렉토리 안에 auth.router.js, auth.controller.js, auth.service.js 파일이 저장되어 있습니다.

├── public
│   └── cafe_info_in_seoul : 공공 API를 호출하여 받아온 서울시 내 카페 JSON 데이터가 저장되어 있음.
│  
├── src
│   ├── app.js : 미들웨어 및 라우터 등록
│   ├── bin
│   │    └── www.js : 앱의 시작점   
│   ├── config : DB, 로거, Multer 미들웨어 등 각종 설정 파일이 저장되어 있음.
│   ├── modules : 각 모듈 별로 라우터, 컨트롤러, 서비스가 존재함.
│   │    ├── auth : 인증과 관련된 모듈
│   │    │    ├── auth.router.js : 인증 관련 요청 라우팅 처리
│   │    │    ├── auth.controller.js : 인증 관련 API 요청, 응답 처리
│   │    │    └── auth.service.js : 인증 관련 비즈니스 로직 처리
│   │    ├── cafe : 카페 정보와 관련된 모듈
│   │    │    ├── cafe.router.js : 카페 정보 관련 요청 라우팅 관리
│   │    │    ├── cafe.controller.js : 카페 정보 관련 API 요청, 응답 처리
│   │    │    └── cafe.service.js : 카페 정보 관련 API 비즈니스 로직 처리
│   │    └── user : 사용자 정보와 관련된 모듈
│   │         ├── user.router.js : 사용자 정보 관련 요청 라우팅 관리
│   │         ├── user.controller.js : 사용자 정보 관련 API 요청, 응답 처리
│   │         └── user.service.js : 사용자 정보 관련 API 비즈니스 로직 처리
│   ├── common  
│        ├── errors : 정의한 커스텀 에러 클래스들이 모여 있음.
│        ├── middlewares : 라우터로 들어오는 데이터를 검증하는 데 사용되는 커스텀 미들웨어들이 모여 있음. 
│        ├── statusCodes : 상수화한 상태 코드 데이터들이 모여 있음.
│        ├── constants.js : 세션 쿠키, 자동 로그인 시 생성되는 쿠키 설정 데이터들이 모여 있음.
│        └── util.js : 자주 사용되는 유틸 함수들이 모여 있음.
│
└── uploads : 사용자 프로필 이미지, 카페 썸네일 이미지가 저장됨.

마치며

디렉토리 구조 변경 후에 새로운 기능을 추가하거나 기존에 작성된 코드 수정 시 각 기능 별로 접근해야 하는 메서드들이 동일 디렉토리 내에 존재해 훨씬 빠르게 파일들을 찾아 접근할 수 있게 되었습니다.

프로젝트 디렉토리 구조를 정하는 게 코드를 작성하기 전에는 별 것 아닌 것 같았지만, 이는 향후 코드 관리 측면에서 큰 영향을 미친다는 것을 깨달았습니다.

이번 프로젝트의 경우 개인 프로젝트여서 별다른 불편함을 느끼지 못했지만 만약 다른 개발자들과 협업 하에 프로젝트를 진행한다면 엄격한 규칙을 기반으로 프로젝트 디렉토리 구조를 설정하는 게 중요한 일이 될 것입니다. 

'포트폴리오 > JJINCAFE IN SEOUL' 카테고리의 다른 글

[리팩토링] 회원가입 API 트랜잭션 처리 및 관심사 분리  (0) 2022.11.15
[Docker 적용] MySQL 서비스 컨테이너에 .sql 파일 Import 후 데이터베이스에 적용하기  (0) 2022.11.15
서버 실행할 때 왜 .env.production 파일이 파싱되지 않지?  (0) 2022.11.14
'포트폴리오/JJINCAFE IN SEOUL' 카테고리의 다른 글
  • [리팩토링] 회원가입 API 트랜잭션 처리 및 관심사 분리
  • [Docker 적용] MySQL 서비스 컨테이너에 .sql 파일 Import 후 데이터베이스에 적용하기
  • 서버 실행할 때 왜 .env.production 파일이 파싱되지 않지?
rondeveloper
rondeveloper
  • rondeveloper
    Ron's learning record
    rondeveloper
  • 전체
    오늘
    어제
    • 분류 전체보기 (102)
      • k8s (2)
      • AWS (1)
      • 리눅스 (5)
      • Docker (8)
      • 라이브러리 & 프레임워크 (14)
        • React (2)
        • NestJS (8)
        • Spring (0)
        • Django (3)
        • FastAPI (1)
      • 웹 (2)
        • Nginx (1)
      • 프로그래밍 언어 (29)
        • HTML (0)
        • CSS (0)
        • JavaScript (21)
        • Python (3)
        • Node.js (0)
        • TypeScript (4)
        • Java (1)
      • Today I learned (9)
      • 알고리즘 (9)
        • 백준 (0)
        • 프로그래머스 (8)
        • 개념 (1)
      • 티끌모아 태산 (5)
        • 하루에 영단어 하나씩 (5)
        • 독서 (0)
      • 시행착오 (3)
      • 데이터베이스 (2)
        • MySQL (0)
      • 컴퓨터 과학 (8)
        • 네트워크 (2)
        • 운영체제 (0)
        • 데이터베이스 (2)
        • 자료구조 (4)
      • 포트폴리오 (4)
        • JJINCAFE IN SEOUL (4)
        • CODEUNICORN (0)
      • 회고 (0)
      • CICD (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Til
    도커
    FastAPI
    mysql
    javascript
    생활코딩
    리눅스
    nestjs
    네트워크
    iterable
    Kubernetes
    Docker
    Kubectl
    모듈
    자바스크립트
    코딩테스트
    IP 주소
    Python
    레벨2
    컨테이너
    반복문
    스택
    기초
    프로그래머스
    배열
    조인
    typeorm
    django
    typescript
    redis
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
rondeveloper
[리팩토링] 폴더 구조의 변경
상단으로

티스토리툴바