애플리케이션을 개발하면서 패키지를 구성하는 방법에는 여러가지 차이가 존재한다고 한다. 나 또한 이러한 문제점에 봉착했고 실제로 개발을 하면서도 느낀건 애플리케이션의 규모가 커질수록 늘어나는 패키지와 클래스 그리고 인터페이스 등을 어떻게 관리하고 이후에 확장성을 고려했을 때 혹은 협업을 하는 경우 어떤 방향으로 가는 것이 더 효과적인지 고민해볼 필요가 있었다.
해당 글은 참고링크의 글을 구글 번역과 나름의 의역을 통해서 게시하였음을 밝힌다. 글쓴이는 패키지를 구성하는 방식을 두가지로 구분지어 설명하였다. 하나는 Package By Feature 또 다른 하나는 Package By Layer 이다. 알아보자
Package By Feature
기능별로 패키지를 묶어놓은 형태를 의미한다. 단일 기능과 관련된 특징들 혹은 그 단일 기능 자체만을 하나의 디렉토리 혹은 패키지에 배치하는 것을 의미한다. 이렇게 한다면 높은 응집력(cohesion)과 높은 모듈성(modularity)을 지니게 되며, 패키지간 결합도가 최소화된다. 하나의 패키지 내에 관련한 기능들이 모두 들어있기 때문이다. 아래는 예시이다.
com.app.doctor
com.app.drug
com.app.patient
com.app.presription
com.app.report
com.app.security
com.app.webmaster
com.app.util
- com.app.doctor
- DoctorAction.java : an action or controller object
- Doctor.java : a Model Object
- DoctorDAO.java : Data Access Object
- database items (SQL statements)
- user interface items ( JSP.. )
기능별 패키지의 아이디어는 한 패키지가 다른 패키지에 속한 항목을 절대로 사용할 수 없다는 것을 의미하는 것이 아니다. Package By Feature 는 aggressively (적극적으로) 하게 package-private 를 기본 scope로 선호하지만, 경우에 따라서는 항목의 범위를 공용으로 늘린다.
Package By Layer
레이어를 기준으로 패키지를 구별하는 것을 의미한다. 아래는 예시이다.
com.app.action
com.app.model
com.app.dao
com.app.util
- Higher Modularity
- 앞선 설명처럼 높은 응집도 및 높은 모듈성을 의미한다. - Easier Code Navigation
- 패키지 간의 이동에 불편함을 크게 줄이며, 패키지의 응집도가 높기 때문에 코드 탐색에 대해서 수월함을 제공한다. - Higher Level of Abstraction
- 하이 레벨의 추상화에 존재하는 것은 프로그래밍의 가치를 이끌어내는 기본적인 원칙이라고 한다. Package By Layer 의 근본적인 문제는 하이 레벨의 추상화보다 로우 레벨의 구현 내용들을 더 우선시하고 있다는 것이다. 표현이 어려운데, 패키지 자체로 보여지는 것들이 사실상 하이 레벨의 내용들이 아닌 로우 레벨의 내용들이기 때문에 추상화를 시켰다고 하더라도, 패키지가 보여지는 관점들은 우리 프로그래밍이 추구하는 이상적인 가치와 상이하다는 것이다. - Separates Both Features and Layers
- Minimizes Scope
- 모든 항목을 단일 패키지 내부에서 packag-private 형태로 구현하는 것이 좋은가 혹은 공용으로 다같이 여기저기서 쓰이는 것이 좋은가를 의미한다. 모듈을 쓰고자 한다면 응집도와 결합도를 생각하였을 때 우리는 어떤 부분을 낮추고 높이는 지에 대해서 잘 알고 있다. - Better Growth Style
- 기능이 추가되면 패키지를 늘리면서 분할하고 내부적으로 파일을 생성함으로써 확장성을 고려할 수 있지만, 레이어 단위로 패키지를 구분하게 된다면 해당 레이어 내부에 쓰이는 비즈니스 로직과 관련된 파일은 무수하게 많이 생성될 것이고 이후에는 리팩토링 하는 작업에 있어서도 결합도가 높기 때문에 많은 시간과 자원을 소모할 것이다.
나름의 해석을 하였지만 자세한 내용은 보고자 한다면 아래의 링크를 클릭하길 바란다.
'Spring' 카테고리의 다른 글
20180622 Spring Security (0) | 2018.06.22 |
---|---|
20180620 스프링 인터셉터 사용기. (0) | 2018.06.20 |
20180319 Jackson JSON Java Parser API (0) | 2018.03.19 |
20180306 ContextLoaderListener & DispatcherServlet 이해 (0) | 2018.03.06 |
20180301 @Autowired 에 대한 이해. (0) | 2018.03.01 |