2023. 4. 28. 09:09ใ์ธํ๋ฐ/์คํ๋ง ๋ถํธ - ํต์ฌ ์๋ฆฌ์ ํ์ฉ
์๋ ๊ตฌ์ฑ ์ฌ์ฉ ์ ์คํ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค๊ณ ์ฌ์ฉํด๋ณด๊ธฐ (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 ์ด๋ ธํ ์ด์ ๋๋ถ์ ํ๊ฒฝ ์ค์ ์ ๋ณด์ ๋ฐ๋ผ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ฅ์ ํค๊ณ ๋ ์ ์๋๋ก ์ ์ฐํ๊ฒ ์ ๊ณตํ ์๋ ์๋ค.
'์ธํ๋ฐ > ์คํ๋ง ๋ถํธ - ํต์ฌ ์๋ฆฌ์ ํ์ฉ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ์ธ๋ถ ์ค์ ๋ฐฉ๋ฒ (OS ํ๊ฒฝ ๋ณ์, ์๋ฐ ์์คํ ์์ฑ) (0) | 2023.05.04 |
---|---|
์คํ๋ง ๋ถํธ - ์๋ ๊ตฌ์ฑ ๋์ ์๋ฆฌ (0) | 2023.05.02 |
์๋ ๊ตฌ์ฑ ์ฌ์ฉ ์ ์คํ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค๊ณ ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2023.04.28 |
์คํ๋ง @Conditional (0) | 2023.04.27 |
์คํ๋ง ๋ถํธ Auto Configuration (0) | 2023.04.25 |