chap 17 - JAVA-JIKIMI/SPRING-IN-ACTION-5 GitHub Wiki

Chapter 16 ์—์„œ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ์•ก์ถ”์—์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด HTTP ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด JSON ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜์˜€๊ณ , Chapter 17 ์—์„œ๋Š” ์—‘์ถ”์—์ดํ„ฐ์˜ JSON ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•œ frontend ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•œ๋‹ค.

17.1 ์Šคํ”„๋ง ๋ถ€ํŠธ Admin ์‚ฌ์šฉํ•˜๊ธฐ

์Šคํ”„๋ง ๋ถ€ํŠธ Admin์€ ๊ด€๋ฆฌ์šฉ frontend ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค.

์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ Admin ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ Admin ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ๋“ฑ๋กํ•˜์—ฌ ์„ค์ • ํ›„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

image

17.1.1 Admin ์„œ๋ฒ„ ์ƒ์„ฑํ•˜๊ธฐ

Admin ์„œ๋ฒ„๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์ƒˆ๋กœ์šด ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๊ณ  Admin ์„œ๋ฒ„ ์˜์กด์„ฑ์„ ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Admin ์„œ๋ฒ„๋Š” ๋…๋ฆฝ ์‹คํ–‰ํ˜• ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํ”„๋ง ๋ถ€ํŠธ Initializr๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋ฅด ์ƒ์„ฑํ•˜๋ฉด์„œ Spring Boot Admin (Server) ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์‰ฝ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์˜ depencency์— ์•„๋ž˜์™€ ๊ฐ™์€ ์˜์กด์„ฑ์ด ์ถ”๊ฐ€ ๋œ๋‹ค.

<dependency>
	<groupId>de.codecentric</groupId>
	<artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ ํด๋ž˜์Šค์— @EnableAdminServer ์• ๋…ธํ…Œ์ด์…˜์„ ์ง€์ •ํ•˜์—ฌ Admin ์„œ๋ฒ„๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค.

@SpringBootApplication
@EnableAdminServer
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

๋งˆ์ง€๋ง‰์œผ๋กœ Admin ์„œ๋ฒ„๊ฐ€ ๋กœ์ปฌ๋กœ ์‹คํ–‰๋˜๋Š” ์œ ์ผํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ณ ์œ ํ•˜๋ฉด์„œ๋„ ์ ‘๊ทผ์ด ์‰ฌ์šด ํฌํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ Admin ์„œ๋ฒ„์˜ ํฌํŠธ๋กœ 9090์„ ์„ ํƒํ–ˆ๋‹ค.

server:
  port: 9090

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:9090 ์ ‘์†ํ•˜๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

image

17.1.2 Admin ํด๋ผ์ด์–ธํŠธ ๋“ฑ๋กํ•˜๊ธฐ

Admin ์„œ๋ฒ„๋Š” ๋‹ค๋ฅธ ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ก์ถ”์—์ดํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ณ„๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Admin ์„œ๋ฒ„๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํด๋ผ์ด์–ธํŠธ๋กœ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ Admin ํด๋ผ์ด์–ธํŠธ๋ฅผ Admin ์„œ๋ฒ„์— ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž์‹ ์„ Admin ์„œ๋ฒ„์— ๋“ฑ๋กํ•œ๋‹ค.
  • Admin ์„œ๋ฒ„๊ฐ€ ์œ ๋ ˆ์นด ์„œ๋น„์Šค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ์„œ๋น„์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.

Admin ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑํ•˜๊ธฐ

์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž์‹ ์„ Admin ์„œ๋ฒ„์˜ ํด๋ผ์ด์–ธํŠธ๋กœ ๋“ฑ๋กํ•˜๋ ค๋ฉด ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋นŒ๋“œ์— ์Šคํ”„๋ง ๋ถ€ํŠธ Admin ํด๋ผ์ด์–ธํŠธ ์Šคํƒ€ํ„ฐ๋ฅผ ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ initializr์—์„œ๋Š” ์˜์กด์„ฑ์„ ์ง€์ •ํ•˜๋Š” ๋Œ€ํ™”์ƒ์ž์—์„œ Ops๋ฅผ ํ™•์žฅํ•œ ํ›„, 'Spring Boot Admin(Client)' ์ฒดํฌ๋ฐ•์Šค๋ฅด ์„ ํƒํ•˜๋ฉด ์‰ฝ๊ฒŒ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

<dependency>
	<groupId>de.codecentric</groupId>
	<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋‚ด์šฉ์„ ๊ฐ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ application.yml ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

spring:
  application:
    name: ingredient-service
  boot:
    admin:
      client:
        url: http://localhost:9090

์œ„ application name์€ Admin ์„œ๋ฒ„์— ์ด๋ฆ„์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์„ค์ •์ด๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ingredient-service๊ฐ€ Admin ์„œ๋ฒ„์— ๋‚˜ํƒ€๋‚œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

image

ํ˜„์žฌ๋Š” ๋งŽ์€ ์ •๋ณด๋ฅผ ๋‹ด์ง€ ์•Š๊ณ  ์žˆ์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘๋™์‹œ๊ฐ„๊ณผ ๋นŒ๋“œ ๋ฒ„์ „์„ ๋ณด์—ฌ์ค€๋‹ค.

์œ„์—์„œ ์†Œ๊ฐœํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋™์ผํ•œ ๊ตฌ์„ฑ(application.yml) ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ, spring.application.name ์†์„ฑ๋งŒ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ณ , spring.boot.admin.client.url ์†์„ฑ์€ ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ๊ตฌ์„ฑ ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋„๋ก ํ•˜๋ฉด ๋” ์‰ฝ๋‹ค. ๋˜๋Š” ์œ ๋ ˆ์นด๋ฅผ ์„œ๋น„์Šค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด Admin ์„œ๋ฒ„๊ฐ€ ์ž์‹ ์˜ ์„œ๋น„์Šค๋“ค์„ ์ฐพ๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” Admin ์„œ๋ฒ„๋ฅผ ์œ ๋ ˆ์นด ํด๋ผ์ด์–ธํŠธ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณธ๋‹ค.

Admin ํด๋ผ์ด์–ธํŠธ ์ฐพ๊ธฐ

์„œ๋น„์Šค๋“ค์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ Admin ์„œ๋ฒ„๋ฅผ ํ™œ์„ฑํ™”ํ•  ๋•Œ๋Š” Admin ์„œ๋ฒ„ ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ์— ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ Netflix ์œ ๋ ˆ์นด ํด๋ผ์ด์–ธํŠธ ์Šคํƒ€ํ„ฐ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋•Œ Admin ์„œ๋ฒ„ ํ”„๋กœ์ ํŠธ์— ์•„๋ž˜์˜ dependency๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<groupId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

์ด๋ ‡๊ฒŒ ํ•ด์„œ Admin ์„œ๋ฒ„๊ฐ€ ์œ ๋ ˆ์นด ํด๋ผ์ด์–ธํŠธ๋กœ ํ™œ์„ฑํ™”๋˜๋ฉด ๋” ์ด์ƒ ์ถ”๊ฐ€๋กœ ํ•ด์ค„ ๊ฒƒ์€ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ž์—์„œ ์–˜๊ธฐํ–ˆ๋˜ ๋ชจ๋“  ํด๋ผ์ด์–ดํŠธ์˜ application.yml ํŒŒ์ผ ๊ตฌ์„ฑ์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์œ ๋ ˆ์นด์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Admin ์„œ๋ฒ„๊ฐ€ ์ž๋™์œผ๋กœ ์ฐพ์•„์„œ ๊ทธ๊ฒƒ์˜ ์•ก์ถ”์—์ดํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ ๋ ˆ์นด์— ๋“ฑ๋ก๋œ ํƒ€์ฝ” ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋“ค์ด ์žˆ๋‹ค๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ Admin ์„œ๋ฒ„์—๋„ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๋‹ค.

image

image

ํ˜„์žฌ๋Š” Admin ์„œ๋ฒ„๊ฐ€ ์œ ๋ ˆ์นด ํด๋ผ์ด์–ธํŠธ์ด์ง€๋งŒ, ์ž์‹ ์„ ์œ ๋ ˆ์นด ์„œ๋น„์Šค๋กœ๋„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ๋Š” application.yml ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

eureka:
  client:
    register-with-eureka: false

17.2 Admin ์„œ๋ฒ„ ์‚ดํŽด๋ณด๊ธฐ

Admin ์„œ๋ฒ„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋“ค

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฑด๊ฐ• ์ƒํƒœ ์ •๋ณด์™€ ์ผ๋ฐ˜ ์ •๋ณด
  • Micrometer๋ฅผ ํ†ตํ•ด ๋ฐœํ–‰๋˜๋Š” ๋ฉ”ํŠธ๋ฆญ๊ณผ ์—”๋“œํฌ์ธํŠธ
  • ํ™˜๊ฒฝ ์†์„ฑ
  • ํŒจํ‚ค์ง€์™€ ํด๋ž˜์Šค์˜ ๋กœ๊น… ๋ ˆ๋ฒจ
  • ์Šค๋ ˆ๋“œ ์ถ”์  ๊ธฐ๋ก ์ •๋ณด
  • HTTP ์š”์ฒญ์˜ ์ถ”์  ๊ธฐ๋ก
  • ๊ฐ์‚ฌ ๋กœ๊ทธ

์‚ฌ์‹ค์ƒ ์—‘์ถ”์—์ดํ„ฐ๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ํ›จ์”ฌ ๋” ์ธ๊ฐ„ ์นœํ™”์ ์ธ ํ˜•ํƒœ๋กœ Admin ์„œ๋ฒ„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฑ…์—์„  ๋ช‡๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ฒƒ์„ ์˜ˆ์‹œ๋กœ ๋ณด์—ฌ์ค€๋‹ค.

17.2.1 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฑด๊ฐ• ์ƒํƒœ ์ •๋ณด์™€ ์ผ๋ฐ˜ ์ •๋ณด ๋ณด๊ธฐ

์•ก์ถ”์—์ดํ„ฐ๋Š” ๊ฑด๊ฐ• ์ƒํƒœ ์ •๋ณด์™€ ์ผ๋ฐ˜ ์ •๋ณด๋ฅผ /health์™€ /info ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ์ œ๊ณตํ•œ๋‹ค.

Admin ์„œ๋ฒ„๋Š” Details ํƒญ์—์„œ ์ด ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

image

Details ํƒญ์˜ ํ™”๋ฉด์„ ์Šคํฌ๋กคํ•˜๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด JVM์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด์˜ ์œ ์šฉํ•œ ํ†ต๊ณ„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์™€ ์Šค๋ ˆ๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ทธ๋ž˜ํ”„๋“ค๊ณผ ํ”„๋กœ์„ธ์Šค ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ๋‹ค.

image

17.2.2 ํ•ต์‹ฌ ๋ฉ”ํŠธ๋ฆญ ์‚ดํŽด๋ณด๊ธฐ

/metrics ์—”๋“œํฌ์ธํŠธ๋กœ๋ถ€ํ„ฐ ์ œ๊ณต๋˜๋Š” ์ •๋ณด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒ์„ฑ๋˜๋Š” ๋ฉ”ํŠธ๋ฆญ์ด๋ฉฐ, ๋ชจ๋“  ์—‘์ถ”์—์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ ์ค‘ ๊ฐ€์žฅ ๋œ ์ธ๊ฐ„ ์นœํ™”์ ์ธ ํ˜•ํƒœ์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Admin ์„œ๋ฒ„๊ฐ€ Metrics ํƒญ์˜ UI๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ผ๋ฐ˜์ธ์ด ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ•œ๋‹ค.

Metrics ํƒญ์—์„  ๊ด€์ฐฐ์ ์„ ์„ค์ •ํ•˜๋ฉด ์ด๊ฒƒ์— ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ์ด ๋ฉ”ํŠธ๋ฆญ๋“ค์€ ์ƒˆ๋กœ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™ ์—…๋ฐ์ดํŠธ๋˜์–ด ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

image

17.2.3 ํ™˜๊ฒฝ ์†์„ฑ ์‚ดํŽด๋ณด๊ธฐ

์•ก์ถ”์—์ดํ„ฐ์˜ /env ์—”๋“œํฌ์ธํŠธ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์†์„ฑ ๊ทผ์›(JVM ์‹œ์Šคํ…œ, ๋ช…๋ นํ–‰ ์ธ์ž, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ)์œผ๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ ์†์„ฑ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ˜ํ™˜๋˜๋Š” JSON ์‘๋‹ต์ด ๋ณด๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์€ ์•„๋‹ˆ๋‚˜ Admin ์„œ๋ฒ„๋Š” ๋” ๋ณด๊ธฐ ์ข‹์€ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์†์„ฑ์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ณด๋ ค๋Š” ์†์„ฑ ๋‚ด์—ญ์„ ์†์„ฑ ์ด๋ฆ„์ด๋‚˜ ๊ฐ’์œผ๋กœ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ Environment Manager๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ ์†์„ฑ ๊ฐ’์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

image

17.2.4 ๋กœ๊น… ๋ ˆ๋ฒจ์„ ๋ณด๊ฑฐ๋‚˜ ์„ค์ •ํ•˜๊ธฐ

์•ก์ถ”์—์ดํ„ฐ์˜ /loggers ์—”๋“œํฌ์ธํŠธ๋Š” ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๊น… ๋ ˆ๋ฒจ์„ ํŒŒ์•…ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ํŒจํ‚ค์ง€์™€ ํด๋ž˜์Šค์˜ ๋กœ๊น… ๋ ˆ๋ฒจ์„ ๋ณด์—ฌ์ฃผ์ง€๋งŒ, ์ด๋ฆ„์ด๋‚˜ ๋กœ๊น… ๋ ˆ๋ฒจ๋กœ ํ•„ํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

image

17.2.5 ์Šค๋ ˆ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง

/threaddump ์•ค๋“œํฌ์ธํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ ์Šค๋ƒ…์ƒท์„ ์ œ๊ณตํ•œ๋‹ค.

image

๊ฐ ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” Threads ํƒญ์˜ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋Š” ์ง€์†์ ์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค. ์ด๋•Œ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ฉด ์ดˆ๋ก์ƒ‰์œผ๋กœ, ๋Œ€๊ธฐ ์ค‘์ด๋ฉด ๋…ธ๋ž€์ƒ‰์ด ๋˜๋ฉฐ, ์ค‘๋‹จ๋˜๋ฉด ๋นจ๊ฐ„์ƒ‰์ด ๋œ๋‹ค.

๊ฐ ์Šค๋ ˆ๋“œ์— ๊ด€ํ•œ ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๋ณด๋ ค๋ฉด ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์Šค๋ ˆ๋“œ ์ค‘ ์›ํ•˜๋Š” ๊ฒƒ์„ ํด๋ฆญํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ์— ๊ด€ํ•œ ํ˜„์žฌ์˜ ์Šคํƒ ๊ธฐ๋ก๊ณผ ํ•จ๊ป˜ ์ด๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ํ™•์žฅ๋˜์–ด ๋‚˜ํƒ€๋‚œ๋‹ค.

17.2.6 HTTP ์š”์ฒญ ์ถ”์ ํ•˜๊ธฐ

์Šคํ”„๋ง ๋ถ€ํŠธ Admin UI์˜ HTTP Traces ํƒญ์—์„œ๋Š” ์•ก์ถ”์—์ดํ„ฐ์˜ /httptrace ์•ค๋“œํฌ์ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ์ฒ˜์Œ์—๋Š” 100๊ฐœ์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ์š”์ฒญ๋“ค๋งŒ ๋ณด์—ฌ์ฃผ์ง€๋งŒ, ์ดํ›„๋กœ๋Š” ์ถ”์ ์ด ๊ณ„์†๋œ๋‹ค.

image

์œ„ ๊ทธ๋ฆผ์˜ ์ดˆ๋ก์ƒ‰์€ ์„ฑ๊ณต์ ์ธ ์š”์ฒญ์„, ๋…ธ๋ž€์ƒ‰์€ ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ๋ฅผ ๋นจ๊ฐ„์ƒ‰์€ ์„œ๋ฒ„ ์—๋Ÿฌ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ทธ๋ž˜ํ”„ ์•„๋ž˜์ชฝ์—๋Š” ์ถ”์  ์ด๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ›์€ ๊ฐ ์š”์ฒญ์„ ํ•œ ํ–‰์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›ํ•˜๋Š” ํ–‰์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ํ–‰์ด ํ™•์žฅ๋˜๋ฉด์„œ ์š”์ฒญ ํ—ค๋”์™€ ์‘๋‹ต ํ—ค๋”๋ฅผ ํฌํ•จํ•˜๋Š” ํ•ด๋‹น ์š”์ฒญ์— ๊ด€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

image

17.3. Admin ์„œ๋ฒ„์˜ ๋ณด์•ˆ

Admin ์„œ๋ฒ„๋Š” ๊ด€๋ฆฌ์ž๋งŒ์ด ๋ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ธ ๋‚ด์šฉ์„ ๋…ธ์ถœํ•˜๋Š” ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Admin ์„œ๋ฒ„์˜ ๋ณด์•ˆ์ด ์ค‘์š”ํ•˜๊ณ , Admin ์„œ๋ฒ„์— ๋ณด์•ˆ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.

17.3.1 Admin ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ํ™œ์„ฑํ™”ํ•˜๊ธฐ

Admin ์„œ๋ฒ„๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•˜๋“ฏ์ด ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ์„  Spring Security ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactdId>
</dependency>

๊ทธ๋ฆฌ๊ณ  ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ Admin ์„œ๋ฒ„์˜ ๋กœ๊ทธ์—์„œ ๊ณ„์† ์ฐพ์„ ํ•„์š”๊ฐ€ ์—†๋„๋ก ๊ฐ„๋‹จํ•œ ๊ด€๋ฆฌ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ application.yml ํŒŒ์ผ์— ๊ตฌ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

spring:
  security:
    user:
      name: admin
      password: 53cr3t

17.3.2 ์•ก์ถ”์—์ดํ„ฐ๋กœ ์ธ์ฆํ•˜๊ธฐ

16์žฅ์—์„œ ์—‘์ถ”์—์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ์˜ ๋ณด์•ˆ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜์˜€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ก์ถ”์—์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ์— ์ง€์ •ํ•œ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ชจ๋ฅด๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์ ‘๊ทผ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. ์—‘์ถ”์—์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด Admin ์„œ๋ฒ„๋„ ์—‘์ถ”์—์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

Admin ์„œ๋ฒ„์˜ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์‹ ์„ ์ง์ ‘ Admin ์„œ๋ฒ„์— ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜, ์œ ๋ ˆ์นด๋ฅผ ํ†ตํ•ด ๋ฐœ๊ฒฌ๋˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์ž์‹ ์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ Admin ์„œ๋ฒ„์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์ผ Admin ์„œ๋ฒ„์˜ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ง์ ‘ Admin ์„œ๋ฒ„์— ๋“ฑ๋กํ•œ๋‹ค๋ฉด ๋“ฑ๋กํ•  ๋•Œ ์ž์‹ ์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ Admin ์„œ๋ฒ„์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

์•ค๋“œํฌ์ธํŠธ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ์ •๋ณด๋Š” ๊ฐ ํด๋ผ์ด์–ธํŠธ์˜ application.yml์— ์•„๋ž˜์™€ ๊ฐ™์€ ์†์„ฑ์„ ์ง€์ •ํ•œ๋‹ค.

spring:
  boot:
    admin:
      client:
        url: http://localhost:9090
        instance:
          metadata:
            user.name: ${spring.security.user.name}
            user.password: ${spring.security.user.password}

Admin ์„œ๋ฒ„๊ฐ€ ์œ ๋ ˆ์นด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐœ๊ฒฌํ•˜๋„๋ก ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์†์„ฑ์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

eureka:
  instance:
    metadata-map:
      user.name: admin
      user.password: password

์š”์•ฝ

  • ์Šคํ”„๋ง ๋ถ€ํŠธ Admin ์„œ๋ฒ„๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ๋ถ€ํ„ฐ ์•ก์ถ”์—์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์†Œ๋น„ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
  • ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž์‹ ์„ ํด๋ผ์ด์–ธํŠธ๋กœ Admin ์„œ๋ฒ„์— ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜๋Š” Admin ์„œ๋ฒ„๊ฐ€ ์œ ๋ ˆ์นด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฐพ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์˜ ์Šค๋ƒ…์ƒท์„ ์บก์ณํ•˜๋Š” ์•ก์ถ”์—์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, Admin ์„œ๋ฒ„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‚ด๋ถ€ ์ž‘์—…์— ๊ด€ํ•œ ์‹ค์‹œ๊ฐ„ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • Admin ์„œ๋ฒ„๋Š” ์•ก์ถ”์—์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ ์‰ฝ๊ฒŒ ํ•„ํ„ฐ๋งํ•ด ์ฃผ๋ฉฐ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ๊ทธ๋ž˜ํ”„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
  • Admin ์„œ๋ฒ„๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ฏ€๋กœ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ๋ณด์•ˆ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ