기능 기반 vs 레이어드 기반 디렉토리 구조의 장단점
기능 기반 vs 레이어드 기반
프로젝트를 진행할 때 디렉터리 구조는 단순한 폴더 구성이 아니라 코드의 유지보수와 개발 효율성을 크게 좌우하는 중요한 요소입니다.
과거 기능 기반 구조
로 프로젝트를 진행한 적이 있었고, 이번 프로젝트에서는 레이어드 기반 구조
로 프로젝트를 진행해 보았습니다.
아래 두 예시는 각각 기능 기반 구조와 레이어드 기반 구조로 설계된 프로젝트 트리입니다.
1. 기능 기반 구조 (Feature-based Structure)
- 기능 기반 구조는 각 기능을 중심으로 코드가 구성되는 방식입니다.
- 아래와 같이 chat, meeting, user 같은 기능별로 최상위 폴더를 나누고, 각 기능 폴더 안에 controller, dto, entity 등의 관련 파일을 모아두는 방식입니다.
|-- User
| |-- UserController.java
| |-- UserService.java
| |-- UserRepository.java
| |-- User.java
|-- Company
| |-- CompanyController.java
| |-- CompanyService.java
| |-- CompanyRepository.java
| |-- Company.java
-
장점
기능별로 관련 파일이 한 폴더에 모여 있기 때문에 특정 기능을 개발하거나 수정할 때 필요한 파일을 한곳에서 모두 관리할 수 있어 편리합니다. 예를 들어,ChatController
,ChatService
,ChatRoom
등이 한 폴더에 있어 해당 기능에 필요한 모든 파일을 직관적으로 파악할 수 있습니다. -
단점 프로젝트가 커질수록 같은 역할(모든 컨트롤러, 모든 서비스) 파일들이 기능별로 분산되기 때문에, 역할 중심으로 코드를 파악하려면 여러 폴더를 찾아봐야 하는 불편함이 생길 수 있습니다.
2. 레이어드 기반 구조 (Layered-based Structure)
- 레이어드 기반 구조는 역할을 기준으로 코드가 분리되는 방식입니다.
- 아래 예시처럼
controller
,service
,repository
등 역할에 따라 폴더를 구성하며, 각 레이어에 관련된 파일을 모아둡니다.
|-- controller
| |-- ChatroomController.java
| |-- MeetingController.java
| |-- UserController.java
|-- service
| |-- ChatroomService.java
| |-- MeetingService.java
| |-- UserService.java
|-- repository
| |-- ChatroomRepository.java
| |-- MeetingRepository.java
| |-- UserRepository.java
|-- entity
| |-- Chatroom.java
| |-- Meeting.java
| |-- User.java
-
장점 같은 역할을 수행하는 파일들이 한 폴더에 모여 있어, 특정 레이어의 모든 코드를 한눈에 파악할 수 있습니다. 특히 대규모 프로젝트에서는 역할별로 코드가 명확히 분리되어 있어, 각 역할의 책임이 명확하고 팀 단위의 협업이 용이합니다.
-
단점 기능 단위로 작업할 때 필요한 파일들이 여러 폴더에 분산되어 있어, 특정 기능을 개발하거나 수정할 때 관련 파일을 여러 폴더에서 찾아야 하는 번거로움이 있을 수 있습니다.
결론 및 느낀 점
두 구조를 비교해보니, 프로젝트의 성격과 규모에 따라 적합한 디렉터리 구조를 선택하는 것이 얼마나 중요한지 알 수 있습니다. 예를 들어, 기능이 명확히 구분되는 소규모 프로젝트나 빠른 기능 개발이 필요한 경우에는 기능 기반 구조가 더 적합하지만, 역할별 책임을 확실히 나누고 장기적으로 유지보수가 필요한 대규모 프로젝트에서는 레이어드 기반 구조가 유리할 것입니다.
이번 프로젝트에서 레이어드 기반 구조로 프로젝트를 진행해보니 기능을 구현할 때 자주 왔다갔다 하는 일이 생겨 번거로웠지만, 같은 역할을 수행하는 폴더들이 한 곳에 모여 있어 다른 역할의 코드을 참고하면서 구현할 때에는 파악하기에 오히려 더 편한 점이 있었습니다.
두 방법 모두 장단점이 있기에, 프로젝트의 목표와 팀의 협업 방식을 고려하여 적절한 디렉터리 구조를 설계하는 것이 코드 관리와 개발 효율성을 높이는 데 중요한 포인트임을 느꼈습니다.