SPRING/Spring Boot

[SpringBoot] 자동구성 라이브러리 만들기

IT록흐 2023. 4. 29. 21:05
반응형

 

한 SpringBoot 프로젝트에서 추가기능이 필요하여 라이브러리를 하나 만들었다고 가정하자.

 

라이브러리는 클래스파일 모음으로 POJO이다.

IOC컨테이너에 POJO를 Bean으로 등록하려면 설정파일을 읽어야 한다.

 

 

 

 

 

하지만 문제가 하나 있다.

설정파일은 @Configuration 어노테이션으로 선언된 Java클래스이다.

 

SpringBoot는 컴포넌트 스캔으로 @Configuraion으로 선언된 클래스를 스캔하여 Bean을 등록한다. 그러므로 라이브러리를 추가하려면 개발자는 설정클래스를 SpringBoot가 스캔할 수 있도록 디렉토리에 구현해야 한다. 그렇게 되면 개발자는 어떤 객체를 Bean으로 등록해야 하는지 어떻게 설정 파일을 구성해야 하는지 가이드를 보며 공부해야만 한다.

 

이런 별도의 구현없이 라이브러리를 Gradle에서 추가하기만 하면

SpringBoot가 자동으로 설정파일을 읽어 Bean을 등록하게 하는 방법은 무엇일까?

 

바로, 자동구성이 가능한 라이브러리를 만드는 것이다.

 

 

자동구성 라이브러리 만들기

 

 

 

 

위 라이브러리를 메모리 정보를 알려주는 라이브러리이다.

자동구성 라이브러리는 크게 두 가지를 알면 된다.

 

1. JAVA 클래스

 

JAVA 클래스는 설정클래스와 기능구현을 담당한 POJO클래스가 있다.

MemoryAutoConfig 클래스가 설정클래스로 IOC컨테이너에 어떤 Bean을 등록해야 하는지 정리되어 있다.

 

MemoryAutoConfig.java

@AutoConfiguration // 자동구성 설정 어노테이션
@ConditionalOnProperty(name = "memory", havingValue = "on")
public class MemoryAutoConfig {

    @Bean
    public MemoryController memoryController() {
        return new MemoryController(memoryFinder());
    }

    @Bean
    public MemoryFinder memoryFinder() {
        return new MemoryFinder();
    }
}

 

2. 설정파일

 

자동구성 라이브러리를 추가한 프로젝트는 어떤 클래스가 설정클래스인지 알아야 한다.

이를 위해, 약속된 위치에 자동구성이 구현된 설정파일 위치를 명시해야 한다.

 

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일에

 

memory.MemoryAutoConfig

 

위 내용을 추가하면 된다. 

자동구성 라이브러리를 추가한 Spring프로젝트는 약속된 위치의 파일을 읽어 자동구성클래스를 파악하여 Bean을 등록한다. 

 

이제 build하여 라이브러리(jar)를 만들어 보자. 

 

plugins {
    id 'java'
}

group = 'memory'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web:3.0.2'
    compileOnly 'org.projectlombok:lombok:1.18.24'
    annotationProcessor 'org.projectlombok:lombok:1.18.24'
    testImplementation 'org.springframework.boot:spring-boot-starter-test:3.0.2'
}

test {
    useJUnitPlatform()
}

 

자동구성 라이브러리를 build 해서 생성해야 한다.

위 파일은 build.gradle 내용이다. SpringBoot 전용 jar가 아닌 순수 jar로 라이브러리를 만들어야 하므로 plugins에 SpringBoot 설정을 제거한 모습니다. 

 

 

터미널로 프로젝트 위치로 이동하여 build를 진행한다.

명령어 : ./gradlew clean build

 

 

 

build > libs 디렉토리로 이동하면 jar 하나가 생성되어 있음을 알 수 있다.

 

 

자동구성 라이브러리 추가하기 

 

SpringBoot 프로젝트를 하나 생성하여 자동구성 라이브러리를 추가해보자.

 

 

libs 폴더를 하나 생성하여 앞에서 생성한 jar를 복사 붙여넣기 한다.

 

plugins {
    id 'org.springframework.boot' version '3.0.2'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
}

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

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation files('libs/memory-v2.jar') // 라이브러리가 위치할 경로를 지정!!
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

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

 

그리고 build.gradle 파일의 dependencies에  implementation files('libs/memory-v2.jar') 를 추가한다.

 

위 과정이 완료되면 

우리는 외부라이브러리를 별도의 설정파일 구현없이 사용할 수 있다. 

 

프로젝트를 실행시켜보자. 

 

메모리 사용량을 나타내는 기능이 구현되었다.

localhost:8080/memory 경로로 요청이 들어왔을때 응답할 Controller를 직접 구현하지 않았지만

이렇게 접근이 가능하다.

 

외부라이브러리 jar를 추가하고 빌드할 수 있도록 build.gradle에 추가만 하였을뿐인데

자동으로 Bean이 등록되어 서비스를 이용할 수 있다.

 

SpringBoot에 사용되는 많은 라이브러리들은 자동구성으로 구현되어 있다.

그래서 굳이 컴포넌트 스캔이 되지 않아도 이미 Bean으로 등록되어 있다.

 

다음 포스팅에서는 SpringBoot의 자동구성은 어떻게 구현되어 있는지 살펴보겠다.

 

 

 


 

 

참고자료

 

스프링 부트 - 핵심 원리와 활용 - 인프런 | 강의

실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., - 강의 소개 | 인프런

www.inflearn.com

 

반응형