🐶 application.yml 파일 활용하는법
plication.yml일을 개발 환경별로 여러개 만들어서 사용할 수 있다.
보통 (loval) / 개발(dev) / 운영(prod)으로 만들어서 사용한다고 한다.
yml 파일을 여러개 만드는 법은 plication-local.yml / application-dev.yml / application-prod.yml렇게 생성 후 안에 환경 설정들을 각각 적어준다.
그런다음 Run/Debug Configurations
에서 어플리케이션 추가를 한뒤 아래처럼 만들어주면 된다.
➡ 이때 --spring.profiles.active=해당 어플리케이션 이름
을 적어주면 된다.
그런다음 기존에 있던 그냥 aplication.yml일에는 어떤 설정 파일을 실행시킬것인지 아래처럼 적어주면 된다.
spring:
profiles:
active: local
🐼 application.yml 파일 환경변수 설정하기
어제 개인적으로 진행중인 쇼핑몰 프로젝트를 하다가 의문점이 들었었는데, 오늘 해결된 부분이 있었다. 그것이 바로 application.yml 파일에 대한 내용이었다.
보통 application.yml 파일에는 알려지면 안되는 민감한 정보들도 포함되어 있기 때문에 깃에 올릴때 .gitignore
에 포함시켜서 깃에 업로드 되지 않도록 설정한다고 배웠었다.
하지만 어제 교육장소에서 작업 후 집에서 git pull
을 하니깐 application.yml 파일이 깃에 업로드가 안되어 있어서 다시 만들어서 생성해줘야 됬었다.
이처럼 팀으로 프로젝트를 진행할 때 이러한 설정 파일도 서로 공유가 되야되기 때문에 깃에 업로드를 해야되는데 이럴때 민감한 정보를 가리고 보낼 수 있도록 하는 것이 환경변수 설정이다.
환경변수를 설정하는 방법은 내가 공개하고 싶지 않은 것을 내가 원하는 이름으로 설정할 수 있다. 설정은 ${설정할이름}
이렇게 하면 된다. 그다음
Run/Debug Configurations
에서 Environment variables
에 내가 설정한 이름에 대한 값을 적어주면 된다.
예를 들어 ${TEST}
라고 설정 했으면, TEST=1234
로 적어주면 된다. 값을 적어줄때는 아래 그림의 동그라미 친 부분을 누르면 쉽게 입력할 수 있다.
아래는 내가 진행중인 개인 프로젝트의 DB 연결 부분을 환경변수로 바꿔준 내용이다. 이렇게 하면 git에 application.yml 파일을 업로드해도 전혀 문제될게 없을 것이다.
🦁 스프링 부트 웹서버 리눅스 서버 이용 실행하기
사전에 VMware Workstation 으로 리눅스 서버 1대를 준비해줬다.
➡ IP 설정 및 방화벽을 다 꺼준 상태이다.
리눅스 서버에서 웹 어플리케이션을 실행해주기 위해서는 인텔리제이에서 pom.xml
파일에 내용을 2줄 추가해줘야된다.
➡ 첫번째 화살표의 내용은 내 프로젝트 명을 적어주면 된다.
➡ 두번째 화살표의 내용은 jar
파일을 만들어주기 위해 package를 눌러주는데,
그때 자동으로 테스트를 해서 환경변수 설정한 것 때문에 에러가 나서 package 할때
테스트를 하지 말라는 내용이다.
다음으로 나는 메이븐을 사용하고 있는데, 오른쪽 메뉴바의 m 표시를 눌러서 Lifecycle
을 보면 package가 있다. 이것을 더블 클릭해주면 된다.
➡ 정상적으로 됬다면 프로젝트에 target 폴더가 생겼을 것이고 그것을 열어보면
프로젝트이름-0.0.1-SNAPSHOT.jar
이 생성되 있을 것이다.
이제 이 생성된 jar
파일을 리눅스 서버로 옮기면 되는데 옮기는 방법은 아래와 같다.
1) 윈도우에서 cmd 창을 열고( 관리자 권한 X ) jar
파일이 생성된 폴더로 이동한다.
➡ cd C:\springbootproject\yml\target\
파일 경로는 jar 파일 우클릭 해보면
copy/path
가 있는데 그것을 클릭해보면 알 수 있다.
2) 다음으로 아래의 명령어를 입력하면 리눅스 서버로 파일이 전송된다.
➡ scp yml-0.0.1-SNAPSHOT.jar [리눅스 서버 계정명]@[리눅스 서버 IP주소]:[리눅스
서버에서 파일을 저장할 경로]
➡ 그럼 정말로 연결을 진행할 것인지 물어보는 내용이 출력되고, yes를 입력해주면,
계정의 패스워드를 입력하라고 나온다. 패스워드를 정상적으로 입력하면 아래처럼
출력되고, 리눅스 서버에서 저장한 경로로 이동하면 정상적으로 jar
파일이
생성된 것을 확인할 수 있을 것이다.
다음으로 리눅스 서버(CentOs)
에 내가 사용하는 자바 jdk를 설치해주면 된다.
나는 jdk 11
을 사용중이고 설치하는 방법은 아래와 같다.
1) open jdk 11 설치 : yum install java-11-openjdk-devel.x86_64
➡ 정상 설치여부 확인 : java --version
2) 환경 변수 설정
➡ javac 설치경로 확인 : which javac
➡ 설치 경로에 연결된 원본파일 위치 확인 : readlink -f [설치경로]
➡ 나는 아래와 같이 떴는데 여기서 제일 뒤의 /bin/javac 전까지가 JAVA_HOME
으로 설정할 경로이다.
/usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64/bin/javac
➡ 환경 변수 설정 : vi /etc/profile
➡ 열린 파일 제일 밑에 JAVA_HOME 설정 내용 추가
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64
➡ 설정 후 변경사항 적용 : source /etc/profile
➡ 적용 결과 확인 : echo $JAVA_HOME
여기까지 끝났다면, 웹 어플리케이션에서 설정했던 환경변수에 대한 값을 설정해준다. 나는 아까 ${TEST} 라는 환경변수를 만들었고 여기에 값을 설정해주기 위해서는
export TEST=1111
이렇게 입력해주면 된다.
➡ 환경 변수에 값이 설정됬는지 확인 : env | grep TEST
마지막으로 jar
파일을 실행시켜준다 : java -jar yml-0.0.1-SNAPSHOT.jar
그러면 아래와 같이 스프링 부트가 실행 될 것이다.
정상적으로 동작하는지 간단하게 컨트롤러를 아래와 같이 만들어봤다.
// application-local.yml 파일
my:
var: ${TEST}
// ApiController 클래스
@RestController
@RequestMapping("/api")
public class ApiController {
private final Logger log = LoggerFactory.getLogger(ApiController.class);
@Value("${my.var}")
private String var;
@RequestMapping(method = RequestMethod.GET, value = "/app")
public ResponseEntity app() {
log.info("my var is {}", var);
return ResponseEntity.ok().body("ok");
}
}
포스트맨을 이용하여 GET 방식으로 [리눅스 서버 IP]:8080/api/app
로 요청을 보내면 아래와 같이 정상적으로 응답이 오는것을 확인할 수 있고, 로그를 보면 TEST 환경변수
에 설정해준 값이 정상적으로 들어간 것을 볼 수 있다.
🐷 Vault 서버 실습하기
Vault 서버란 ?
Vault는 HashiCorp에 의해서 개발된 크로스플랫폼 패스워드 및 인증 관리 시스템이다. 공개되면 안되는 비밀번호, API 키, 토큰 등을 저장하고 관리한다
먼저 Vault 서버를 리눅스 컴퓨터에서 설치해준다. 설치하는 방법은 Vault 홈페이지에 나와있다. ( https://developer.hashicorp.com/vault/install#Linux )
1) yum install –y yum-utils
2) yum-config-manager —add-repo
https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
3) yum -y install vault
Vault 서버를 실행시킨다 : systemctl start vault
크롬에서 vault 서버 주소를 입력한다 : https://[리눅스 컴퓨터 IP]:8200
➡ 연결이 비공개로 설정되어 있지 않습니다로 뜨는데 고급을 누르고 (안전하지 않음)
으로 이동을 클릭해준다. 그러면 아래와 같이 뜰것이다.
다음으로 아래의 순서대로 진행해보겠다.
1) "Key shares" 와 "Key threshold" 는 아무것이나 원하는 숫자로 입력해준뒤
Initialize
를 클릭한다. ( 너무 길면 안된다. )
2) 나에게 발급된 Key가 나오는데 이것은 꼭 기억해줘야되기 때문에 맨 아래에
Download keys
를 눌러서 저장해 놓는다. 다음으로 Continue to Unseal
을
클릭한다.
3) 발급받은 Unseal 키들을 한개씩 모두 입력해줘야된다. 이때 키는 keys_base64
로
되있는 것을 입력해준다.
4) 발급받은 Token을 입력해준다. 정상적으로 인증이 끝나면 아래처럼 웹페이지가
나타날 것이다.
5) 왼쪽 메뉴바에서 Secrets Engines
클릭 후 Enable new engine
을 클릭해준다.
6) Generic 에서 KV(key-vaule)
를 클릭한뒤 Next를 누른다.
7) Path (나중에 URI 주소) 에 원하는 대로 적고 Enable Engine
을 클릭한다.
➡ 나는 "test" 라고 적어줬다.
8) Create secret
클릭 후 Path for this secret에 원하는 내용을 적는다. 이 부분을
적으면 나중에 경로가 /test/[추가내용]
로 된다.
➡ 나는 "vault" 라고 적어줬다.
9) Secret data에 원하는 Key-Value
를 적어준다. Key는 환경변수로 설정할 이름,
Value는 환경변수에 설정할 값을 적어주면 된다.
10) 나는 아래와 같이 설정해 준뒤 Save
를 클릭했다.
11) 그런 다음 아래 그림처럼 Paths
를 클릭해서 나오는 API path 주소로 포스트맨을 이용하여 HTTP 요청을 보내서 테스트를 해보면 된다.
➡ 요청 주소 : https://[리눅스 서버 ip]:8200/[Api path 주소]
➡ Headers에 부여받은 토큰 추가
➡ 정상적으로 요청이 가면 아래와 같이 내가 설정한 key-value 값이
출력되는 것을 볼 수 있다.
🐸 스프링 부트에서 Vault 실습하기
스프링 부트에서 실습하기 위해선 위에서 설정한 Vault 로는 동작을 안한다. 주소가 Vault 서버의 프로토콜이 https
다 보니 인증받지 못해서 실행이 안되는 오류가 뜬다.
리눅스 컴퓨터의 방화벽을 꺼준다.
따라서 리눅스 서버에서 Valut 서버를 수동으로 실행시켜줘야된다.
1) 서버 설정 파일을 만들어서 아래의 내용을 입력한다 : vi vault.config
```java
backend "inmem" {
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}
```
2) 서버를 실행 시켜준다 : vault server -config=/root/vault.config
3) 서버는 실행시키면 작업이 안되므로 putty
로 쉘창을 한개 더 띄워준다.
4) 서버 초기화 : vault operator init
➡ 이때 Get "https://127.0.0.1:8200/v1/sys/seal-status": http: server gave
HTTP response to HTTPS client
오류가 뜬다면 Vault 서버 주소를 바꿔줘야된다.
➡ export VAULT_ADDR=http://127.0.0.1:8200
해준 뒤 다시 초기화 해준다.
5) 그러면 아래와 같이 Key 들과 Token이 출력될 것이다. 이것을 따로 적어놓는다.
6) Vault 서버 잠금을 해제한다 : vault operator unseal
➡ 서버 초기화 시 출력된 Unseal Key를 1번부터 입력한다.
➡ 위 과정을 3번 반복한다.
7) 토큰을 환경변수로 등록한다 : export VAULT_TOKEN=[초기화 시 받은 토큰]
8) 관리자를 생성한다 : vault token create -id="00000000-0000-0000-
0000-000000000000" -policy="root"
9) KV(key-value) 를 등록한다.
➡ vault secrets enable -path=엔진이름/ kv
➡ vault kv put 엔진이름/경로 환경변수1=값1 환경변수2=값2
➡ 설정한 key-value 리스트를 확인해본다 : vault kv get 엔진이름/경로
스프링 부트 pom.xml
파일에 vault 라이브러리를 추가해준다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
<version>3.1.3</version>
</dependency>
application.yml
파일에 vault 관련 설정 추가
my:
var: ${aaa}
spring.config.import: vault://
spring.cloud.vault:
host: 77.77.77.120 // 리눅스 컴퓨터 IP
port: 8200
scheme: https
uri: https://77.77.77.120:8200
token: hvs.hMCdq6WitF3KTOuEU96ZN7R3 // 부여 받았던 토큰
kv:
enabled: true
backend: test // 생성했던 경로 Path
application-name: my // 경로 Path 다음에 생성했던 경로
// ApiController 클래스
@RestController
@RequestMapping("/api")
public class ApiController {
private final Logger log = LoggerFactory.getLogger(ApiController.class);
@Value("${my.var}")
private String var;
@Value("${bbb}")
private String password;
@RequestMapping(method = RequestMethod.GET, value = "/app")
public ResponseEntity app() {
log.info("my var is {}", var);
log.info("password is {}", password);
return ResponseEntity.ok().body("ok");
}
}
스프링을 실행시키고 포스트맨으로 테스트해보면 아래와 같이 설정한 환경변수에 Vault 서버에서 지정한 key-value 값들이 불러와져서 출력되는 것을 볼 수 있다.
🐵 Spring Config Server 실습하기
서버와 클라이언트로 사용할 스프링 부트 프로젝트를 새로 생성한다.
서버로 사용할 스프링 부트 프로젝트의 pom.xml
파일에 라이브러리를 추가해준다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>3.1.3</version>
</dependency>
[프로젝트 이름]Application 클래스에 @EnableConfigServer
을 달아준다.
내 깃허브에 레포지터리를 하나 생성한다.
*.yml 파일
들을 모아놓는 폴더를 생성 후 테스트로 application-dev.yml
을 만들어본다. 내용은 아래와 같이 적어줬다.
my:
var1: 11111
var2: 22222
폴더에서 git bash 를 실행시켜서 깃 저장소를 설치한다 : git init
생성한 깃허브 레포지터리로 원격 저장소를 설정한다
git remote add origin [깃허브 레포지터리 주소]
폴더 내에 있는 *.yml
파일들을 커밋하고 푸쉬한다.
➡ git add .
➡ git commit -m "커밋 메시지"
➡ git push origin master
깃허브에서 제대로 업로드 되었는지 확인해본다.
서버의 application.yml
파일에 아래와 같이 적어준다.
server:
port: 8888
spring:
application:
name: config
cloud:
config:
server:
git:
uri: [깃허브 레포지터리 주소]
search-paths: /**
default-label: master
서버를 실행시킨다.
클라이언트 서버 설정
클라이언트 서버의 pom.xml
파일에 라이브러리를 추가해준다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<version>3.1.3</version>
</dependency>
클라이언트 서버의 application.yml
파일에 아래와 같이 입력해준다.
spring:
config:
import: "optional:configserver:http://localhost:8888/"
cloud:
config:
name: application // application-dev.yml 의 앞 부분
profile: dev // application-dev.yml 의 뒤 부분
ApiController 클래스를 아래와 같이 만들어서 포스트맨으로 테스트해본다.
@RestController
@RequestMapping("/api")
public class ApiController {
private final Logger log = LoggerFactory.getLogger(ApiController.class);
@Value("${my.var1}")
private String var1;
@Value("${my.var2}")
private String var2;
@RequestMapping(method = RequestMethod.GET, value = "/app")
public ResponseEntity app() {
log.info("my var1 is {}", var1);
log.info("mt var2 is {}", var2);
return ResponseEntity.ok().body("ok");
}
}
포스트맨으로 HTTP 요청을 보내면 정상적으로 응답이 오고, 로그를 보면 깃허브에 올려놨던 application-dev.xml
파일에서 my.var1 과 my.var2 의 값을 불러와서 출력하는 것을 볼 수 있다.
🦍 깃허브 레포지터리 비공개 설정 후 실습하기
하지만 *.yml
파일을 모아놓은 레포지터리를 공개로 설정해놓으면 민감한 자료들을 다른 사람들이 다 보게 되는 문제가 생긴다. 따라서 이것을 private으로 바꾼뒤 값을 불러오려면 Vault 서버를 사용해야 한다.
방식은 Vault 서버에 깃허브 username 과 password 를 key-value 로 저장해놓고 거기서 값을 불러와서 실행시키는 방법이다.
먼저, 깃허브를 private으로 바꾼뒤 비공개 레포지터리를 접근하려면 password가 깃허브에서 발급해주는 token 값이 된다.
토큰 발급받는 법
➡ 깃허브 프로필 클릭
- 왼쪽 메뉴바 제일 밑의 Developer settings
클릭
➡ Personal access tokens에서 Tokens(classic) 클릭
➡ Generate new Token 클릭
➡ Note는 사용 목적으로 목적에 맞게 적어준 뒤 권한은 일단 다 부여했다.
➡ Token이 발급되고 이것을 따로 저장해놓는다.
다음으로 서버의 application.yml
파일을 수정한다.
server:
port: 8888
spring:
cloud:
vault:
host: 77.77.77.120
port: 8200
scheme: http
uri: http://77.77.77.120:8200
token: hvs.HRZB8FDbigR9Y0RF3RBrulgn
kv:
enabled: true
backend: test
application-name: my
config:
import: "vault://"
server:
git:
uri: [깃허브 config 레포지터리 주소]
username: [깃허브 계정먕]
password: [깃허브에서 발급받은 토큰]
default-label: master
그런다음 크롬에서 localhost:8888/application/dev
를 해보면 아래와 같이 application-dev.yml 파일의 내용이 불러와 지는것을 볼 수 있다.
하지만 username과 password를 환경변수로 설정하고 vault 서버에서 설정한 값을 불러오니 username은 불러와지는데, password가 안불러와지는 문제가 발생했는데 이부분은 추후 확인해볼 필요가 있을 것 같다.