Maven – Coc (Convention over Configuration)

Coc(Convention over Configuration)는 간단한 개념이다.
시스템들과 라이브러리, 프레임워크는 별도의 설정 시스템 없이 ‘바로 실행’ 될 수 있어야 한다는 요구사항이 없더라도, 기본적으로 이러한 사항이 당연하다고 가정한다.
CoC의 실증으로, EJB3 영속성(Persistence)이 있다.
개별적인 영속성있는 빈을 만들기 위해서는 클래스에 @Entity라고 어노테이션을 명기하는 것이 전부이다. 프레임웍에서는 테이블 명을 클래스 명, 컬럼을 프로퍼티 명으로 가정할 것이다. 필요한 경우 제공된 이름들을 재정의 할 수 있도록 제공하는데, 대부분 불필요하다.
급하게 진행되는 프로젝트의 경우 프레임워크에서 제공하는 기본적인 정의들을 활용하는 게 낫다.

메이븐은 프로젝트에 관한 상식적인 기본 정의들을 CoC를 바탕으로 구체화 한다.
소스코드는 ${basedir}/src/main/java
리소스는 ${basedir}/src/main/resources
테스트 코드는 ${basedir}/src/test
컴파일 하면 ${basedir}/target/classes 에 바이트 코드가 생성되고
배포할 수 있는  JAR  파일은 ${basedir}/target에 생성될 것이라고 가정한다.

이런 가정이 하찮게 보일지도 모르겠지만, 대부분의 앤트 기반 빌드에서는 각 서브 프로젝트에서 이러한 디렉토리의 위치를 각기 정의한다.
메이븐은 단지 디렉토리 위치를 간단한게 하려는 것보다 소스 코드의 컴파일, 배포를 위한 패키징, 웹 사이트의 생성과 많은 다른 프로세스들을 위한 일반적인 관례들을 메이븐의 핵심 플러그인들에 적용하기 위해 CoC를 채용하였다. 이런 관례는 사용자가 선택할 수 있지만 관례를 따른다면 메이븐이 알아서 해주기 때문에 해야할 일들이 없다.
이것은 또한 사용자가 특수한 관례에 구속되어 있다고 느낄수 있다. 하지만 대부분은 사용자가 직접 정의 할 수 있다. 메이븐은 요구사항들에 적합하게 기본적인 것들을 사용자가 정의할 수 있도록 허용한다.

현대적인 프레임웍에서는  CoC적인 접근 방벙을 사용하고 있다.

  • Ruby on Rails
  • Zend Framework
  • Grails
  • Spring
  • Castle MonoRail
  • Junit
  • JBoss Seam
  • CakePHP
  • symfony
  • kohana

전통적으로, 프레임워크는 여러 다중 설정 파일들을 필요로 한다.  설정 파일은 많은 설정을 포함한다.
애플리케이션의 복잡도에 따라 이러한 설정 파일들읠 수와 크기는 매우 쉽게 늘어난다. 이에 따라 설정의 방법도 복잡해지며, 개발자가 일일이 이러한 설정을 해야 하기 때문에 개발의 속도는 감소되고, 개발의 복잡도는 증가한다. 따라서 개발자는 애플리케이션에서 관습적이지 않은 면 (unconventional aspects of the application)만 정의할 필요가 있다는 개념이다.

Reference

  • Maven sonatype이 만든 Maven 핵심가이드 / 팀 오브라이언 지음,  장선진 옮김/  지앤선