<!> Maven 을 기반으로 포스팅하였습니다.
<!> Intellij Ultimate 버전이 사용되었습니다.
다음은 spring initializr 를 사용하여 스프링 프로젝트를 생성했 때 생기는 pom.xml 파일의 일부와, 받아온 외부 라이브러리 목록의 일부이다.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
dependency 로 추가한 것은 spring-boot-starter 와 spring-boot-starter-test 뿐인데, 수 많은 라이브러리들이 추가된 사실을 알 수 있다. 이러한 의존성들은 어디서 설정됐길래 들어오는 것일까?
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
maven 에서 <parent> 를 사용하면, 상속관계를 나타내주게 된다. 이러한 상속을 이용하면 <parent> 에 정의된 프로젝트의 dependecy 를 현재 프로젝트에도 적용시켜줄 수 있다.
즉, 위에서 spring initializr 로 생성한 프로젝트는 spring-boot-starter-parent 프로젝트의 POM.XML을 상속받게 되는 것이다.
그렇다면, spring-boot-starter-parent 의 생김새는 어떠할까?
많은 설정들이 되어있기 때문에, 부분부분 긁어서 확인해보도록 하겠다.
우선, spring-boot-starter-parent 도 spring-boot-dependencies 의 자식임을 확인할 수 있다. 이를 도식화 해보자면 다음과 같이 나타낼 수 있겠다.
다음으로, <properties> 태그 안에서 자바 버전과 컴파일러 버전, 그리고 프로젝트의 encoding 을 설정하고 있는 모습도 확인할 수 있다.
참고로, 저의 경우 자바버전을 11로 세팅하고 프로젝트를 생성했는데 1.8 버전이 쓰여있어서 세팅을 8로 했었나 하고 다시 확인해보니
생성한 pom.xml 에서 11버전으로 오버라이딩하고 있음을 확인할 수 있었다.
밑의 사진처럼 resource 를 설정하는 부분도 확인할 수 있고 이외에도 plugin 설정도 하고 있는 것을 알 수 있다.
하지만, 여전히 수 많은 dependecy 들이 어디서 들어오는지는 알 수 없으니, 상위 pom 파일로 가보도록 하자.
바로 이곳에서, 가져온 수 많은 라이브러리들의 의존성이 설정되어있는 모습을 확인할 수 있었다.
실제 내가 생성한 프로젝트가 사용하는 버전과 spring-boot-dependencies 에서 설정되어있는 버전이 동일한지 랜덤한 라이브러리 버전을 확인해보았다.
설정한 대로 추가될테니 너무도 당연하겠지만, 설정한 버전이 사용되고 있음을 확인할 수 있었다.
참고로, maven 에서 <properties> 를 사용하면 중복적으로 사용하는 부분을 변수처럼 활용하여 사용할 수 있다.
예를들어 <hsqldb.version>2.5.1</hsqldb.version> 을 프로퍼티 태그안에 적어두고
해당 버전을 사용하는 모든 곳에 ${hsqldb.version} 를 적어둔다면, 버전이 변경되었을 때, properties 내부의 버전정보만 수정해주면 됨으로, 상당히 편리하다.
인텔리제이를 사용하다 보면 빠져나오기 힘들정도로, 인텔리제이는 상당히 편리한 기능들을 많이 제공해준다.. 좌측에 자그마한 아이콘이 보이는데, 해당 아이콘을 통해 지금 설정한 dependecy 부모로부터 관리되는 dependecy임을 확인할 수 있다.
포인터를 가져다 되면, 이렇게 부모에서 어떤 버전정보로 관리하고 있는지 확인할 수 있고 클릭하면 그곳으로 가게된다.
maven 의 상속을 활용하여 spring boot 가 어떻게 의존성을 관리하는지 확인할 수 있었다. 필요에 따라 boot 가 제공하는 버전이 아닌, 직접 설정한 버전을 사용해야 하는 경우에는 생성한 pom 파일에 명시적으로 써놓으면 오버라이딩 되어 사용된다. 더 많은 설정한 정보들의 우선순위는 래퍼런스를 찾아보도록 하자.
*참고: 이 포스팅은 백기선님의 스프링부트 강의를 듣고, 제 나름대로 다시 공부하고 정리한 포스팅 입니다. 만약, 조금 더 자세한 내용을 듣고 싶으시다면 이곳의 강의를 참고해보시기 바랍니다