스프링 부트는 어떻게 의존성을 관리하는가? (feat. maven)

김종하·2020년 12월 22일
2

Spring boot booster

목록 보기
10/13

<!> 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 뿐인데, 수 많은 라이브러리들이 추가된 사실을 알 수 있다. 이러한 의존성들은 어디서 설정됐길래 들어오는 것일까?

maven의 상속을 이용한 의존성 관리

    <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-starter-parent 도 spring-boot-dependencies 의 자식임을 확인할 수 있다. 이를 도식화 해보자면 다음과 같이 나타낼 수 있겠다.


다음으로, <properties> 태그 안에서 자바 버전과 컴파일러 버전, 그리고 프로젝트의 encoding 을 설정하고 있는 모습도 확인할 수 있다.

참고로, 저의 경우 자바버전을 11로 세팅하고 프로젝트를 생성했는데 1.8 버전이 쓰여있어서 세팅을 8로 했었나 하고 다시 확인해보니
생성한 pom.xml 에서 11버전으로 오버라이딩하고 있음을 확인할 수 있었다.


밑의 사진처럼 resource 를 설정하는 부분도 확인할 수 있고 이외에도 plugin 설정도 하고 있는 것을 알 수 있다.

하지만, 여전히 수 많은 dependecy 들이 어디서 들어오는지는 알 수 없으니, 상위 pom 파일로 가보도록 하자.

spring-boot-dependencies

바로 이곳에서, 가져온 수 많은 라이브러리들의 의존성이 설정되어있는 모습을 확인할 수 있었다.


실제 내가 생성한 프로젝트가 사용하는 버전과 spring-boot-dependencies 에서 설정되어있는 버전이 동일한지 랜덤한 라이브러리 버전을 확인해보았다.

설정한 대로 추가될테니 너무도 당연하겠지만, 설정한 버전이 사용되고 있음을 확인할 수 있었다.

maven 의 properties

참고로, maven 에서 <properties> 를 사용하면 중복적으로 사용하는 부분을 변수처럼 활용하여 사용할 수 있다.
예를들어 <hsqldb.version>2.5.1</hsqldb.version> 을 프로퍼티 태그안에 적어두고
해당 버전을 사용하는 모든 곳에 ${hsqldb.version} 를 적어둔다면, 버전이 변경되었을 때, properties 내부의 버전정보만 수정해주면 됨으로, 상당히 편리하다.

intellij ultimate 의 intelligence..


인텔리제이를 사용하다 보면 빠져나오기 힘들정도로, 인텔리제이는 상당히 편리한 기능들을 많이 제공해준다.. 좌측에 자그마한 아이콘이 보이는데, 해당 아이콘을 통해 지금 설정한 dependecy 부모로부터 관리되는 dependecy임을 확인할 수 있다.

포인터를 가져다 되면, 이렇게 부모에서 어떤 버전정보로 관리하고 있는지 확인할 수 있고 클릭하면 그곳으로 가게된다.


maven 의 상속을 활용하여 spring boot 가 어떻게 의존성을 관리하는지 확인할 수 있었다. 필요에 따라 boot 가 제공하는 버전이 아닌, 직접 설정한 버전을 사용해야 하는 경우에는 생성한 pom 파일에 명시적으로 써놓으면 오버라이딩 되어 사용된다. 더 많은 설정한 정보들의 우선순위는 래퍼런스를 찾아보도록 하자.


*참고: 이 포스팅은 백기선님의 스프링부트 강의를 듣고, 제 나름대로 다시 공부하고 정리한 포스팅 입니다. 만약, 조금 더 자세한 내용을 듣고 싶으시다면 이곳의 강의를 참고해보시기 바랍니다

0개의 댓글