Spring

QuickStart 스프링부트_Chapter02_스프링 부트의 의존성 관리

강용민 2022. 12. 7. 18:16

1. 스프링 부트의 의존성 관리

스프링 부트를 구성하는 핵심 요소는 다음과 같다.

요소 기능
스타터(Starter) 스프링이 제공하는 특정 모듈을 사용할 수 있도록 관련된 라이브러리 의존성을 해결한다.
자동설정
(AutoConfiguration)
스타터를 통해 추가한 모듈을 사용할 수 있도록 관련된 빈 설정을 자동으로 처리해준다.
액추에이터(Actuator) 스프링 부트로 개발된 시스템을 모니터링할 수 있는 다양한 기능을 제공한다.

스프링 부트의 동작 원리를 이해할 수 있도록 위 세 가지 요소중 스타터와 자동설정을 중심으로 살펴본다.

 

1.1 스타터로 의존성 관리하기

스타터 이해하기

Spring boot은 build.gradle 또는 pom.xml에서 의존성을 관리한다. 그렇기에 새로운 의존성을 추가하기 위해서는 pom.xml에 <dependency>설정을 추가해야한다. 만약 해당 프로젝트에 hibernate를 추가하고 싶다면 mvnrepository에서 검색해 pom.xml에 추가하면 된다.

그런데 문제는 프로젝트에 hibernate 관련 의존성만 추가했다고 해서 스프링과 JPA연동을 바로 처리할 수는 없다는 것이다. 즉 스프링과 JPA를 연동하기 위해서는 hibernate외에 spring-orm 이나 spring-data-jpa 같은 라이브러리들이 추가로 필요하다. 이런 문제를 효과적으로 해결하기 위해서 제공하는 것이 바로 스프링 부트의 스타터다.

스타터는 필요한 라이브러리들을 관련된 것끼리 묶어서 마치 패키지처럼 제공한다. 

 

2. 스프링 부트의 자동설정

라이브러리만 추가한다고 해서 추가된 모듈을 바로 사용할 수 있는 것은 아니다.

라이브러리들이 추가되고 나면 추가된 모듈을 사용할 수 있도록 스프링 설정 파일에 빈 등록도 해야 하고 의존성 주입도 적절히 처리해야 한다. 스프링 부트는 이 때 도움을 준다.

 

2.1 자동설정 이해하기

자동설정이란?

스프링  MVC를 이용하여 웹 애플리케이션 개발을 경험이 있다면 기본적으로 여러 가지 설정이 필요하다는 것을 알고 있다.

하지만 지금까지 우리는 이런 복잡한 설정 없이도 웹 애플리케이션을 만들고 실행할 수 있었다. 이런 것이 가능한 이유는 스프링 부트가 제공하는 자동설정 기능이 동작하여 수많은 빈들이 등록되고 동작했기 때문이며, 그것은 @SpringBootApplication 때문이다.

 

Chapter01Application.java

package com.rubypaper;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Chapter01Application {

    public static void main(String[] args) {
        SpringApplication.run(Chapter01Application.class, args);
    }

}

@SpringBootApplication에는 @EnableAutoConfiguration 어노테이션 외에도 @ComponentScan, @SpringBootConfiguration등 여러 어노테이션이 포함되어있다. 각 어노테이션은 다음과 같은 역할을 한다.

  • @SpringBootConfiguration : 기존의 환경설정 빈 클래스를 표현하기 위해 사용했던 @Configuration과 동일하다.
  • @EnableAutoConfiguration, @ComponentScan :  스프링 컨테이너 초기화와 관련된 어노테이션이션이다.
  • @ComponentScan : @Configuration, @Repository, @Service, @Controller, @RestController가 붙은 객체를 메모리에 올리는 역할을 한다. 

@EnableAutoConfiguration과 @ComponentScan은 각각 객체들을 초기화할 때 사용하는데, 이렇게 두 단계로 나누어 빈들을 초기화하는 이유는 애플리케이션을 운영하기 위해서는 두 종류의 빈들이 필요하기 때문이다.

예를 들어 우리가 웹 애플리케이션에서 파일 업로드 기능을 추가한다고 가정하자. 파일 업로드를 추가하기 위해서는 먼저 MultipartFile 객체를 이용해서 업로드 가능한 컨트롤러로 구현해야 한다. 그런데 사용자가 업로드한파일 정보가 MultipartFile 객체에 설정되어야 하며, 이를 위해서 멀티파트 리졸버 객체가 반드시 필요하다. 즉 파일 업로드가 정상적으로 동작하기 위해서는 내가 만든 컨트롤러뿐만 아니라 이르 ㄹ위해 멀티파트 리졸버 객체를 메모리에 올리는 두 개의 객체 생성 과정이 필요한 것이다. 결국 @ComponentScan은 내가 만든 컨트롤러 객체를 메모리에 올리는 작업을 처리하고 @EnableAutoConfiguration은 CommonsMultipartResolver 같은 객체들을 메모리에 올리는 작업을 처리한다.