프로덕션 환경에서 사용 가능한 애플리케이션을 쉽게 만들 수 있도록 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
1. Java를 설치합니다
2. Tomcat, Weblogic, WebSphere 등 Web Server나 Application Server를 설치합니다.
3. 애플리케이션 WAR 파일을 배포합니다.
Embedded Server
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와 메모리 수준을 고려하여
필요한 것만 사용하는 것을 권장합니다.
'Java' 카테고리의 다른 글
[JPA, Hibernate] 시작하기 -1, 초기 설정 및 JDBC 사용하기 (0) | 2023.12.22 |
---|---|
[SpringBoot] Spring Boot vs. Spring vs. Spring MVC (0) | 2023.12.22 |
[SpringBoot] Spring Boot 목적, 프로젝트 생성(spring.io) (0) | 2023.12.21 |
[SpringBoot] Spring Boot 등장 배경 (1) | 2023.12.21 |
[SpringFramework] 개념 및 용어 정리 (0) | 2023.12.20 |