๐ก์ด๋ฒ ํฌ์คํ ์์๋ Spring Boot์ Actuator (์ก์ธ์์ดํฐ)์ ๋ํด์ ์ ๋ฆฌํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ก์ด๋ฒ ํฌ์คํ ์ ํต์ฌ์ Spring Boot์ Actuator๋ ๋ฌด์์ธ์ง, ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ด์ ์ ๋ง์ท๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ ์์ธํ ๋ด์ฉ์ ์ถํ ๋ฐ๋ก ์ ๋ฆฌํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ ๊ฐ์ ์ด์ ๋ก ์ด๋ฒ ํฌ์คํ ์์ ์ ๋ฆฌํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Actuator๋?
- Actuator ์ฌ์ฉํ๊ธฐ
- Actuator Endpoint
- Enabling Endpoints
- Exposing Endpoints
- Implementing Custom Endpoint
Actuator (์ก์ธ์์ดํฐ) ๋?
actuator๋ฅผ ๊ฐ๋จํ๊ฒ ์ ์ํ๋ฉด Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ดํ๊ณ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํ ๋๊ตฌ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
actuator๋ฅผ ์ดํด๋ณด๋ฉด Production-ready Features (ํ๋ก๋์ ์ค๋น ๊ธฐ๋ฅ)๋ผ๋ ๋จ์ด๊ฐ ๋ฑ์ฅํฉ๋๋ค.
Production-ready Features (ํ๋ก๋์ ์ค๋น ๊ธฐ๋ฅ)
Spring Boot ๊ณต์ ๋ฌธ์์์๋ ํ๋ก๋์ ์ค๋น ๊ธฐ๋ฅ์ ๋ํด ์๋์ ๊ฐ์ด ์ค๋ช ํ๊ณ ์์ต๋๋ค.
Spring Boot์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ก๋์ ์ผ๋ก ํธ์ํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํฐ๋งํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋ ์ฌ๋ฌ ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ต๋๋ค.
HTTP ์๋ํฌ์ธํธ ๋๋ JMX๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฆฌํ๊ณ ๋ชจ๋ํฐ๋งํ๋๋ก ์ ํํ ์ ์์ต๋๋ค.
auditing, health ๋ฐ metrics ์์ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ผ๋ก ์ ์ฉํ ์๋ ์์ต๋๋ค.
actuator๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
Spring Boot์์ ์ ๊ณตํ๋ starter-actuator ์์กด์ฑ์ ์ถ๊ฐํ๋ ๊ฒ๋ง์ผ๋ก actuator ๊ธฐ๋ฅ์ ์ฝ๊ฒ ํ์ฑํ ํ ์ ์์ต๋๋ค.
// maven
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
// gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
๐กActuator
actuator๋ ๋ฌด์ธ๊ฐ๋ฅผ ์์ง์ด๊ฑฐ๋ ์ ์ดํ๊ธฐ ์ํ ๊ธฐ๊ณ ์ฅ์น๋ฅผ ๊ฐ๋ฆฌํค๋ ์ ์กฐ ์ฉ์ด์ ๋๋ค.
actuator๋ ์์ ๋ณํ๋ก ๋ง์ ์์ ๋์์ ์์ฑํ ์ ์์ต๋๋ค.
actuator endpoint๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ํธ ์์ฉํ ์ ์์ต๋๋ค.
Spring Boot์๋ ์ฌ๋ฌ ๊ฐ์ง ๊ธฐ๋ณธ ์ ๊ณต endpoint๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ฌ์ฉ์๊ฐ ์ง์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด health endpoint๋ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ health ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ฐ ๊ฐ๋ณ endpoint๋ฅผ ํ์ฑํ ๋๋ ๋นํ์ฑํํ๊ณ HTTP ๋๋ JMX๋ฅผ ํตํด ๋ ธ์ถ(์๊ฒฉ ์ก์ธ์ค ๊ฐ๋ฅ)ํ โโ์ ์์ต๋๋ค.
endpoint๋ ํ์ฑํ๋๊ณ ๋ ธ์ถ๋ ๊ฒฝ์ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๊ธฐ๋ณธ ์ ๊ณต endpoint๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ง ์๋ ๊ตฌ์ฑ๋ฉ๋๋ค.
๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ endpoint์ ID์ ์ ๋์ฌ /actuator๊ฐ URL์ ๋งคํ๋๋ HTTP๋ฅผ ํตํ ๋ ธ์ถ์ ์ ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ธฐ๋ณธ์ ์ผ๋ก health endpoint๋ /actuator/health์ ๋งคํ๋ฉ๋๋ค.
์ฌ์ฉํ ์ ์๋ endpoint
์ฌ์ฉํ ์ ์๋ endpoint๋ ์์ ๊ฐ์ผ๋ฉฐ ํ๋ก์ ํธ ์คํ ํ /actuator url๋ก ์ ์ํ๋ฉด ์๋์ ๊ฐ์ด endpoint๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Spring Boot ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด Web ํ๊ฒฝ์์๋ ์๋์ ๊ฐ์ด ์ถ๊ฐ endpoint๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ํฉ๋๋ค.
๐กActuator Endpoints์ ๋ํด ์์ธํ ๋ด์ฉ์ ํ์ธํ๊ณ ์ถ๋ค๋ฉด, ์๋ ๋งํฌ๋ฅผ ํ์ธํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
HTML ๋ฌธ์
PDF ๋ฌธ์
Enabling Endpoints
endpoint ์ค shutdown์ ์ ์ธํ ๋ชจ๋ endpoint๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์๋ค๊ณ ํฉ๋๋ค.
์๋ํฌ์ธํธ ํ์ฑํ๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด management.endpoint.<id>.enabled ์์ฑ์ ์ฌ์ฉํฉ๋๋ค.
management:
endpoint:
shutdown:
enabled: true // shutdown endpoint ํ์ฑํ
health:
enabled: false // health endpoint ๋นํ์ฑํ
๋นํ์ฑํ๋ฅผ ํ๋ฉด endpoint๊ฐ ๋ ธ์ถ๋์ง ์์ง๋ง, ํ์ฑํ์ ๊ฒฝ์ฐ ๋ ธ์ถ ์ฌ๋ถ๋ ์ค์ ์ ํด์ผ์ง๋ง ๋น๋ก์ endpoint๋ก ๋ ธ์ถ๋ฉ๋๋ค.
Exposing Endpoints
๊ธฐ๋ณธ์ ์ผ๋ก๋ health endpoint๋ง ๋ ธ์ถ๋ฉ๋๋ค. endpoint์๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ค์ด ํฌํจ๋ ์ ์์ผ๋ฏ๋ก ์ธ์ ๋ ธ์ถํ ์ง ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๐กEndpoint์ ๋ฏผ๊ฐํ ์ ๋ณด, ์ฆ ๋ณด์๊ณผ ๊ด๋ จ๋ ๋ด์ฉ์ ๋ํด์๋ ์ฐ์ํ ํ์ ๋ค ๊ธฐ์ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌ๋ ๋ด์ฉ์ด ์๋๋ฐ ์ฐธ๊ณ ํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ชจ๋ endpoints๋ฅผ includeํ๊ฑฐ๋ exclude ํ๊ธฐ ์ํด์๋ *(asterisk)๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ,
YAML์์ *(asterisk)๋ ํน๋ณํ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์ YAML์์ *(asterisk)๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ "(๋ฐ์ดํ)๋ก ๊ฐ์ธ์ค์ผ ํฉ๋๋ค.
ex)
* → X
"*" → O
์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณต๊ฐ์ ์ผ๋ก ๋ ธ์ถ๋ ๊ฒฝ์ฐ endpoint๋ ๋ณดํธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
endpoint๊ฐ ๋ ธ์ถ๋๋ ๊ฒฝ์ฐ์ ๋ํ ์์ฒด ์ ๋ต์ ๊ตฌํํ๋ ค๋ ๊ฒฝ์ฐ EndpointFilter ๋น์ ๋ฑ๋กํ ์ ์์ต๋๋ค.
Implementing Custom Endpoints
Custom Endpoint๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ @Endpoint annotation์ ์ฌ์ฉํฉ๋๋ค.
Spring Boot๋ @Endpoint๊ฐ ์๋ @Bean์ ์ถ๊ฐํ๋ฉด @ReadOperation, @WriteOperation, @DeleteOperation annotation์ด ๋ฌ๋ฆฐ ๋ฉ์๋๋ค์ ๋ชจ๋ JMX, HTTP์ ์๋์ผ๋ก ๋ ธ์ถํฉ๋๋ค.
endpoint์ ๋ํ ์์ ์ ๋งค๊ฐ ๋ณ์๋ฅผ ํตํด ์ ๋ ฅ ๋ฐ์ต๋๋ค. ์น์ ํตํด ๋ ธ์ถ๋ ๋ ์ด๋ฌํ ๋งค๊ฐ๋ณ์์ ๊ฐ์ URL์ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์ JSON Request Body์์ ๊ฐ์ ธ์ต๋๋ค.
endpoint๋ ๊ธฐ์ ์ ๊ตฌ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ ์๋ช ์ ๋จ์ ํ์๋ง ์ง์ ํ ์ ์์ต๋๋ค. ํนํ ์ด๋ฆ ๋ฐ ์นด์ดํฐ ์์ฑ์ ์ ์ํ๋ CustomData ์ ํ์ผ๋ก ๋จ์ผ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ ์ง์๋์ง ์์ต๋๋ค.
// ์ด ๋ฐฉ์์ OK
@WriteOperation
public void updateData(String name, int counter) {
// injects "test" and 42
}
// ์ด ๋ฐฉ์์ Not OK
// Object๋ก ๋ฌถ์ด์ ๋ฐ์ ์๋ ์์
@WriteOperation
public void updateData(CustomData customData) {
// Not OK
}โ
predicate์ ๊ฒฝ๋ก๋ endpoint์ ID์ ์น์ ๋ ธ์ถ๋ endpoint์ ๊ธฐ๋ณธ ๊ฒฝ๋ก์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
๊ธฐ๋ณธ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ /actuator์ ๋๋ค.
์๋ฅผ ๋ค์ด ID๊ฐ sessions์ธ endpoint๋ predicate์ ๊ฒฝ๋ก๋ก /actuator/sessions๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@Selector๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ฉ์๋์ ํ๋ ์ด์์ ๋งค๊ฐ ๋ณ์์ ์ฃผ์์ ๋ฌ์ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉ์ ์ง์ ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋งค๊ฐ๋ณ์๋ ๊ฒฝ๋ก ์กฐ๊ฑด์์ ๊ฒฝ๋ก ๋ณ์๋ก ์ถ๊ฐ๋ฉ๋๋ค.
๋ณ์์ ๊ฐ์ endpoint ์์ ์ด ํธ์ถ๋ ๋ ์์ ๋ฉ์๋๋ก ์ ๋ฌ๋ฉ๋๋ค.
๋๋จธ์ง ๋ชจ๋ ๊ฒฝ๋ก ์์๋ฅผ ์บก์ฒํ๋ ค๋ฉด ๋ง์ง๋ง ๋งค๊ฐ ๋ณ์์ @Selector(Match=ALL_REMAINING)๋ฅผ ์ถ๊ฐํ๊ณ String[]๊ณผ ๋ณํ ํธํ๋๋ ์ ํ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
Request Body๋ฅผ ์ฌ์ฉํ๋ @WriteOperation(HTTP POST)์ ๊ฒฝ์ฐ predicate์ consumes๋
application/vnd.spring-boot.actuator.v2+json ๋๋ application/json์ ๋๋ค.
๋ค๋ฅธ ๋ชจ๋ ์์ ์ โโ๊ฒฝ์ฐ consumes๊ฐ ๋น์ด ์์ต๋๋ค.
predicate์ produces๋ @DeleteOperation, @ReadOperation ๋ฐ @WriteOperation ์ฃผ์์ ์์ฑ ํน์ฑ์ ์ํด ๊ฒฐ์ ๋ ์ ์์ต๋๋ค.
์์ฑ์ ์ ํ ์ฌํญ์ ๋๋ค.
์ฌ์ฉํ์ง ์์ผ๋ฉด produces๊ฐ ์๋์ผ๋ก ๊ฒฐ์ ๋ฉ๋๋ค.
์์ ๋ฉ์๋๊ฐ void ๋๋ Void๋ฅผ ๋ฐํํ๋ฉด produces๊ฐ ๋น์ด ์์ต๋๋ค.
์์ ๋ฉ์๋๊ฐ org.springframework.core.io.Resource๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ consumes๋ application/octet-stream์ ๋๋ค.
๋ค๋ฅธ ๋ชจ๋ ์์ ์ โโ๊ฒฝ์ฐ produces๋ application/vnd.spring-boot.actuator.v2+json ๋๋ application/json์ ๋๋ค.
๊ณต์ ๋ฌธ์๋ฅผ ํ ๋๋ก Custom Endpoint๋ฅผ ๋ง๋ค์ด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋ง๋ค์ด๋ณผ ์ ์์ต๋๋ค.
@Component
@Endpoint(id = "my")
public class MyEndPoint {
private String value = "hello world";
@ReadOperation
public String getValue() {
return value;
}
@WriteOperation
public void setValue(String value) {
this.value = value;
}
@DeleteOperation
public void deleteValue() {
this.value = "hello world";
}
}
Custom Endpoint๋ฅผ ๋ง๋ ํ ํ๋ก์ ํธ๋ฅผ ์คํํ์ฌ /actuator๋ฅผ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ง์ ๋ง๋ endpoint๊ฐ ๋ ธ์ถ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ์ฒ์์ ์ธ๊ธํ๋ ๋๋ก ๊ณต์ ๋ฌธ์๋ฅผ ํ ๋๋ก ๊ฐ๋จํ๊ฒ actuator๊ฐ ๋ฌด์์ธ์ง, ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋์ง ๊ทธ๋ฆฌ๊ณ endpoint์๋ ์ด๋ค ๊ฒ๋ค์ด ์๋์ง์ ๋ํด ์์๋ดค์ต๋๋ค.
๊ณต์ ๋ฌธ์๋ฅผ ์ฝ๋ค๋ณด๋ endpoint ๋ณ๋ก ๋ ์์ธํ ๋ด์ฉ๋ค์ด ์๊ณ security ์ค์ ๋ถ๋ถ๋ ์์๋๋ฐ, ์ด๋ฐ ๋ถ๋ถ๋ค์ ์ถํ ๋ ์์ธํ๊ฒ ๊ณต๋ถํ ํ ๋ฐ๋ก ํฌ์คํ ์ ์์ฑํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'Spring > Spring Boot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
@EnableWebMvc ๋ ์กฐ์ฌํด์ ์ฌ์ฉํ์ (0) | 2023.05.31 |
---|---|
@ControllerAdvice & @RestControllerAdvice (0) | 2023.04.23 |
์คํ๋ง ๋ถํธ ์ฑ์ ์ด๊ธฐํ ์ฝ๋๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ 3๊ฐ์ง (0) | 2023.03.19 |
๋๊ธ