스프링 부트(핵심 원리와 활용)

Ch04. 자동 구성(Auto Configuration) - 순수 라이브러리 만들기

webmaster 2023. 3. 10. 00:29
728x90

@AutoConfiguration을 이해하기 위해서는 그전에 먼저 라이브러리가 어떻게 사용되는지 이해하는 것이 필요하다.

여러분이 만든 실시간 자바 Memory 조회 기능이 좋다고 소문이 나서, 여러 프로젝트에서 사용하고 싶어한다. 이 기능을 여러 곳에서 사용할 수 있도록 라이브러리로 만들어보자.(참고로 라이브러리를 만들 때는 스프링 부트 플러그인 기능을 사용하지 않고 진행한다.)

build.gradle

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()
}
  • 스프링 부트 플러그인을 사용하게 되면 앞서 설명한 실행 가능한 Jar 구조를 기본으로 만든다.
  • 여기서는 실행 가능한 Jar가 아니라, 다른곳에 포함되어서 사용할 순수 라이브러리 Jar를 만드는 것이 목적이므로 스프링 부트 플러그인을 사용하지 않았다.
  • 스프링 컨트롤러가 필요하므로 spring-boot-starter-web 라이브러리를 선택했다.
  • 스프링 부트 플러그인을 사용하지 않아서 버전을 직접 명시했다.

Memory

public class Memory {

  private long used;
  private long max;

  public Memory(long used, long max) {
    this.used = used;
    this.max = max;
  }

  public long getMax() {
    return max;
  }

  public long getUsed() {
    return used;
  }

  @Override
  public String toString() {
    return "Memory{" +
        "used=" + used +
        ", max=" + max +
        '}';
  }
}

MemoryFinder

@Slf4j
public class MemoryFinder {

  public Memory get(){
    long max = Runtime.getRuntime().maxMemory();
    long total = Runtime.getRuntime().totalMemory();
    long free = Runtime.getRuntime().freeMemory();
    long used = total - free;
    return new Memory(used, max);
  }

  @PostConstruct
  public void init(){
    log.info("init memoryFinder");
  }
}

MemoryController

@Slf4j
@RestController
@RequiredArgsConstructor
public class MemoryController {

  private final MemoryFinder memoryFinder;

  @GetMapping("/memory")
  public Memory system(){
    Memory memory = memoryFinder.get();
    log.info("memory={}", memory);
    return memory;
  }
}

MemoryFinderTest

public class MemoryFinderTest {


  @Test
  public void get(){
    MemoryFinder memoryFinder = new MemoryFinder();
    Memory memory = memoryFinder.get();
    System.out.println("memory = " + memory);
    assertThat(memory).isNotNull();
  }
}
  • 간단한 테스트를 통해서 데이터가 조회 되는지 정도만 간단히 검증해보자.

해당 프로젝트는 라이브러리로 빌드하자

  • ./gradlew clean build : 빌드
    • 빌드 결과(build/libs/memory-v1.jar)
  • 압축 해제(결과 확인): jar -xvf memory-v1.jar
  • memory-v1.jar 는 스스로 동작하지는 못하고 다른 곳에 포함되어서 동작하는 라이브러리이다. 이제 이 라이브러리를 다른 곳에서 사용해 보자..

 

728x90