Kim-Baek 개발자 이야기

[카카오 면접] 스프링부트 환경 설정 본문

개발/Spring

[카카오 면접] 스프링부트 환경 설정

김백개발자 2020. 9. 19. 12:56
카카오 면접을 준비하면서, 공부했던 내용을 정리해놓고 다시 기억하기 위한 포스팅

스프링부트는 복잡한 프로젝트 의존성을 '스타터(Starter)' 의존성 수십 개로 해결한다.

그저 프로젝트에 필요한 기능들을 빌드에 선언을 하기만 하면, 그에 필요한 개별 라이브러리들을

자동으로 추가해준다.

 

스타터 의존성을 사용안한다고 생각해보자. 그렇다면 스타터 의존성의 장점을 바로 알 수 있을 것이다.

스프링 부트 없이 빌드하려면 어떤 의존성을 추가해야 할까? 스프링 MVC를 지원하려면 어떤

의존성들이 필요할까? 어떤 버전을 사용해야 잘 호환이 될까?

 

이렇듯 이미 코드 첫줄을 작성하기도 전에 빌드 명세에 어떤 것을 추가하여 기능을 만들어야 할지

많은 고민해야 한다.

 

이러한 많은 고민 끝에 그레이들 빌드 명세에 다음 의존성을 추가했다고 가정해보자.

compile('org.springframework:spring-web:4.1.6.RELEASE')

compile('org.thymeleaf:thymeleaf-spring4:2.1.4.RELEASE')

compile('org.springframework.data:spring-data-jpa:1.8.0.RELEASE')
compile('org.hibernate:hibernate-entitymanager:jar:4.3.8.Final')
compile('com.h2database:h2:1.4.187')

이 의존성 목록은 문제가 없어 보이고, 잘 작동할 것 같다. 하지만 그것을 어떻게 알 수 있을까?

선택한 의존성 버전끼리 서로 잘 호환되는지 어떻게 장담할 수 있을까?

애플리케이션을 빌드하고 실행하기 전까지는 확실히 알 수 없을 것이다.

 

이제 스타터의존성을 사용해보자.

처음으로 돌아가서 무엇을 원하는지 생각해보자. 예를 들어 다음 네가지 기능을 빌드하려 한다.

  • 웹 애플리케이션
  • Thymeleaf 뷰
  • 스프링 데이터 JPA로 데이터를 관계형 데이터베이스에 영속화
  • 테스터

의존성을 추가할 때는 프로젝트를 초기화할 때 체크란을 선택하여 의존성을 추가할 수도 있고,

다음과 같이 나중에 build.gradle 또는 pom.xml에 추가하면 된다.

dependencies{

compile('org.springframework.boot:spring-boot-starter-data-jpa')

compile('org.springframework.boot:spring-boot-starter-data-thymeleaf')

compile('org.springframework.boot:spring-boot-starter-data-web')

runtime('com.h2database:h2')

testCompile('org.springframework.boot:spring-boot-starter-test')

}

전이적 의존성으로 의존성 네 개를 추가하는 것은 개별 라이브러리 수십 개를 빌드에 추가하는 것과

효과가 동일하다.

 

또한 스타터 의존성에서는 오직 필요한 것만 선언했다는 점에 주목하자. 웹 애플리케이션을 빌드한다고

선언했을 뿐 스프링 MVC가 필요하다고 하지는 않았다. JUnit이나 다른 테스트 도구도 지정하지 않았고,

오직 코드를 테스트하고 싶다고만 선언했다.

 

또한 어떤 경우에도 버전을 지정할 필요가 없다. 스타터 의존성 버전은 사용하는 스프링부트 버전에 따라

결정된다.

 

이렇듯 스타터 의존성은 단지 필요한 기능을 명시적으로 추가해주기만 하면 된다.

 

스타터의 전이적 의존성 오버라이드

 

앞서 말한 것처럼 스타터 의존성을 버전을 지정할 필요가 없다. 하지만 경우에 따라서 버전을 지정해야 하고,

선택적으로 오버라이드가 필요한 경우가 있을 것이다.

 

예를 들어 스프링부트 웹 스타터를 생각해보자. 스프링부트 웹 스타터는 Jackson JSON 라이브러리에 전이적

으로 의존한다. 하지만 Jackson 라이브러리가 필요 없을 수도 있다.

 

그레이들을 사용한다면 다음과 같이 전이적 의존성을 제외할 수 있다.

compile('org.springframework.boot:spring-boot-starter-web'){

exclude group: 'com.fasterxml.jackson.core'

}

 

프로젝트 빌드에 이렇게 의존성을 선언 했을 때 전이적 의존성을 참조하는 대신 직접 선언한 의존성을

먼저 참조한다.

 

또한 더 최신에 나온 Jackson 버전을 지정하고 싶은 경우엔 다음과 같이 추가해주면된다.

compile('com.fasterxml.jackson.core:jackson-databind:2.4.3')

 

이렇게 웹 스타터가 참조하는 의존성 버전보다 더 최신일 경우에는 위와 같이 추가만 해주면 문제없이

작동을 하지만, 더 오래된 버전을 사용하고 싶은 경우가 있을 수도 있다.

그럴 경우엔 앞서 설명한 exclude로 jackson을 제외하고 오래된 버전을 명시해서 작성해주면 된다.

반응형
Comments