๐Ÿš€ Spring Boot Actuator๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋งˆ์Šคํ„ฐํ•˜๊ธฐ ๐Ÿ”

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ 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"
}

์ด๋Š” ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ด์—์š”. ๋งˆ์น˜ ์˜์‚ฌ ์„ ์ƒ๋‹˜์ด "๊ฑด๊ฐ•ํ•˜์‹œ๋„ค์š”!"๋ผ๊ณ  ๋งํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

Spring Boot Actuator ๋Œ€์‹œ๋ณด๋“œ Spring Boot Actuator ๋Œ€์‹œ๋ณด๋“œ Health UP Metrics CPU: 30% MEM: 60% Loggers Info

์œ„์˜ 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๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ž์‹ ์˜ ์žฌ๋Šฅ์„ ํ™๋ณดํ•˜๋Š” ๋ฐฉ์‹์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ํ˜น์€ ๊ฐ„๋‹จํžˆ ์š”์•ฝ๋œ ์ •๋ณด๋งŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์ฃ !

Spring Boot Actuator ์—”๋“œํฌ์ธํŠธ ํƒํ—˜ Spring Boot Actuator /health UP /info App Info /metrics CPU: 30% /loggers INFO /env /beans

์œ„์˜ 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 ์ •๋ณด๋ฅผ ๋ฉ‹์ง„ ๋Œ€์‹œ๋ณด๋“œ๋กœ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค:

  1. Spring Boot Admin Server ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํด๋ผ์ด์–ธํŠธ)์— Spring Boot Admin Client ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ application.properties์— Admin Server์˜ ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
spring.boot.admin.client.url=http://localhost:8080
management.endpoints.web.exposure.include=*

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Spring Boot Admin ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ ๋“ฑ์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด์š”!

Spring Boot Actuator ๋Œ€์‹œ๋ณด๋“œ Spring Boot Actuator ๋Œ€์‹œ๋ณด๋“œ Health: UP Metrics CPU: 30% Memory: 60% Logs

์œ„์˜ SVG ์ด๋ฏธ์ง€๋Š” Spring Boot Actuator ์ •๋ณด๋ฅผ ์‹œ๊ฐํ™”ํ•œ ๋Œ€์‹œ๋ณด๋“œ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋ณต์žกํ•œ ์ •๋ณด๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”!

Spring Boot Actuator๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ž์‹ ์˜ ์žฌ๋Šฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ํ™๋ณดํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๊ณ , ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ !

์ด๋ ‡๊ฒŒ Spring Boot Actuator๋ฅผ ์‹ค์ „์—์„œ ํ™œ์šฉํ•˜๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๊ณ , ์ค‘์š”ํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉฐ, ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ปค์Šคํ…€ ์—”๋“œํฌ์ธํŠธ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์–ด์š”. ๊ฒŒ๋‹ค๊ฐ€ ์ด ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ฉ‹์ง„ ๋Œ€์‹œ๋ณด๋“œ๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜๋„ ์žˆ์ฃ !

Spring Boot Actuator๋Š” ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์˜ˆ์š”. ์ด๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์šด์˜๊ณผ ๊ด€๋ฆฌ๊ฐ€ ํ•œ์ธต ๋” ์‰ฌ์›Œ์งˆ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ž์‹ ์˜ ์žฌ๋Šฅ์„ ์ž˜ ๊ด€๋ฆฌํ•˜๊ณ  ํ™๋ณดํ•˜์—ฌ ์„ฑ๊ณต์„ ์ด๋ฃจ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Spring Boot Actuator๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ฑ๊ณต์ ์œผ๋กœ ์šด์˜ํ•ด๋ณด์„ธ์š”! ๐Ÿš€