스프링부트 : 시스템 환경변수 읽기

## 시스템환경 변수를 체크해야하는 이유
- 코드리뷰에서도 별 문제 없던 프로그램이 서버에서 돌리면 죽어요
	- 그 이유는 서버 사양을 고려하지 않은 코딩이기 때문입니다. 
	- 대표적으로 스레드, 대용량 처리 등이 있을 수 있습니다.
	- 서버 증설 외에는 방법이 없을 수 있습니다. 
	- 얼마만큼 증설해야 하는지에 대한 공식은 여러분의 몫입니다. (여기서 개발자 급이 나뉩니다)
- DB접속 정보 등 민감한 정보를 아예 코드에서 제거하고 싶습니다.
	- 서버의 시스템 환경 변수로 설정하세요
## @Value
application.properties (또는 yml)에 설정한 변수를 읽어올 수 있다. 애플리케이션 환경변수 수준이라면 여기가 가장 적절한 위치다.
```properties
# application.properties
spring.application.name=the factory
```

```java
public class SysenvApplication implements CommandLineRunner{
	@Value("${spring.application.name}")
	private String applicationName ;

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

	@Override
	public void run(String... args) throws Exception {
		System.out.println("==spring.application.name==" + applicationName);
	}
}
```

> [!NOTE] CommandLineRunner
> 스프링부트에서는 애플리케이션 구동시 대표적으로 두 개의 runner를 사용할 수 있다. CommandLineRunner와 ApplicationRunner 가 있는데 CommandLineRunner보다는 ApplicationRunner가 권장된다. 둘의 차이점은 파라미터에 있는데 CommandLineRunner는 배열로 받으므로 편의성이 조금 떨어진다.
> [Guide To Running Logic on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring)

## System.getenv()
java api에서 제공해주는 메서드이다. OS수준의 시스템 환경변수의 값을 조회할 수 있다.
```java
public void getSystemEnv() {
	Map<String, String> sysEnvMap = System.getenv();
	Set<Entry<String,String>> entrySet = sysEnvMap.entrySet();
	entrySet.forEach(entry -> System.out.println(entry.toString()));
}
```

## Environment
```java
	@Autowired
	private Environment env;
```

```java
public void getEnvironment() {
	String applicationPort = env.getProperty("PATH");
	System.out.println("==SYSTEM PATH==" + applicationPort);
}
```

## 그러면 CPU, Memory 체크는 어떻게 하나
### Interface OperatingSystemMXBean
[api doc](https://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/OperatingSystemMXBean.html)
```java
import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;

public void monitoring() {
		try {
			OperatingSystemMXBean osBean = 
					ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
			System.out.println("os version : " + osBean.getVersion());
			System.out.println("cpu available : " + osBean.getAvailableProcessors());
			System.out.println("cpu usage : " + osBean.getCpuLoad());
			System.out.println("total memory : " + osBean.getTotalMemorySize()/1024/1024/1024);

		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}
```

댓글

이 블로그의 인기 게시물

Session 대신 JWT를 사용하는 이유

VSCode에서의 VIM 단축키와 키보드 구매 가이드

우분투에서 테스트링크(testlink)와 맨티스(mantis)로 테스팅 서버 구성하기