기능 기반 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
  • 장점 같은 역할을 수행하는 파일들이 한 폴더에 모여 있어, 특정 레이어의 모든 코드를 한눈에 파악할 수 있습니다. 특히 대규모 프로젝트에서는 역할별로 코드가 명확히 분리되어 있어, 각 역할의 책임이 명확하고 팀 단위의 협업이 용이합니다.

  • 단점 기능 단위로 작업할 때 필요한 파일들이 여러 폴더에 분산되어 있어, 특정 기능을 개발하거나 수정할 때 관련 파일을 여러 폴더에서 찾아야 하는 번거로움이 있을 수 있습니다.



결론 및 느낀 점

두 구조를 비교해보니, 프로젝트의 성격과 규모에 따라 적합한 디렉터리 구조를 선택하는 것이 얼마나 중요한지 알 수 있습니다. 예를 들어, 기능이 명확히 구분되는 소규모 프로젝트나 빠른 기능 개발이 필요한 경우에는 기능 기반 구조가 더 적합하지만, 역할별 책임을 확실히 나누고 장기적으로 유지보수가 필요한 대규모 프로젝트에서는 레이어드 기반 구조가 유리할 것입니다.

이번 프로젝트에서 레이어드 기반 구조로 프로젝트를 진행해보니 기능을 구현할 때 자주 왔다갔다 하는 일이 생겨 번거로웠지만, 같은 역할을 수행하는 폴더들이 한 곳에 모여 있어 다른 역할의 코드을 참고하면서 구현할 때에는 파악하기에 오히려 더 편한 점이 있었습니다.

두 방법 모두 장단점이 있기에, 프로젝트의 목표와 팀의 협업 방식을 고려하여 적절한 디렉터리 구조를 설계하는 것이 코드 관리와 개발 효율성을 높이는 데 중요한 포인트임을 느꼈습니다.