드롭박스가 Public folder 기능을 없애기로 해서 mdblog 기능자체에 커다란 문제가 생겼다 - mdblog는 컨텐츠의 소스로 드롭박스의 퍼블릭 폴더 기능을 사용한다.
여러가지 다른 대안을 찾아보다가 매번 커밋의 번거로움은 있지만, 그래도 깃허브가 가장 낫다고 결론내리고 깃허브를 이용할수 있게 mdblog 기능을 수정하였다. 그리고 수정하면서, 기존에 바꾸고 싶었던 구조개선도 함께 하였다.
ContentSource - ContentStore
mdblog가 poklog의 블로그 툴로 역할을 시작한게 poklog version3 인데, 이후 앱엔진과 자바로 변경하는 작업이 한번 있었다. (이때는 외형적인 변경은 커보였지만, 내부 로직의 변경은 거의 없었다)
이후 AppEngine의 캐시기능을 이용하는 리팩토링을 거치면서 ContentStore라는 domain layer 계열이 생겼는데, 이것은 기능면에서나 구조면에서 꽤 큰 변경이었다.
이번에 리팩토링의 주요한 목표중에 하나는 모델과 뷰를 좀더 잘 나누자는 거였다. 사실 mdblog의 주요 모델인 markdown 파일은 모델로서 컨텐츠를 다루기도 하지만, 서식/Tag/Side pannel같은 뷰의 영역을 같이 포함하고 있어 둘을 분리하기가 좀 까다롭다.
그래서 컨텐츠를 제공하는 Source를 다른 영역에서 분리하여 최대한 모델 본연(markdown파일에 가까운 영역)의 역할을 하도록 수정하였다.
Package By Layer, not Feature
나는 기본적으로 패키지는 응집력(Cohesion)있게 묶여야 하며 그래서 기능별 패키징(by feature)을 레이어별 패키징보다 선호하는 입장이었다.
그런데, 레이어로 나누는것이 생각보다 장점이 많은것 같다.
- 내가 개발하는 거의 모든 어플리케이션은 모델, 뷰, 그리고 둘을 컨트롤하거나 엮어주는 무엇으로 레이어링하여 사고하고 개발하는것이 가능했고 그렇게 개발하는것이 생각의 복잡도를 낮추고 생산성을 높였다.
- 어느 도메인으로 이동하여 개발하든, 적절한 레이어링은 사고를 추상화하여 좀더 많은 관점을 고민하는데 큰 도움이 되었다.
- 기능은 도메인에 종속되는 경우가 많으나 레이어링은 도메인으로부터 좀더 자유로운 경향이 있었다.
그래서 이번에는 레이어로 패키징하는 방법을 적용하였다. (mdblog뿐만이 아니라 최근에 진행중인 대부분의 개발을 레이어 패키징 방식으로 개발하고 있다.
Constructor Injection
생성자에서 필요한 의존성이 모두 설정되는것은 의존성 계산 측면에서 매우 좋은것 같다. 그래서 기존의 Setter Injection을 Constructor Injection으로 변경하였다. (이것도 현재 진행중인 대부분의 개발에 공통 적용하고 있는 내용이다)