관리 메뉴

나구리의 개발공부기록

스프링 부트 스타터와 라이브러리 관리, 라이브러리 직접 관리, 스프링 부트 라이브러리 버전 관리, 스프링 부트 스타터 본문

인프런 - 스프링 완전정복 코스 로드맵/스프링 부트 - 핵심 원리와 활용

스프링 부트 스타터와 라이브러리 관리, 라이브러리 직접 관리, 스프링 부트 라이브러리 버전 관리, 스프링 부트 스타터

소소한나구리 2024. 11. 21. 11:18

출처 : 인프런 - 스프링 부트 - 핵심 원리와 활용(유료) / 김영한님  
유료 강의이므로 정리에 초점을 두고 코드는 일부만 인용


1. 라이브러리 직접 관리

1) 라이브러리 관리의 어려움

  • 프로젝트를 처음 시작하면 어떤 라이브러리들을 사용할지 고민하고 선택해야함
  • 스프링 Web, 내장 톰캣, JSON 처리기, 로거 등등 수많은 라이브러리를 선택해야하며 버전까지도 고민해야함
  • 더 심각한 문제는 각 라이브러리들끼리 호환이 잘 되는 버전도 있지만 잘 안되는 버전도 있음
  • 과거에는 이런 문제들 때문에 처음 프로젝트를 세팅하는데 상당히 많은 시간을 소비했음
  • 스프링 부트는 개발자가 라이브러리들을 편리하게 사용할 수 있는 기능들을 제공함

2) 라이브러리 직접 관리

(1) 과거의 라이브러리 관리 방법

  • 직접 라이브러리를 하나하나 고르고 설정하는 방법 실습
  • 스프링 웹과 내장 톰캣을 사용하는 웹 애플리케이션이라고 가정
  • 제공된 프로젝트를 복사해서 사용

(2) build.gradle 확인

  • 스프링으로 간단한 웹 애플리케이션을 실행하려면 생각보다 수많은 라이브러리가 필요함
  • 스프링 웹 MVC, 내장 톰캣, JSON처리, 스프링 부트 관련, LOG, YML 등등 다양한 라이브러리가 사용됨
plugins {
    id 'org.springframework.boot' version '3.0.2'
    id 'java'
}

group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

//스프링 부트 외부 라이브러리 버전 변경
//ext['tomcat.version']='10.1.4'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}


dependencies {

    //1. 라이브러리 직접 지정
    //스프링 웹 MVC
    implementation 'org.springframework:spring-webmvc:6.0.4'
    //내장 톰캣
    implementation 'org.apache.tomcat.embed:tomcat-embed-core:10.1.5'
    //JSON 처리
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.1'
    //스프링 부트 관련
    implementation 'org.springframework.boot:spring-boot:3.0.2'
    implementation 'org.springframework.boot:spring-boot-autoconfigure:3.0.2'
    //LOG 관련
    implementation 'ch.qos.logback:logback-classic:1.4.5'
    implementation 'org.apache.logging.log4j:log4j-to-slf4j:2.19.0'
    implementation 'org.slf4j:jul-to-slf4j:2.0.6'
    //YML 관련
    implementation 'org.yaml:snakeyaml:1.33'

}

tasks.named('test') {
    useJUnitPlatform()
}

 

** 참고

  • io.spring.dependency-management 플러그인은 일부로 적용하지 않았는데 뒤에서 설명함

(3) HelloController - 실행해보기

  • controller패키지 생성 후 작성,
  • 간단한 컨트롤러를 만들어서 동작하는지 확인해보면 정상적으로 라이브러리들이 실행되어 동작함
package hello.controller;

@RestController
public class HelloController {

    @GetMapping("/hello-spring")
    public String hello() {
        return "hello spring!";
    }
}

 

(4) 라이브러리 직접 선택시 발생하는 문제

  • 웹 프로젝트를 하나 설정하기위해서 이렇게 수 많은 라이브러리를 알아야하며 추가로 각각의 라이브러리의 버전까지 골라서 선택해야함
  • 눈에 보이지 않은 가장 어려운 문제는 각 라이브러리들 간에 서로 호환이 잘 되는 버전도 있지만 호환이 잘 안되는 버전도 있다는 점인데 개발자가 라이브러리의 버전을 선택할 때 이런 부분까지 고려하는 것은 매우 어려움

2. 스프링 부트 라이브러리 버전 관리

1) 스프링 부트의 라이브러리 버전 관리

  • 스프링 부트는 개발자 대신에 수 많은 라이브러리의 버전을 직접 관리해줌
  • 개발자는 원하는 라이브러리만 고르고 라이브러리의 버전을 생략해도 되며 스프링 부트가 부트 버전에 맞춘 최적화된 라이브러리 버전을 선택해줌

(1) build.gradle 수정

  • plugins에 io.spring.dependency-management 플러그인을 사용하면 버전 관리 기능을 사용할 수 있음
  • 버전 관리 기능을 추가하였으므로 dependencies의 라이브러리에 버전을 모두 제거하면 부트의 버전과 최적화된 라이브러리 버전을 선택해줌
plugins {
    id 'org.springframework.boot' version '3.0.2'
    id 'io.spring.dependency-management' version '1.1.0'    // 추가
    id 'java'
}

// 기존 동일
dependencies {

    //2. 스프링 부트 라이브러리 버전 관리
    //스프링 웹, MVC
    implementation 'org.springframework:spring-webmvc'
    //내장 톰캣
    implementation 'org.apache.tomcat.embed:tomcat-embed-core'
    //JSON 처리
    implementation 'com.fasterxml.jackson.core:jackson-databind'
    //스프링 부트 관련
    implementation 'org.springframework.boot:spring-boot'
    implementation 'org.springframework.boot:spring-boot-autoconfigure'
    //LOG 관련
    implementation 'ch.qos.logback:logback-classic'
    implementation 'org.apache.logging.log4j:log4j-to-slf4j'
    implementation 'org.slf4j:jul-to-slf4j'
    //YML 관련
    implementation 'org.yaml:snakeyaml'

}

 

(2) 실행

  • 실행해보면 이전과 같이 정상적으로 동작하는 것을 확인할 수 있음

(3) dependency-management 버전 관리

  • io.spring.dependency-management 플러그인을 사용하면 spring-boot-dependencies에 있는 bom 정보를 참고함
  • spring-boot-dependencies는 스프링 부트 gradle 플러그인에서 사용하기 때문에 일반적으로 개발자의 프로젝트에서 별도의 명령없이는 보이지 않음

(4) 버전 정보 bom

  • github링크
  • 링크의 build.gradle 문서안에 보면 bom이라는 항목이 있는데 각각의 라이브러리에 대한 버전이 명시되어있으며 물론 스프링 부트의 버전에 따라 모두 정해놓은 것이기에 스프링 부트의 버전을 바꿔서 확인해보면 라이브러리의 버전도 바뀜

** 참고

  • 스프링 부트가 관리하는 외부 라이브러리 버전을 확인하는 방법
  • 스프링 공식 사이트에서 스프링 부트가 관리하는 외부 라이브러리 버전을 확인할 수 있으나 스프링 부트가 관리하지 않는 외부 라이브러리도 있는데, 그런 라이브러리들은 버전 정보를 직접 적어주어야 함
  • 아직 잘 알려지지 않았거나 대중적이지 않은 라이브러리들이 이런 경우가 있음

(5) 정리

  • 스프링 부트가 제공하는 버전 관리는 스프링 자신을 포함해서 수 많은 외부 라이브러리의 버전을 최적화 해서 관리해주기에 개발자는 스프링 부트 자체의 버전만 지정하면됨
  • 그리고 스프링 부트가 해당 스프링 부트 버전에 맞는 각 라이브러리의 호환성을 테스트 했기 때문에 안전하게 사용할 수 있음(물론 100% 완벽할 순 없음)

3. 스프링 부트 스타터

1) 스프링 부트 스타터 제공

  • 앞서 보았듯이 웹 프로젝트를 하나 실행하려면 생각보다 수 많은 라이브러리가 필요한데 개발자 입장에서는 일반적으로 많이 사용하는 대중적인 라이브러리들을 포함해서 간단하게 시작하고 싶을 수 있음
  • 스프링 부트는 이런 문제를 해결하기 위해 프로젝트를 시작하는데 필요한 관련 라이브러리를 모아둔 스프링 부트 스타터를 제공함
  • 스프링 부트 스타터덕분에 누구나 쉽고 편리하게 프로젝트를 시작할 수 있게됨

(1) build.gradle 수정

  • dependencies에 아래의 설정 한줄로 지금까지 직접 넣어주었던 모든 라이브러리가 포함됨
  • spring-boot-starter-web라이브러리는 편리하게 의존성을 모아둔 세트이므로 관련 의존성 세트가 한번에 들어오며 스타터도 다른 스타터를 가질 수 있음
  • 스프링과 웹을 사용하고 싶으면 spring-boot-starter-web을 입력해주면 스프링 웹 MVC, 내장 톰캣, JSON 처리, 스프링 부트 관련, LOG, YML 등등 을 모두 가져옴
  • 스프링과 JPA를 사용하고 싶으면 spring-boot-starter-jpa를 입력해주면 스프링 데이터 JPA, 하이버네이트 등등을 모두 가져옴
// 기존 설정 동일
dependencies {
    //3. 스프링 부트 스타터
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

(2) 스프링 부트 스타터 - 이름 패턴

  • spring-boot-starter-*
  • 패턴을 알고 있으면 관련된 스타터를 쉽게 찾게 도와줌
  • 공식: spring-boot-starter-*
  • 비공식: thirdpartyproject-spring-boot-starter
    - ex) mybatis-spring-boot-starter

(3) 자주 사용하는 스프링 부트 스타터

  • 보통은 직접 스타터를 입력하지 않고 스타터 사이트를 통해 스타터를 검색하여 프로젝트를 생성
  • spring-boot-starter : 핵심 스타터, 자동 구성, 로깅, YAML
  • spring-boot-starter-jdbc : JDBC, HikariCP 커넥션풀
  • spring-boot-starter-data-jpa : 스프링 데이터 JPA, 하이버네이트
  • spring-boot-starter-data-mongodb : 스프링 데이터 몽고
  • spring-boot-starter-data-redis : 스프링 데이터 Redis, Lettuce 클라이언트
  • spring-boot-starter-thymeleaf : 타임리프 뷰와 웹 MVC
  • spring-boot-starter-web : 웹 구축을 위한 스타터, RESTful, 스프링 MVC, 내장 톰캣
  • spring-boot-starter-validation : 자바 빈 검증기(하이버네이트 Validator)
  • spring-boot-starter-batch : 스프링 배치를 위한 스타터
  • 스프링 부트 스타터의 전체 목록

(4) 라이브러리 버전 변경

ext['tomcat.version'] = '10.1.4' // dependencies위에 입력해주면 됨
dependencies{
   // ... 라이브러리 목록
}