Java

[SpringBoot] 프로덕션 환경 배포 준비하기(로깅, 모니터링, 구성관리)

ride-dev 2023. 12. 22. 14:35

프로덕션 환경에서 사용 가능한 애플리케이션을 쉽게 만들 수 있도록 Spring Boot의 중요한 기능을 몇 가지 알아보겠습니다.

1. Profiles

애플리케이션에는 다양한 환경이 있습니다.(Dev, QA, Stage, Prod, ...)

동일한 애플리케이션이라도, 환경에 따라 다른 설정이 필요할 수 있습니다.

(다른 DB와 통신하거나, 다른 웹 서비스를 호출할 수도 있습니다)

프로필을 통해 환경별 설정을 제공할 수 있습니다.

더보기

L src

    L main

        L resources

            L application.properties

logging.level.org.springframework=debug
spring.profiles.active=prod

            L application-dev.properties

logging.level.org.springframework=trace

            L application-prod.properties

logging.level.org.springframework=info​

 

기본적으로 application.properties의 우선도가 높지만,

spring.profiles.active=prod

를 작성하여 application.properties와 application-prod를 병합하면,

application-prod에 작성된 것이 우선시됩니다.

 

따라서 로깅수준이 info가 됩니다.

더보기

로깅 수준

환경에 따라 로깅 수준을 달리할 때 프로필을 활용할 수 있습니다.

 

off 로깅 끄기

 

error 오류와 예외만 출력

warning error보다 조금 더 많은 정보를 출력

info (warning 포함)info 수준에서 로깅된 모든 정보를 출력

debug info 보다 더 많은 정보를 출력

trace 로그에 있는 모든 정보를 출력

애플리케이션에는 여러 환경이 있으며,

환경마다 다른 설정이 필요할 수 있습니다.

프로필을 만들고 환경에 따라 다른 설정을 할 수 있습니다.

 

2. ConfigurationProperties

Spring @Component를 생성하고 @ConfigurationProperties를 사용하면,

사용자가 정의한 프로퍼티를 쉽게 사용할 수 있습니다.

더보기

url, username, key 라는 프로퍼티를 생성해보겠습니다,

application.properties에 아래 코드를 추가합니다.

currency-service.url=http://defalut1.sj.com
currency-service.username=defaultusername
currency-service.key=defaultkey

CurrencyServiceConfiguration 클래스를 생성하고 프로퍼티에 매핑합니다.

@ConfigurationProperties(prefix = "currency-service")
@Component
public class CurrencyServiceConfiguration {
    private String url;
    private String username;
    private String key;
    
    //getter, setter
}

매핑이 잘 이루어졌는지 Controller를 생성하여 확인합니다.

@RestController
public class CurrencyConfigurationController {

    @Autowired
    private CurrencyServiceConfiguration configuration;

    @RequestMapping("/currency-configuration") // URL을 특정 메소드에 매핑
    public CurrencyServiceConfiguration retrieveAllCourses() {
        return configuration;
    }
}

http://localhost:8080/currency-configuration 으로 이동하여 확인합니다.

{
	"url": "http://default1.sj.com",
	"username": "defaultusername",
	"key": "defaultkey"
}

 

다른 프로필에서 다른 프로퍼티를 사용하려면, 프로필에서 다른 값을 입력합니다.

currency-service.url=http://dev.sj.com
currency-service.username=devusername
currency-service.key=devkey
{
	"url": "http://dev.sj.com",
	"username": "devusername",
	"key": "devkey"
}

위와 같은 결과를 얻을 수 있습니다.

@ConfigurationProperties을 사용하면 모든 애플리케이션 관련 설정을 위한 중앙집중화된 클래스 역할을 합니다.

이를 통해 애플리케이션에 필요한 모든 설정을 외부화할 수 있습니다.

3. Embedded Servers

Spring Boot Embedded Server를 사용하여 배포를 간소화할 수 있습니다.

다양한 환경을 사용하거나,

DevOps 원칙에 따라 배포를 자주하는 방식을 따른다면,

배포 프로세스를 최대한 간소화하는 것이 중요합니다.

배포 프로세스

WAR, Embedded Server

WAR

WAR 프로세스

1. Java를 설치합니다

2. Tomcat, Weblogic, WebSphere 등 Web Server나 Application Server를 설치합니다.

3. 애플리케이션 WAR 파일을 배포합니다.

Embedded Server

Embedded 프로세스

Embedded Server를 사용하면 서버가 이미 JAR 파일에 포함되어 있기 때문에 따로 설정을 하지 않아도 됩니다.

spring 기본설정은 spring-boot-starter-tomcat으로 Tomcat이지만,

spring-boot-starter-jetty,

spring-boot-starter-undertow 또한 지원합니다.

 

1. Java를 설치합니다.

2. JAR 파일을 실행합니다.

maven goal에서 명령어를 사용하여 JAR 파일을 생성하고,

mvn clean install

명령어로 JAR파일을 실행할 수 있습니다. 

java -jar JAR파일
java -jar /Users/user/Desktop/projects/learn-spring-boot/target/learn-spring-boot-0.0.1-SNAPSHOT.jar

(실행된 애플리케이션은 Ctrl C 혹은 Cmd C 로 종료할 수 있습니다)

4. Actuator

프로덕션 환경에서 사용하고 있는 애플리케이션의 백그라운드에서

어떤 일이 발생하고 있는지 확인(모니터링)하고 싶을 수 있습니다.

Spring Boot Actuator를 통해 프로덕션 단계의 애플리케이션을 모니터링하고 관리할 수 있습니다.

Spring Boot Actuator는 여러 개의 엔드포인트를 제공합니다.

엔드포인트

  • beans - 애플리케이션에 포함된 모든 Spring beans를 이 beans 엔드포인트를 사용하여 확인할 수 있습니다.
  • health - 애플리케이션의 상태 정보를 확인하여 애플리케이션이 제대로 작동하는지 볼 수 있습니다.
  • configprops - application.properties에서 설정할 수 있는 모든 항목을 확인할 수 있습니다.
  • env - env 엔드포인트를 확인할 수 있습니다(환경에 관한 세부 사항을 모두 표시)
  • metrics - 애플리케이션과 관련된 여러 가지 metrics를 제공합니다
    (애플리케이션 시작 시간, disk 여유공간, pool, JVM관련, 요청 횟수, ...)
  • mappings - 설정된 모든 요청 매핑 관련 세부 사항을 확인할 수 있습니다
  • 그 외에도 여러 엔드포인트가 있습니다.

1. Spring Boot Actuator를 사용하기 위해 의존성을 추가합니다.

pom.xml

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

gradle

implementation 'org.springframework.boot:spring-boot-starter-actuator'

2. localhost:8080/actuator 에 접속하여 확인할 수 있습니다.

{
	"_links": {
		"self": {
			"href": "http://localhost:8080/actuator",
			"templated": false
		},
		"health": {
			"href": "http://localhost:8080/actuator/health",
			"templated": false
		},
		"health-path": {
			"href": "http://localhost:8080/actuator/health/{*path}",
			"templated": true
		}
	}
}

2-1. application.properties 에서 기능에 대한 설정을 할 수 있습니다.

Actuator에서 제공하는 모든 엔드포인트가 노출됩니다.

management.endpoints.web.exposure.include=*

http://localhost:8080/actuator 에 접속하면 Actuator에서 제공하는 모든 엔드포인트를 확인할 수 있습니다.

{
    "_links":{
        "self":{
            "href":"http://localhost:8080/actuator",
            "templated":false
        },
        "beans":{
            "href":"http://localhost:8080/actuator/beans",
            "templated":false
        },
        "caches-cache":{
            "href":"http://localhost:8080/actuator/caches/{cache}",
            "templated":true
        },
        "caches":{
            "href":"http://localhost:8080/actuator/caches",
            "templated":false
        },
        "health":{
            "href":"http://localhost:8080/actuator/health",
            "templated":false
        },
        "health-path":{
            "href":"http://localhost:8080/actuator/health/{*path}",
            "templated":true
        },
        "info":{
            "href":"http://localhost:8080/actuator/info",
            "templated":false
        },
        "conditions":{
            "href":"http://localhost:8080/actuator/conditions",
            "templated":false
        },
        "configprops-prefix":{
            "href":"http://localhost:8080/actuator/configprops/{prefix}",
            "templated":true
        },
        "configprops":{
            "href":"http://localhost:8080/actuator/configprops",
            "templated":false
        },
        "env":{
            "href":"http://localhost:8080/actuator/env",
            "templated":false
        },
        "env-toMatch":{
            "href":"http://localhost:8080/actuator/env/{toMatch}",
            "templated":true
        },
        "loggers":{
            "href":"http://localhost:8080/actuator/loggers",
            "templated":false
        },
        "loggers-name":{
            "href":"http://localhost:8080/actuator/loggers/{name}",
            "templated":true
        },
        "heapdump":{
            "href":"http://localhost:8080/actuator/heapdump",
            "templated":false
        },
        "threaddump":{
            "href":"http://localhost:8080/actuator/threaddump",
            "templated":false
        },
        "metrics":{
            "href":"http://localhost:8080/actuator/metrics",
            "templated":false
        },
        "metrics-requiredMetricName":{
            "href":"http://localhost:8080/actuator/metrics/{requiredMetricName}",
            "templated":true
        },
        "scheduledtasks":{
            "href":"http://localhost:8080/actuator/scheduledtasks",
            "templated":false
        },
        "mappings":{
            "href":"http://localhost:8080/actuator/mappings",
            "templated":false
        }
    }
}

이처럼 많은 엔드포인트를 제공받아 모니터링할 수 있지만,

CPU와 메모리 수준을 고려하여

필요한 것만 사용하는 것을 권장합니다.

728x90