[SpringBoot] SpringBoot 패키지 구조

Date:     Updated:

카테고리:

태그:

Spring Boot의 패키지 구조

개발 프로젝트를 하다보면 프로젝트가 커질수록, 또는 기능이 많아질수록 코드의 구조화는 더욱 중요해집니다. SpringBoot를 예로들면 처음에는 단순한 컨트롤러 하나와 서비스 하나로 시작했던 프로젝트도, 기능이 늘어나고 팀원이 늘어나면 금세 복잡해지고 유지보수가 어려워집니다.

이럴 때 핵심이 되는 것이 바로 패키지 구조 입니다. 어떤 파일이 어디에 위치하고, 어떤 책임을 가지며, 서로 어떤 관계를 맺고 있는지를 명확히 하는 것입니다. 이게 명확하지 않으면, 프로젝트가 커질수록 java파일을 찾기 힘들어지고, 이것은 생산성에 큰 저하를 주게 됩니다.

많은 스프링 개발자들이 controller, service, repository와 같은 전통적인 레이어 기반 패키징을 따르다가, 점차 패키지 구조를 효율적으로 바꾸는 이유도 여기에 있습니다. 즉, 패키지 구조는 단순히 폴더 정리가 아니라, 애플리케이션의 아키텍쳐와 유지보수성을 결정짓는 중요한 설계 요소입니다.

Controller-Service-Repository 패키지 구조

저도 처음에 Spring Boot를 시작하면서 Controller-Service-Repository 구조를 따라서 설계하였습니다. 그리고 다른 추가적인 기능이 생기면, 큰 분류로 나누고, 그 안에 엔티티를 기준으로 패키지를 만들어서 관리하였습니다.

위와 같이 Controller-Service-Controller 구조로 설계를 하게 되면, 간단한 프로젝트는 별 영향이 없겠지만, 기능이 많아지고, Entity들이 많아지게 되면, 어떤 상위 폴더 (ex) controller)를 열었을 때, 아래에 Entity 의 개수만큼 패키지가 생기게 되고, 특정 파일을 찾는데 시간이 많이 소요되게 됩니다. 따라서, 해당 패키지 구조에서 기능중심 패키지 구조로 변경하였습니다.

기능 중심 패키지 구조 (Feature Based Packaging)

기능 중심 패키지 구조는 패키지를 기능중심으로 나누는 방법을 이야기 합니다. 예를들어서 User, Project, Function, Function_Detail 의 엔티티가 있다고 가정합니다.

제가 만든 앱은 로그인 기능, 프로젝트 추가 기능, 함수 추가 기능, 함수 세부항목 추가 기능 이렇게 있습니다. 이것을 기능중심으로 나누게 되면 다음과 같습니다.

  • User : 로그인, 유저 정보 조회, 세션
  • Project : 프로젝트 CRUD 기능
  • Function : 함수 및 함수 세부정보 CRUD 기능

위와같이 나누게 되면 패키지 구조가 다음과 같이 형성됩니다. (User의 하위 패키지만 열어놓았음)

위와같이 구성할 수 있습니다. 이 구조의 장점은, 하나의 기능단위 패키지로 이루어져 있기 때문에, 작업을 할 때, 다른 패키지를 건들일이 거의 없게 됩니다. 또한 기능의 확장의 경우, User가 Admin 페이지를 가지게 될 때, Admin 이라는 패키지를 따로 만들 필요 없이 User 안에 있는 controller 에 AdminController 를 추가해도 어색하지 않게 됩니다.

결국 기능단위로 작업할 때, 여러 패키지를 펼치지 않아도 된다는 강력한 이점을 가지게 됩니다.

SpringBoot 카테고리 내 다른 글 보러가기

댓글 남기기