[springboot][Gradle] 자동 설정 만들기 #1 Starter와 Auto-Configure

2022. 8. 15. 13:10JAVA/Spring

개요

스프링부트는 필요한 의존성 라이브러리를 가져와서 사용할 수 있습니다. 시작하고자 하는 애플리케이션에 @EnableAutoConfiguration 어노테이션을 적용하면 외부 라이브러리들의 정의된 빈들을 IOC 컨테이너에 등록하여 사용할 수 있습니다. 이러한 @EnableAutoConfiguration 어노테이션은 대개 @SpringBootApplication 어노테이션에 같이 정의되어 있습니다. 

 

이 글에서는 Gradle 빌드 도구를 기반으로 외부 라이브러리를 만들고 로컬 메이븐 저장소에 저장한다음 현재 작업하는 프로젝트에 의존성 라이브러리로써 가져와서 빈을 등록하고 출력하는 것을 실습해보겠습니다.

 

1. 자동 설정 구현

1.1 프로젝트 추가

 

1.2 의존성 추가, build.gradle 파일

dependencies {
		...
    implementation 'org.springframework.boot:spring-boot-autoconfigure'
    implementation 'org.springframework.boot:spring-boot-autoconfigure-processor'
		...
}

 

1.3 클래스 생성

@NoArgsConstructor
@AllArgsConstructor
@Getter
@ToString
public class Holoman {
    private String name;
    private int howLong;
}

 

4. @Configuration 파일 작성

@Configuration
public class HolomanConfiguration {

    @Bean
    public Holoman holoman(){
        Holoman holoman = new Holoman("yonghwan", 5);
        return holoman;
    }
}

위 @Configuration 파일을 통해서 빈을 정의합니다.

 

5. src/main/resource/META-INF 디렉토리에 spring.factories 파일 생성

 

6. spring.factories 파일 안에 자동설정 파일 추가

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
  com.yh.HolomanConfiguration

 

7. Maven Local Repository에 저장하기

  • Gradle 설정에서 maven 로컬 저장소를 사용하도록 합니다.

build.gradle

  • maven 로컬 저장소를 사용하므로 빌드된 파일은 ~./m2 폴더에 저장됩니다.
plugins {
    id 'org.springframework.boot' version '2.7.2'
    id 'io.spring.dependency-management' version '1.0.12.RELEASE'
    id 'java'
    id 'maven-publish'
}

group = 'com.yh'
version = '1.0'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            versionMapping {
                usage('java-api') {
                    fromResolutionOf('runtimeClasspath')
                }
                usage('java-runtime') {
                    fromResolutionResult()
                }
            }

            groupId = 'com.yh'
            artifactId = 'yonghwan-spring-boot-starter'
            version = '1.0'

            from components.java
        }
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-autoconfigure'
    implementation 'org.springframework.boot:spring-boot-autoconfigure-processor'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

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

 

 

8. 로컬 메이븐 저장소로 jar 파일 생성

./gradlew clean publishToMavenLocal

 

인텔리제이 gradle를 이용한 방법

  • gradle → Tasks → build → clean 클릭
  • gradle → Tasks → publishing → publishToMavenLocal

 

9. ~./.m2/repository/com/yh/yonghwan-spring-boot-starter/1.0 디렉토리에서 파일 생성 확인

 

10. yonghwan-spring-boot-starter-1.0 라이브러리를 사용하고자 하는 현재 프로젝트의 build.gradle 파일에 다음과 같이 작성합니다.

build.gradle

repositories {
	mavenCentral()
	mavenLocal()
}

dependencies {
	...
	implementation 'com.yh:yonghwan-spring-boot-starter:1.0'
	...
}
...

 

11. gradle 프로젝트를 다시 빌드하여 외부 라이브러리에 yonghwan-spring-boot-starter 라이브러리가 들어왔는지 확인

 

12. 빈이 제대로 등록되었는지 확인하기 위해서 테스`트 코드를 수행합니다.

@RunWith(SpringRunner.class)
@SpringBootTest
public class HolomanTest {

    @Autowired
    Holoman holoman;

    @Test
    public void beanTest() throws Exception{
        //given

        //when

        //then
        System.out.println(holoman);
        assertThat(holoman.getHowLong()).isEqualTo(5);
    }
}

 

13. 실행결과에서 holoman 인스턴스가 출력된 것을 확인합니다.

위 결과를 통해서 holoman 필드멤버에 자동주입하기 위해서는 IOC 컨테이너에 Holoman 클래스가 빈으로 등록이 되어 있어야하고 자동주입에 성공하고 출력되었으므로 외부 라이브러리의 클래스에 빈이 등록된 것을 확인할 수 있었습니다.

 

 

References

[Gradle] 라이브러리 만들고 사용하기(Maven Local Repository)
Spring Boot Reference Documentation
[Spring] @Configuration 개념과 장점