๐ Spring Boot Actuator๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋ํฐ๋ง ๋ง์คํฐํ๊ธฐ ๐

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ์ ๋ง ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ก ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ์ฆ๊ฑฐ์ด ์๊ฐ์ ๋ณด๋ด๋ ค๊ณ ํด์. ๋ฐ๋ก 'Spring Boot Actuator๋ฅผ ์ด์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋ํฐ๋ง'์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ๐ ์ด ์ฃผ์ ๋ ๋ง์น ์ฐ๋ฆฌ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฌ๊ฐ ๋์ด ๊ทธ ๊ฑด๊ฐ ์ํ๋ฅผ ์ฒดํฌํ๋ ๊ฒ๊ณผ ๊ฐ๋ต๋๋ค!
์ฌ๋ฌ๋ถ, ํน์ ์์ ์ ๋ชธ ์ํ๋ฅผ ์ฒดํฌํ๊ธฐ ์ํด ๋ณ์์ ๊ฐ๋ณธ ์ ์๋์? ์์ฌ ์ ์๋์ด ์ฒญ์ง๊ธฐ๋ก ์ฌ์ฅ ์๋ฆฌ๋ฅผ ๋ฃ๊ณ , ํ์์ ์ฌ๊ณ , ์ฒด์จ์ ์ธก์ ํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์์. Spring Boot Actuator๋ ๋ฐ๋ก ์ฐ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฃผ์น์ ์ญํ ์ ํด์ฃผ๋ ๋ฉ์ง ๋๊ตฌ๋๋๋ค! ๐
์ด ๊ธ์ ํตํด ์ฐ๋ฆฌ๋ Spring Boot Actuator์ ์ธ๊ณ๋ก ํฅ๋ฏธ์ง์งํ ๋ชจํ์ ๋ ๋ ๊ฑฐ์์. ๋ง์น ์ฌ๋ฅ๋ท(https://www.jaenung.net)์์ ๋ค์ํ ์ฌ๋ฅ์ ๋ฐ๊ฒฌํ๊ณ ๊ฑฐ๋ํ๋ ๊ฒ์ฒ๋ผ, ์ฐ๋ฆฌ๋ Actuator์ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ๋ฐ๊ฒฌํ๊ณ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ๊ฑฐ์์. ์, ๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํด๋ณผ๊น์?
๐ก Tip: Spring Boot Actuator๋ ๋จ์ํ ๋๊ตฌ๊ฐ ์๋๋๋ค. ์ด๊ฒ์ ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ช ์ ๋ถ์ด๋ฃ๋ ๋ง๋ฒ ์งํก์ด์ ๊ฐ์์! ์ด ์ฌ์ ์ ํตํด ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์จ๊ฒจ์ง ๋น๋ฐ์ ๋ฐ๊ฒฌํ๊ณ , ๊ทธ ์ฌ์ฅ ๋ฐ๋์ ์ง์ ๋ค์ ์ ์๊ฒ ๋ ๊ฑฐ์์.
๐ Spring Boot Actuator: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ฐ์ ํ๋ค
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Spring Boot Actuator์ ์ธ๊ณ๋ก ๋ค์ด๊ฐ๋ณผ๊น์? ๐ช Actuator๋ ๋ง์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ฐ ๋ฐฉ์ ์ฌ๋ ์ด์ ์ ๊ฐ์์. ์ด ์ด์ ๋ก ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ด๋ถ๋ฅผ ๋ค์ฌ๋ค๋ณด๊ณ , ๊ทธ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์๋ต๋๋ค.
Spring Boot Actuator๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ ์ ๋ณด๋ฅผ ์์ฝ๊ฒ ํ์ธํ๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ์ ํ๋์ ๋ณผ ์ ์๋ ๊ฒ์ฒ๋ผ, Actuator๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ์ธก๋ฉด์ ํ๋์ ํ์ ํ ์ ์์ด์.
Actuator๊ฐ ์ ๊ณตํ๋ ์ฃผ์ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ณผ๊น์?
- ๐ฅ Health Check: ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑด๊ฐ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
- ๐ Metrics: ๋ค์ํ ์ฑ๋ฅ ์งํ๋ฅผ ์์งํ๊ณ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
- ๐ Security Audit: ๋ณด์ ๊ด๋ จ ์ด๋ฒคํธ๋ฅผ ์ถ์ ํฉ๋๋ค.
- ๐ HTTP Tracing: HTTP ์์ฒญ/์๋ต ์ ๋ณด๋ฅผ ์ถ์ ํฉ๋๋ค.
- ๐ ํ๊ฒฝ ์ค์ ์ ๋ณด: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ๋ณด๋ฅผ ํ์ธํฉ๋๋ค.
์ด๋ฐ ๊ธฐ๋ฅ๋ค์ ๋ง์น ์ฐ๋ฆฌ๊ฐ ์๋์ฐจ๋ฅผ ์ด์ ํ ๋ ๋์๋ณด๋๋ฅผ ๋ณด๋ ๊ฒ๊ณผ ๊ฐ์์. ์๋๊ณ, ์ฐ๋ฃ ๊ฒ์ด์ง, ์์ง ์จ๋ ๋ฑ์ ํ๋์ ๋ณผ ์ ์๋ฏ์ด, Actuator๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ '๋์๋ณด๋'๋ฅผ ๋ณผ ์ ์๋ ๊ฑฐ์ฃ !
๐ ์์ํด๋ณด์ธ์: ์ฌ๋ฌ๋ถ์ด ๊ฑฐ๋ํ ๋์ด๊ณต์์ ์ด์ํ๊ณ ์๋ค๊ณ ๊ฐ์ ํด๋ด์. ๋งค์ผ ์๋ง์ ์ฌ๋๋ค์ด ์ฐพ์์ค๊ณ , ๋ค์ํ ๋์ด๊ธฐ๊ตฌ๊ฐ ์ด ์ ์์ด ๋์๊ฐ๊ณ ์์ฃ . ์ด๋ฐ ์ํฉ์์ ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์๋ํ๊ณ ์๋์ง, ์ด๋์ ๋ฌธ์ ๊ฐ ์๋์ง ์ด๋ป๊ฒ ์ ์ ์์๊น์? ๋ฐ๋ก ์ด๋ Spring Boot Actuator๊ฐ ํ์ํ ๊ฑฐ์์! Actuator๋ ๋ง์น ๋์ด๊ณต์์ ์ค์ ๊ด์ ์์คํ ๊ณผ ๊ฐ์์, ๋ชจ๋ ๋์ด๊ธฐ๊ตฌ์ ์ํ, ๋๊ธฐ ์ค์ ๊ธธ์ด, ๋ฐฉ๋ฌธ๊ฐ ์ ๋ฑ์ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ ์ ์๊ฒ ํด์ค๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ Spring Boot Actuator๋ผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์์ ์ฅ๊ฒ ๋์์ด์. ์ด ๋๊ตฌ๋ฅผ ์ด์ฉํด ์ฐ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๊น์ด ์ดํดํ๊ณ , ๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋ ๊ฑฐ์์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์์ ์ ์ฌ๋ฅ์ ์ ๊ด๋ฆฌํ๊ณ ๋ฐ์ ์ํค๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ !
๋ค์ ์น์ ์์๋ Spring Boot Actuator๋ฅผ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ์ ์ด๋ป๊ฒ ์ถ๊ฐํ๊ณ ์ค์ ํ๋์ง ์์ธํ ์์๋ณผ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ๊ณ์ํด์ ์ด ํฅ๋ฏธ์ง์งํ ์ฌ์ ์ ์ด์ด๊ฐ๋ณผ๊น์? ๐
๐ Spring Boot Actuator ์์ํ๊ธฐ: ์ค์ ๊ณผ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
์, ์ด์ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ์ Spring Boot Actuator๋ฅผ ์ถ๊ฐํ๊ณ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ ๊ฑฐ์์. ์ด ๊ณผ์ ์ ๋ง์น ์ฐ๋ฆฌ ์ง์ ์ฒจ๋จ ๋ณด์ ์์คํ ์ ์ค์นํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ํ ๋ฒ ์ค์นํด ๋์ผ๋ฉด, ์ง ์์ ๋ชจ๋ ์ํฉ์ ์ฝ๊ฒ ๋ชจ๋ํฐ๋งํ ์ ์์ฃ !
1. ์์กด์ฑ ์ถ๊ฐํ๊ธฐ ๐ฆ
๋จผ์ , Spring Boot ํ๋ก์ ํธ์ pom.xml
ํ์ผ(Maven ์ฌ์ฉ ์) ๋๋ build.gradle
ํ์ผ(Gradle ์ฌ์ฉ ์)์ Actuator ์์กด์ฑ์ ์ถ๊ฐํด์ผ ํด์.
Maven์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Gradle์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
implementation 'org.springframework.boot:spring-boot-starter-actuator'
์ด๋ ๊ฒ ์์กด์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ง์น ์ฐ๋ฆฌ๊ฐ ์ฌ๋ฅ๋ท์ ๊ฐ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์์. ๊ฐ์ ๋ง ํ๋ฉด ๋ค์ํ ์ฌ๋ฅ์ ํ์ํ๊ณ ๊ฑฐ๋ํ ์ ์๋ ๊ฒ์ฒ๋ผ, Actuator ์์กด์ฑ์ ์ถ๊ฐํ๋ฉด ๋ค์ํ ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๊ฑฐ์ฃ !
2. ๊ธฐ๋ณธ ์ค์ ํ์ธํ๊ธฐ ๐
์์กด์ฑ์ ์ถ๊ฐํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก /actuator
์๋ํฌ์ธํธ๊ฐ ํ์ฑํ๋ฉ๋๋ค. ์ด ์๋ํฌ์ธํธ์ ์ ๊ทผํ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ค๋ฅธ ์๋ํฌ์ธํธ๋ค์ ๋ชฉ๋ก์ ๋ณผ ์ ์์ด์.
์๋ฅผ ๋ค์ด, http://localhost:8080/actuator
์ ์ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ JSON ์๋ต์ ๋ณผ ์ ์์ต๋๋ค:
{
"_links": {
"self": {
"href": "http://localhost:8080/actuator",
"templated": false
},
"health": {
"href": "http://localhost:8080/actuator/health",
"templated": false
},
"info": {
"href": "http://localhost:8080/actuator/info",
"templated": false
}
}
}
์ด ์๋ต์ ๋ง์น ์ฌ๋ฅ๋ท์ ๋ฉ์ธ ํ์ด์ง์ ๊ฐ์์. ์ด๋ค ์ฌ๋ฅ๋ค์ ํ์ํ ์ ์๋์ง ํ๋์ ๋ณผ ์ ์๋ ๊ฒ์ฒ๋ผ, ์ฌ๊ธฐ์๋ ์ด๋ค Actuator ์๋ํฌ์ธํธ๋ค์ ์ฌ์ฉํ ์ ์๋์ง ํ์ธํ ์ ์๋ต๋๋ค.
3. ์ถ๊ฐ ์๋ํฌ์ธํธ ํ์ฑํํ๊ธฐ ๐
๊ธฐ๋ณธ์ ์ผ๋ก๋ health
์ info
์๋ํฌ์ธํธ๋ง ๋
ธ์ถ๋์ด ์์ด์. ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ํ์ฃ ? ๊ทธ๋ด ๋ application.properties
๋๋ application.yml
ํ์ผ์์ ์ถ๊ฐ ์ค์ ์ ํด์ฃผ๋ฉด ๋ผ์.
์๋ฅผ ๋ค์ด, ๋ชจ๋ ์๋ํฌ์ธํธ๋ฅผ ํ์ฑํํ๋ ค๋ฉด:
management.endpoints.web.exposure.include=*
ํน์ ์๋ํฌ์ธํธ๋ง ํ์ฑํํ๋ ค๋ฉด:
management.endpoints.web.exposure.include=health,info,metrics,loggers
โ ๏ธ ์ฃผ์: ๋ชจ๋ ์๋ํฌ์ธํธ๋ฅผ ํ์ฑํํ๋ ๊ฒ์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๊ด์ฐฎ์ง๋ง, ํ๋ก๋์ ํ๊ฒฝ์์๋ ๋ณด์์ ์ํํ ์ ์์ด์. ํ์ํ ์๋ํฌ์ธํธ๋ง ์ ๋ณ์ ์ผ๋ก ํ์ฑํํ๋ ๊ฒ์ด ์ข์ต๋๋ค!
4. ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ์ตํ๊ธฐ ๐๏ธโโ๏ธ
์ด์ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ์ ์ธ Actuator ์๋ํฌ์ธํธ๋ฅผ ์ดํด๋ณผ๊น์?
- /actuator/health: ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑด๊ฐ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
- /actuator/info: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- /actuator/metrics: ๋ค์ํ ๋ฉํธ๋ฆญ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- /actuator/loggers: ๋ก๊น ์ค์ ์ ํ์ธํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, http://localhost:8080/actuator/health
์ ์ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ต์ ๋ณผ ์ ์์ด์:
{
"status": "UP"
}
์ด๋ ์ฐ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ ์ผ๋ก ๋์ํ๊ณ ์๋ค๋ ๋ป์ด์์. ๋ง์น ์์ฌ ์ ์๋์ด "๊ฑด๊ฐํ์๋ค์!"๋ผ๊ณ ๋งํด์ฃผ๋ ๊ฒ๊ณผ ๊ฐ์ฃ !
์์ SVG ์ด๋ฏธ์ง๋ Spring Boot Actuator์ ์ฃผ์ ๊ธฐ๋ฅ๋ค์ ์๊ฐํํ ๋์๋ณด๋์์. ์ค์ ๋ก ์ด๋ฐ ๋์๋ณด๋๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ํ๋์ ํ์ ํ ์ ์๋ต๋๋ค!
Spring Boot Actuator๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ์ ์ฝ๊ฒ ์ฐพ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ฒ๋ผ, ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ์ธก๋ฉด์ ์ฝ๊ฒ ๋ชจ๋ํฐ๋งํ๊ณ ๊ด๋ฆฌํ ์ ์์ด์. ์ด์ ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑด๊ฐ ์ํ, ์ฑ๋ฅ ์งํ, ๋ก๊ทธ ์ค์ ๋ฑ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ๊ณ ์กฐ์ ํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ๊ฐ๊ฒ ๋ ๊ฑฐ์์!
๋ค์ ์น์ ์์๋ ๊ฐ ์๋ํฌ์ธํธ์ ๋ํด ๋ ์์ธํ ์์๋ณด๊ณ , ์ค์ ๋ก ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์ดํด๋ณผ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ๊ณ์ํด์ Spring Boot Actuator์ ์ธ๊ณ๋ฅผ ํํํด๋ณผ๊น์? ๐
๐ Spring Boot Actuator ์๋ํฌ์ธํธ ์ฌ์ธต ํ๊ตฌ
์, ์ด์ ์ฐ๋ฆฌ๋ Spring Boot Actuator์ ๋ค์ํ ์๋ํฌ์ธํธ๋ค์ ์์ธํ ์ดํด๋ณผ ๊ฑฐ์์. ์ด ๊ณผ์ ์ ๋ง์น ์ฐ๋ฆฌ๊ฐ ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ๋ค์ ํ๋ํ๋ ํ์ํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ๊ฐ ์๋ํฌ์ธํธ๋ ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์ธก๋ฉด์ ๋ค์ฌ๋ค๋ณผ ์ ์๊ฒ ํด์ฃผ๋ ์ฐฝ๋ฌธ๊ณผ ๊ฐ๋ต๋๋ค!
1. /actuator/health ์๋ํฌ์ธํธ ๐ฅ
์ด ์๋ํฌ์ธํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ๊ฑด๊ฐ ์ํ๋ฅผ ํ์ธํ ์ ์๊ฒ ํด์ค๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋จ์ํ "UP" ๋๋ "DOWN" ์ํ๋ง์ ๋ฐํํ์ง๋ง, ๋ ์์ธํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋๋ก ์ค์ ํ ์ ์์ด์.
์๋ฅผ ๋ค์ด, application.properties
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ฉด:
management.endpoint.health.show-details=always
์ด์ /actuator/health
์๋ํฌ์ธํธ์ ์ ๊ทผํ๋ฉด ๋ ์์ธํ ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ด์:
{
"status": "UP",
"components": {
"db": {
"status": "UP",
"details": {
"database": "H2",
"validationQuery": "isValid()"
}
},
"diskSpace": {
"status": "UP",
"details": {
"total": 250686575616,
"free": 86145830912,
"threshold": 10485760
}
}
}
}
์ด ์ ๋ณด๋ ๋ง์น ์์ฌ ์ ์๋์ด ์ฐ๋ฆฌ์ ๊ฑด๊ฐ ๊ฒ์ง ๊ฒฐ๊ณผ๋ฅผ ์์ธํ ์ค๋ช ํด์ฃผ๋ ๊ฒ๊ณผ ๊ฐ์์. ๋จ์ํ "๊ฑด๊ฐํฉ๋๋ค"๋ผ๊ณ ํ๋ ๊ฒ์ด ์๋๋ผ, ํ์, ์ฝ๋ ์คํ ๋กค ์์น, ์ฒด์ค ๋ฑ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์๋ ค์ฃผ๋ ๊ฑฐ์ฃ !
2. /actuator/info ์๋ํฌ์ธํธ โน๏ธ
์ด ์๋ํฌ์ธํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋น์ด์์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ ๋ณด๋ฅผ ์ถ๊ฐํ ์ ์์ด์.
application.properties
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํด๋ณผ๊น์?
info.app.name=My Super App
info.app.description=A fantastic Spring Boot application
info.app.version=1.0.0
์ด์ /actuator/info
์๋ํฌ์ธํธ์ ์ ๊ทผํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ด์:
{
"app": {
"name": "My Super App",
"description": "A fantastic Spring Boot application",
"version": "1.0.0"
}
}
์ด๋ ๋ง์น ์ฌ๋ฅ๋ท์์ ์์ ์ ํ๋กํ ์ ๋ณด๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฐ๋ฆฌ์ ์ฌ๋ฅ์ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฑฐ์ฃ !
3. /actuator/metrics ์๋ํฌ์ธํธ ๐
์ด ์๋ํฌ์ธํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ๋ฉํธ๋ฆญ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. CPU ์ฌ์ฉ๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, HTTP ์์ฒญ ์ ๋ฑ ๋ค์ํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ด์.
/actuator/metrics
์๋ํฌ์ธํธ์ ์ ๊ทผํ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฉํธ๋ฆญ์ ๋ชฉ๋ก์ ๋ณผ ์ ์์ต๋๋ค:
{
"names": [
"jvm.memory.used",
"jvm.memory.max",
"http.server.requests",
"process.cpu.usage",
...
]
}
ํน์ ๋ฉํธ๋ฆญ์ ์์ธ ์ ๋ณด๋ฅผ ๋ณด๋ ค๋ฉด, ํด๋น ๋ฉํธ๋ฆญ ์ด๋ฆ์ URL์ ์ถ๊ฐํ๋ฉด ๋ผ์. ์๋ฅผ ๋ค์ด, /actuator/metrics/process.cpu.usage
์ ์ ๊ทผํ๋ฉด:
{
"name": "process.cpu.usage",
"description": "The \"recent cpu usage\" for the Java Virtual Machine process",
"baseUnit": null,
"measurements": [
{
"statistic": "VALUE",
"value": 0.000244140625
}
],
"availableTags": []
}
์ด ์ ๋ณด๋ ๋ง์น ์ฐ๋ฆฌ๊ฐ ์ด๋ํ ๋ ์ค๋งํธ์์น๋ก ์ฌ๋ฐ์, ์นผ๋ก๋ฆฌ ์๋ชจ๋ ๋ฑ์ ์ฒดํฌํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ผ๋ง๋ ์ด์ฌํ '์ด๋'ํ๊ณ ์๋์ง ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์๋ ๊ฑฐ์ฃ !
4. /actuator/loggers ์๋ํฌ์ธํธ ๐
์ด ์๋ํฌ์ธํธ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๊น ์ค์ ์ ํ์ธํ๊ณ ์์ ํ ์ ์์ด์. ํน์ ํจํค์ง๋ ํด๋์ค์ ๋ก๊ทธ ๋ ๋ฒจ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ ์ด ์ ๋ง ์ ์ฉํด์!
/actuator/loggers
์๋ํฌ์ธํธ์ ์ ๊ทผํ๋ฉด ํ์ฌ์ ๋ก๊น
์ค์ ์ ๋ณผ ์ ์์ต๋๋ค:
{
"levels": [
"OFF",
"ERROR",
"WARN",
"INFO",
"DEBUG",
"TRACE"
],
"loggers": {
"ROOT": {
"configuredLevel": "INFO",
"effectiveLevel": "INFO"
},
"com.example": {
"configuredLevel": null,
"effectiveLevel": "INFO"
},
...
}
}
ํน์ ๋ก๊ฑฐ์ ๋ ๋ฒจ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด, POST ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ผ์. ์๋ฅผ ๋ค์ด:
POST /actuator/loggers/com.example
Content-Type: application/json
{
"configuredLevel": "DEBUG"
}
์ด๋ ๊ฒ ํ๋ฉด com.example
ํจํค์ง์ ๋ก๊ทธ ๋ ๋ฒจ์ด DEBUG๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ง์น ์ฌ๋ฅ๋ท์์ ์์ ์ ์ฌ๋ฅ์ ํ๋ณดํ๋ ๋ฐฉ์์ ์ค์๊ฐ์ผ๋ก ์กฐ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์์. ์ํฉ์ ๋ฐ๋ผ ๋ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ฑฐ๋, ํน์ ๊ฐ๋จํ ์์ฝ๋ ์ ๋ณด๋ง ์ ๊ณตํ ์ ์๋ ๊ฑฐ์ฃ !
์์ SVG ์ด๋ฏธ์ง๋ Spring Boot Actuator์ ์ฃผ์ ์๋ํฌ์ธํธ๋ค์ ์๊ฐํํ ๊ฒ์ด์์. ๋ง์น ํ์๊ณ์ ํ์ฑ๋ค์ฒ๋ผ, ๊ฐ ์๋ํฌ์ธํธ๊ฐ Actuator๋ฅผ ์ค์ฌ์ผ๋ก ๋๊ณ ์๋ ๋ชจ์ต์ด์ฃ . ์ด๋ ๊ฒ ๊ฐ ์๋ํฌ์ธํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์ธก๋ฉด์ ๋ชจ๋ํฐ๋งํ๊ณ ๊ด๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
5. /actuator/env ์๋ํฌ์ธํธ ๐
์ด ์๋ํฌ์ธํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฌ ํ๊ฒฝ ์ค์ ์ ๋ณด์ฌ์ค๋๋ค. ์์คํ ํ๊ฒฝ ๋ณ์, ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ, ๋ช ๋ น์ค ์ธ์ ๋ฑ ๋ค์ํ ์์ค์์ ๊ฐ์ ธ์จ ์ค์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ด์.
/actuator/env
์๋ํฌ์ธํธ์ ์ ๊ทผํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ต๋๋ค:
{
"activeProfiles": [],
"propertySources": [
{
"name": "systemProperties",
"properties": {
"java.version": {
"value": "11.0.9"
},
...
}
},
{
"name": "applicationConfig: [classpath:/application.properties]",
"properties": {
"server.port": {
"value": "8080"
},
...
}
}
]
}
์ด ๊ธฐ๋ฅ์ ๋ง์น ์ฌ๋ฅ๋ท์์ ์์ ์ ์์ ํ๊ฒฝ์ ๊ณต๊ฐํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ์ด๋ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ณ , ์ด๋ค ํ๊ฒฝ์์ ์์ ํ๋์ง ์๋ ค์ฃผ๋ ๊ฑฐ์ฃ . ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ค ์ค์ ์ผ๋ก ๋์ํ๊ณ ์๋์ง ํ๋์ ํ์ ํ ์ ์๋ต๋๋ค!
6. /actuator/beans ์๋ํฌ์ธํธ ๐ฑ
์ด ์๋ํฌ์ธํธ๋ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น(Bean)์ ๋ชฉ๋ก์ ์ ๊ณตํฉ๋๋ค. ๊ฐ ๋น์ ์ด๋ฆ, ํ์ , ์์กด์ฑ ๋ฑ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ด์.
/actuator/beans
์๋ํฌ์ธํธ์ ์ ๊ทผํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ต๋๋ค:
{
"contexts": {
"application": {
"beans": {
"dataSource": {
"aliases": [],
"scope": "singleton",
"type": "com.zaxxer.hikari.HikariDataSource",
"resource": "class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]",
"dependencies": [
"dataSourceProperties"
]
},
...
}
}
}
}
์ด ์ ๋ณด๋ ๋ง์น ์ฌ๋ฅ๋ท์์ ๊ฐ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ๋ ์๋น์ค๋ ์ฌ๋ฅ์ ์์ธ ๋ชฉ๋ก์ ๋ณด๋ ๊ฒ๊ณผ ๊ฐ์์. ์ด๋ค ์ฌ๋ฅ๋ค์ด ์๊ณ , ๊ทธ๋ค์ด ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ๋์ ๋ณผ ์ ์์ฃ !
๐ก Pro Tip: Spring Boot Actuator์ ์๋ํฌ์ธํธ๋ค์ ๋จ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋์ด์, ์ค์ ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋์์ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์์. ์๋ฅผ ๋ค์ด, /actuator/shutdown
์๋ํฌ์ธํธ๋ฅผ ํ์ฑํํ๋ฉด HTTP ์์ฒญ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์ข
๋ฃํ ์ ์๋ต๋๋ค. ํ์ง๋ง ์ด๋ฐ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๋ค์ ๋ณด์์ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํด์!
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ Spring Boot Actuator์ ์ฃผ์ ์๋ํฌ์ธํธ๋ค์ ์ดํด๋ดค์ด์. ์ด ๋๊ตฌ๋ค์ ์ ํ์ฉํ๋ฉด, ๋ง์น ์ฌ๋ฅ๋ท์์ ์์ ์ ์ฌ๋ฅ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ํ๋ณดํ๋ ๊ฒ์ฒ๋ผ, ์ฐ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๊ด๋ฆฌํ ์ ์๋ต๋๋ค.
๋ค์ ์น์ ์์๋ ์ด๋ฌํ Actuator ์๋ํฌ์ธํธ๋ค์ ์ค์ ๋ก ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ ๋์๊ฐ ์ปค์คํ ์๋ํฌ์ธํธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ๊ณ์ํด์ Spring Boot Actuator์ ์ธ๊ณ๋ฅผ ํํํด๋ณผ๊น์? ๐
๐ Spring Boot Actuator ์ค์ ํ์ฉ ๋ฐ ์ปค์คํฐ๋ง์ด์ง
์, ์ด์ ์ฐ๋ฆฌ๋ Spring Boot Actuator์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ์๊ฒ ๋์์ด์. ํ์ง๋ง ์ง์ ํ ๋ง์คํฐ๊ฐ ๋๊ธฐ ์ํด์๋ ์ด๋ฅผ ์ค์ ์ํฉ์ ์ ์ฉํ๊ณ , ๋ ๋์๊ฐ ์ฐ๋ฆฌ์ ํ์์ ๋ง๊ฒ ์ปค์คํฐ๋ง์ด์งํ ์ ์์ด์ผ ํด์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์์ ๋ง์ ๋ ํนํ ์ฌ๋ฅ์ ๊ฐ๋ฐํ๊ณ ํ๋ณดํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ !
1. ์ค์ ํ์ฉ ์ฌ๋ก: ์ ํ๋ฆฌ์ผ์ด์ ํฌ์ค ์ฒดํฌ ๐ฅ
๋๊ท๋ชจ ์์คํ ์์๋ ์ฌ๋ฌ ๋ง์ดํฌ๋ก์๋น์ค๋ค์ด ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์. ์ด๋ฐ ์ํฉ์์ ๊ฐ ์๋น์ค์ ๊ฑด๊ฐ ์ํ๋ฅผ ํ์ธํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
Spring Boot Actuator์ /health
์๋ํฌ์ธํธ๋ฅผ ํ์ฉํ์ฌ ์ปค์คํ
ํฌ์ค ์ธ๋์ผ์ดํฐ๋ฅผ ๋ง๋ค์ด๋ณผ๊น์?
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // ์ค์ ๊ฒ์ฌ ๋ก์ง์ ์ํ
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
private int check() {
// ์ฌ๊ธฐ์ ์ค์ ํฌ์ค ์ฒดํฌ ๋ก์ง์ ๊ตฌํ
// ์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ์ธ, ์ธ๋ถ API ํธ์ถ ๋ฑ
return 0; // 0์ ์ ์, ๋ค๋ฅธ ๊ฐ์ ์๋ฌ๋ฅผ ์๋ฏธ
}
}
์ด๋ ๊ฒ ๊ตฌํํ ์ปค์คํ
ํฌ์ค ์ธ๋์ผ์ดํฐ๋ ์๋์ผ๋ก /health
์๋ํฌ์ธํธ์ ํตํฉ๋ฉ๋๋ค. ์ด์ ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ๊ธฐ๋ฅ์ด ์ ์์ ์ผ๋ก ๋์ํ๋์ง ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์์ด์!
2. ๋ฉํธ๋ฆญ ํ์ฉํ๊ธฐ: ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๐
์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํด์. Spring Boot Actuator์ /metrics
์๋ํฌ์ธํธ๋ฅผ ํ์ฉํ์ฌ ์ปค์คํ
๋ฉํธ๋ฆญ์ ์ถ๊ฐํด๋ณผ๊น์?
@RestController
public class UserController {
private final MeterRegistry meterRegistry;
public UserController(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
@GetMapping("/users")
public List<user> getUsers() {
meterRegistry.counter("user.list.access").increment();
// ์ฌ์ฉ์ ๋ชฉ๋ก์ ๋ฐํํ๋ ๋ก์ง
}
}
</user>
์ด์ /metrics/user.list.access
์๋ํฌ์ธํธ์ ์ ๊ทผํ๋ฉด ์ฌ์ฉ์ ๋ชฉ๋ก ์กฐํ ํ์๋ฅผ ํ์ธํ ์ ์์ด์. ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ๊ด๋ จ๋ ์ค์ํ ๋ฉํธ๋ฆญ์ ์ถ๊ฐํ ์ ์๋ต๋๋ค.
3. ์ปค์คํ ์๋ํฌ์ธํธ ๋ง๋ค๊ธฐ ๐จ
๋๋ก๋ Spring Boot Actuator๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์๋ํฌ์ธํธ๋ง์ผ๋ก๋ ๋ถ์กฑํ ์ ์์ด์. ์ด๋ด ๋๋ ์ฐ๋ฆฌ๋ง์ ์ปค์คํ ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค ์ ์๋ต๋๋ค.
@Component
@Endpoint(id = "custom")
public class CustomEndpoint {
@ReadOperation
public Map<string object> customInfo() {
Map<string object> info = new HashMap<>();
info.put("app_name", "My Awesome App");
info.put("version", "1.0.0");
info.put("description", "This is a custom endpoint");
return info;
}
@WriteOperation
public void updateCustomInfo(@Selector String key, String value) {
// ์ฌ๊ธฐ์ ์ ๋ณด๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ก์ง์ ๊ตฌํ
}
}
</string></string>
์ด์ /actuator/custom
์๋ํฌ์ธํธ์ ์ ๊ทผํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ ์ํ ์ปค์คํ
์ ๋ณด๋ฅผ ๋ณผ ์ ์์ด์. POST ์์ฒญ์ ํตํด ์ด ์ ๋ณด๋ฅผ ์
๋ฐ์ดํธํ ์๋ ์์ฃ !
4. ๋ณด์ ๊ฐํํ๊ธฐ ๐
Actuator ์๋ํฌ์ธํธ๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํฌํจํ ์ ์์ผ๋ฏ๋ก, ๋ณด์์ ์ ๊ฒฝ ์จ์ผ ํด์. Spring Security๋ฅผ ์ฌ์ฉํ์ฌ Actuator ์๋ํฌ์ธํธ์ ๋ํ ์ ๊ทผ์ ์ ํํ ์ ์์ต๋๋ค.
@Configuration
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
.anyRequest().hasRole("ACTUATOR")
.and()
.httpBasic();
}
}
์ด๋ ๊ฒ ์ค์ ํ๋ฉด "ACTUATOR" ์ญํ ์ ๊ฐ์ง ์ฌ์ฉ์๋ง Actuator ์๋ํฌ์ธํธ์ ์ ๊ทผํ ์ ์์ด์.
๐จ ์ฃผ์: Actuator ์๋ํฌ์ธํธ์ ๋ณด์์ ๋งค์ฐ ์ค์ํด์! ํ๋ก๋์ ํ๊ฒฝ์์๋ ๋ฐ๋์ ์ ์ ํ ๋ณด์ ์กฐ์น๋ฅผ ์ทจํด์ผ ํฉ๋๋ค. ํ์ํ ์๋ํฌ์ธํธ๋ง ๋ ธ์ถํ๊ณ , ์ ๊ทผ ๊ถํ์ ์๊ฒฉํ๊ฒ ๊ด๋ฆฌํ์ธ์.
5. Actuator ์ ๋ณด๋ฅผ ๋์๋ณด๋๋ก ์๊ฐํํ๊ธฐ ๐
Actuator๊ฐ ์ ๊ณตํ๋ ์ ๋ณด๋ ๋งค์ฐ ์ ์ฉํ์ง๋ง, JSON ํํ๋ก ๋ณด๋ ๊ฒ์ ์ง๊ด์ ์ด์ง ์์ ์ ์์ด์. ์ด๋ฐ ์ ๋ณด๋ฅผ ์๊ฐํํ๋ฉด ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ ์ ์๋ต๋๋ค.
Spring Boot Admin์ด๋ผ๋ ์คํ์์ค ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ๋ฉด Actuator ์ ๋ณด๋ฅผ ๋ฉ์ง ๋์๋ณด๋๋ก ๋ณผ ์ ์์ด์. ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค:
- Spring Boot Admin Server ํ๋ก์ ํธ๋ฅผ ์ค์ ํฉ๋๋ค.
- ๋ชจ๋ํฐ๋งํ๊ณ ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ (ํด๋ผ์ด์ธํธ)์ Spring Boot Admin Client ์์กด์ฑ์ ์ถ๊ฐํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์
application.properties
์ Admin Server์ ์ฃผ์๋ฅผ ์ค์ ํฉ๋๋ค.
spring.boot.admin.client.url=http://localhost:8080
management.endpoints.web.exposure.include=*
์ด๋ ๊ฒ ํ๋ฉด Spring Boot Admin ๋์๋ณด๋์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ, ๋ฉํธ๋ฆญ, ๋ก๊ทธ ๋ฑ์ ํ๋์ ๋ณผ ์ ์์ด์!
์์ SVG ์ด๋ฏธ์ง๋ Spring Boot Actuator ์ ๋ณด๋ฅผ ์๊ฐํํ ๋์๋ณด๋์ ์์์ ๋๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋ณต์กํ ์ ๋ณด๋ฅผ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ ์ฝ๊ฒ ํํํ ์ ์์ด์!
Spring Boot Actuator๋ฅผ ํ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํฐ๋งํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ง์น ์ฌ๋ฅ๋ท์์ ์์ ์ ์ฌ๋ฅ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ํ๋ณดํ๋ ๊ฒ๊ณผ ๊ฐ์์. ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ธํ๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๋น ๋ฅด๊ฒ ๋์ํ ์ ์๊ฒ ๋๋ ๊ฑฐ์ฃ !
์ด๋ ๊ฒ Spring Boot Actuator๋ฅผ ์ค์ ์์ ํ์ฉํ๊ณ ์ปค์คํฐ๋ง์ด์งํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ดค์ด์. ์ด์ ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑด๊ฐ ์ํ๋ฅผ ์ฒดํฌํ๊ณ , ์ค์ํ ๋ฉํธ๋ฆญ์ ๋ชจ๋ํฐ๋งํ๋ฉฐ, ํ์ํ ์ ๋ณด๋ฅผ ์ปค์คํ ์๋ํฌ์ธํธ๋ก ์ ๊ณตํ ์ ์๊ฒ ๋์์ด์. ๊ฒ๋ค๊ฐ ์ด ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ฉ์ง ๋์๋ณด๋๋ก ์๊ฐํํ ์๋ ์์ฃ !
Spring Boot Actuator๋ ์ ๋ง ๊ฐ๋ ฅํ ๋๊ตฌ์์. ์ด๋ฅผ ์ ํ์ฉํ๋ฉด ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด์๊ณผ ๊ด๋ฆฌ๊ฐ ํ์ธต ๋ ์ฌ์์ง ๊ฑฐ์์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์์ ์ ์ฌ๋ฅ์ ์ ๊ด๋ฆฌํ๊ณ ํ๋ณดํ์ฌ ์ฑ๊ณต์ ์ด๋ฃจ๋ ๊ฒ์ฒ๋ผ, Spring Boot Actuator๋ก ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๊ณต์ ์ผ๋ก ์ด์ํด๋ณด์ธ์! ๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ