์ž๋™ ๊ตฌ์„ฑ Auto Configuration ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

2023. 4. 28. 09:09ใ†์ธํ”„๋Ÿฐ/์Šคํ”„๋ง ๋ถ€ํŠธ - ํ•ต์‹ฌ ์›๋ฆฌ์™€ ํ™œ์šฉ

728x90

 

์ž๋™ ๊ตฌ์„ฑ ์‚ฌ์šฉ ์ „ ์Šคํ”„๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ธฐ (tistory.com)

 

์ž๋™ ๊ตฌ์„ฑ ์‚ฌ์šฉ ์ „ ์Šคํ”„๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

์Šคํ”„๋ง @Conditional (tistory.com) ์Šคํ”„๋ง @Conditional 0๏ธโƒฃ ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ž๋™ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ ์ „์— ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ธ๋ฐ ์ด ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ๋Š”

hyejin.tistory.com

์ €๋ฒˆ ๊ธ€์—์„œ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ž๋™ ๊ตฌ์„ฑ Auto Configuration ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ง์ ‘ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ดค๋‹ค. 

์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๋นˆ๋“ค์ด ๋ญ”์ง€ ์•Œ์•„์•ผ ํ•˜๊ณ , ์ด๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์–ด๋Š”๋ฐ ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” ์ž๋™ ๊ตฌ์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์„œ ์Šคํ”„๋ง ๋นˆ๋“ค์ด ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. 

 

 

0๏ธโƒฃ ์ž๋™ ๊ตฌ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ธฐ 

์ด๋ฒˆ์—๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งŒ๋“ค ํ”„๋กœ์ ํŠธ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ 

์ €๋ฒˆ ๊ธ€๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

Memory

public class Memory
{
   private long used;
   private long max;
   
   public Memory(long used, long max)
   {
      this.used = used;
      this.max = max;
   }
   
   public long getUsed()
   {
      return used;
   }
   
   public long getMax()
   {
      return max;
   }
   
   @Override
   public String toString()
   {
      return "Memory{" +
            "used=" + used +
            ", max=" + max +
            '}';
   }
}

 

 

MemoryFinder 

@Slf4j
public class MemoryFinder
{
   
   public Memory get()
   {
      long max = Runtime.getRuntime().maxMemory(); // JVM์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ
      long total = Runtime.getRuntime().totalMemory();  // JVM์ด ํ™•๋ณดํ•œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ
      long free = Runtime.getRuntime().freeMemory();  /// JVM์ด ํ™•๋ณดํ•œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ์ค‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒƒ
      
      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;
   }
}

 

 

MemoryAutoConfig

@AutoConfiguration
@ConditionalOnProperty(name = "memory", havingValue = "on")
public class MemoryAutoConfig
{
   @Bean
   public MemoryFinder memoryFinder()
   {
      return new MemoryFinder();
   }
   
   @Bean
   public MemoryController memoryController()
   {
      return new MemoryController(memoryFinder());
   }
}

์ด๋ฒˆ์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ์— Config ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ์— @AutoConfiguration ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค. 

 

@AutoConfiguration 

: ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ž๋™ ๊ตฌ์„ฑ ๊ธฐ๋Šฅ์„ ์ ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ 

 

@ConditiotnalOnProperty

: memory = on ์ด๋ผ๋Š” ํ™˜๊ฒฝ ์ •๋ณด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋„๋ก ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ง€์ •ํ•ด์ค€๋‹ค. 

์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด memory = on ์ด๋ผ๋Š” ํ™˜๊ฒฝ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ์กฐํšŒ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด๋„ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๊ธฐ๋Šฅ์„ ํ‚ค๊ณ  ๋Œ ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ฒŒ ๋œ๋‹ค.) 

 

 

1๏ธโƒฃ ์ž๋™ ๊ตฌ์„ฑ ๋Œ€์ƒ ์ง€์ •ํ•ด์ฃผ๊ธฐ 

MemoryAutoConfig ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋์ด ์•„๋‹ˆ๋ผ  ์Šคํ”„๋ง ๋ถ€ํŠธ ์ž๋™ ๊ตฌ์„ฑ์„ ์ ์šฉํ•˜๋ ค๋ฉด, ๋‹ค์Œ ํŒŒ์ผ์— ์ž๋™ ๊ตฌ์„ฑ ๋Œ€์ƒ์„ ๊ผญ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค. 

 

โ— ํด๋” ์œ„์น˜์™€ ํŒŒ์ผ ์ด๋ฆ„์ด ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ์˜คํƒ€ ์ฃผ์˜ 

src/main/resources/META-INF/spring/ 

org.springframework.boot.autoconfigure.AutoConfiguration.imports

memory.MemoryAutoConfig

ํ•ด๋‹น ํŒŒ์ผ์— ํŒจํ‚ค์ง€๋ช…๊นŒ์ง€ ํฌํ•จํ•ด์„œ ์ž๋™ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ง€์ •ํ•ด์ค€๋‹ค. 

 

-> ์ด๋ ‡๊ฒŒ ์ž๋™ ๊ตฌ์„ฑ ๋Œ€์ƒ์„ ์ง€์ •ํ•ด์ฃผ๊ณ  ๋‚˜๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์‹œ์ž‘ ์‹œ์ ์— org.springframework.boot.autoconfigure.AutoConfiguration.imports ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ์ฝ์–ด์„œ ์ž๋™ ๊ตฌ์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๋”ฐ๋ผ์„œ ๋‚ด๋ถ€์— ์ง€์ •ํ•ด๋‘” MemoryAutoConfig๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜์–ด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค. 

 

 

2๏ธโƒฃ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋น‹๋“œ ํ›„ ์‚ฌ์šฉํ•˜๊ธฐ 

gradlew clean build

์œ„์— ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“  ํ›„ jar ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๊ณ .. 

 

์ด์ œ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋‹ค. 

Lombok, Spring web ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ project-v2 ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

 

HelloController

@RestController
public class HelloController
{
   
   @GetMapping("/hello")
   public String hello()
   {
      return "hello";
   }
}

์ •๋ง ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ์ด๊ณ , ์ด์ œ ์ด ํ”„๋กœ์ ํŠธ์— memory-v2 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค. 

์ „์— ๊ธ€์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์ •ํ•œ ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ 

 

project-v2/libs ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  memory-v2.jar ์„ ํ•ด๋‹น ํด๋”์— ๋ณต์‚ฌํ•ด์ค€๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  build.gradle์— memroy-v2.jar๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

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'
}

 

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ „์— ์ž๋™ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „ memory-v1 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ์ง์ ‘ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๋“ฑ๋กํ•ด์ค˜์•ผ ํ–ˆ๋Š”๋ฐ 

memory-v2 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ์ž๋™ ๊ตฌ์„ฑ์ด ์„ค์ •๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. 

MemoryAutoConfig์—์„œ @ConditionalOnProperty ์—์„œ memory ํ™˜๊ฒฝ ์ •๋ณด๊ฐ€ on ์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง€์ •ํ•ด๋’€๊ธฐ ๋•Œ๋ฌธ์— 

 

IntelliJ์— ํ™˜๊ฒฝ ์„ค์ • ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. 

 

 

๐Ÿ“š ์ด๋ ‡๊ฒŒ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ž๋™ ๊ตฌ์„ฑ ๋•๋ถ„์— ํ•˜๋‚˜ํ•˜๋‚˜ ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก์„ ํ•œ๋‹ค๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ์„ค์ • ์—†์ด๋„ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค. 

๊ทธ๋ฆฌ๊ณ  @ConditionalOnProperty ์–ด๋…ธํ…Œ์ด์…˜ ๋•๋ถ„์— ํ™˜๊ฒฝ ์„ค์ • ์ •๋ณด์— ๋”ฐ๋ผ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ํ‚ค๊ณ  ๋Œ ์ˆ˜ ์žˆ๋„๋ก ์œ ์—ฐํ•˜๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90