본문으로 건너뛰기
Advertisement

2.3 스타터 의존성과 자동 설정 (Starters & Auto-Configuration)

이전 장에서 클릭 몇 번으로 편하게 추가했던 '스타터(Starters)' 와, 아무런 코드 작성 없이 톰캣 웹 서버가 뜬 마법인 '자동 설정(Auto-Configuration)' 의 원리를 파헤쳐 봅니다. 이 두 가지는 스프링 부트의 알파이자 오메가입니다.

1. 스프링 부트 스타터 (Spring Boot Starters)

과거 개발자들은 웹 애플리케이션을 하나 띄우려면 spring-webmvc, jackson-databind, tomcat-embed-core 등 수많은 라이브러리를 개별적으로 찾아서 버전을 맞추어 build.gradle (또는 pom.xml)에 복사해 넣어야 했습니다. 버전이 1이라도 맞지 않으면, 원인 모를 끔찍한 충돌 컴파일 에러가 발생했습니다.

스타터의 해결책

스프링 부트는 특정 목적(웹 개발, DB 연결, 시큐리티 등)을 달성하기 위해 함께 쓰이면 가장 좋은 라이브러리들(의존성 묶음)을 세트로 모아 제공 합니다. 이것이 바로 스타터(Starter)입니다.

build.gradle 파일을 열어보면 아래와 같은 코드를 볼 수 있습니다.

dependencies {
// 단 한 줄만 추가했지만...
implementation 'org.springframework.boot:spring-boot-starter-web'
}

이 한 줄이 추가되는 순간, 뒤에서는 안정성이 검증된 톰캣 내장 서버 라이브러리, JSON 처리 라이브러리, REST API 처리 코어 모듈 등 30개가 넘는 하위 필수 라이브러리들이 스프링 부트에 의해 일괄적으로 묶여서 알아서 다운로드 된 것입니다.

2. 자동 설정 (Auto-Configuration)의 마법

"라이브러리만 받아왔는데 어떻게 바로 포트 8080에 톰캣 서버가 코딩 한 줄 없이 뜰 수 있는 걸까요?"

비밀은 프로젝트를 생성할 때 자동으로 만들어진 메인 클래스에 붙어있는 단 하나의 애너테이션, @SpringBootApplication 에 숨어있습니다.

@SpringBootApplication의 내부 구조

이름은 하나지만, Ctrl (Mac은 Cmd) 키를 누르고 해당 애너테이션을 클릭해보면 내부적으로 크게 세 가지 핵심 기능을 품고 있습니다.

  1. @SpringBootConfiguration: 여기가 스프링 부트의 기본 메인 설정 파일임을 나타냅니다.
  2. @ComponentScan: 이 클래스가 속한 패키지를 가장 최상단 루트(Root)로 삼아, 하위에 있는 모든 빈(@Controller, @Service 등)을 샅샅이 뒤져내어 찾아 메모리에 등록합니다.
  3. @EnableAutoConfiguration: 이게 바로 마법의 핵심입니다. ** 이 클래스 경로(Classpath)에 아까 '스타터'로 받아온 톰캣(Tomcat)이나 웹(Web) 관련 라이브러리 파일이 존재하는지 쓱 훑어봅니다.**발견되는 순간, "아, 이 개발자는 웹 서버를 만들려고 하는구나!" 라고 눈치채고, 톰캣을 8080 포트로 실행시키는 수십 줄의 초기화 자바 코드를 백그라운드에서 자동으로 실행해버립니다.

요약: 스프링 부트의 2단 콤보

  1. "나 웹 서버 만들거야"-> 개발자가 spring-boot-starter-web 스타터 의존성을 한 줄 추가합니다. (재료 준비 완료)
  2. "오케이, 톰캣과 웹 환경 세팅해줄게"-> @SpringBootApplication의 자동 설정 기능이 재료를 쓱 보고 알아서 최적의 레시피로 요리를 마친 뒤 밥상을 차려줍니다.
Advertisement